7#include "../utility/utility.hpp"
8#include "../macros.hpp"
38hi_export_module(hikogui.theme.theme_path);
40hi_export
namespace hi {
48 bool is_direct_parent =
false;
70 if (lhs.name != rhs.name) {
73 if (lhs.id != rhs.id) {
77 if (lhs.classes.
size() != rhs.classes.
size()) {
81 return lhs.is_direct_parent == rhs.is_direct_parent;
146template<std::input_iterator ItIn, std::sentinel_for<ItIn> ItEnd, std::output_iterator<theme_selector_element> ItOut>
147constexpr void parse_theme_selector(
ItIn first, ItEnd last,
ItOut out)
noexcept
149 enum class state_type { name,
_class, id,
pseudo, space };
151 auto state = state_type::name;
152 auto r = theme_selector_element{};
160 if (state == state_type::name) {
161 r.name = std::exchange(
buffer, {});
162 }
else if (state == state_type::id) {
163 r.id = std::exchange(
buffer, {});
164 }
else if (state == state_type::_class) {
165 r.add_class(std::exchange(
buffer, {}));
166 }
else if (state == state_type::pseudo) {
167 r.add_pseudo(std::exchange(
buffer, {}));
173 for (
auto it = first;
it != last; ++
it) {
174 if (*
it ==
' ' or *
it ==
'\t') {
176 state = state_type::space;
178 }
else if (*
it ==
'>') {
180 state = state_type::space;
181 r.is_direct_parent =
true;
184 if (state == state_type::space) {
186 *out++ = std::exchange(r, {});
188 state = state_type::name;
194 state = state_type::_class;
196 }
else if (*
it ==
':') {
198 state = state_type::pseudo;
200 }
else if (*
it ==
'#') {
202 state = state_type::id;
204 }
else if (*
it ==
'*') {
205 state = state_type::name;
219[[
nodiscard]]
constexpr theme_selector parse_theme_selector(std::string_view str)
noexcept
221 auto r = theme_selector{};
230struct std::formatter<
hi::theme_selector_element, char> : std::formatter<std::string, char> {
235 if (not t.name.
empty()) {
239 if (not t.id.
empty()) {
244 for (
auto const& class_ : t.classes) {
249 for (
auto const& pseudo : t.pseudos) {
258 if (t.is_direct_parent) {
262 return std::formatter<std::string, char>::format(
std::move(r), fc);
267struct std::formatter<
hi::theme_selector, char> : std::formatter<std::string, char> {
272 for (
auto const& element : t) {
276 r += std::format(
"{}", element);
279 return std::formatter<std::string, char>::format(
std::move(r), fc);
DOXYGEN BUG.
Definition algorithm_misc.hpp:20
The HikoGUI namespace.
Definition recursive_iterator.hpp:15
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:378
Definition theme_selector.hpp:43
Definition theme_selector.hpp:107
T back_inserter(T... args)