3 #include <wordring/wwwc/css_syntax/input_stream.hpp>
4 #include <wordring/wwwc/css_syntax/tokenization.hpp>
6 #include <wordring/wwwc/css_defs.hpp>
8 #include <wordring/compatibility.hpp>
9 #include <wordring/whatwg/infra/infra.hpp>
15 #include <type_traits>
46 using container = std::vector<syntax_primitive>;
47 using const_iterator =
typename container::const_iterator;
59 if (!(0 <= m_i && m_i <
static_cast<std::int32_t
>(m_v.size())))
return m_v.back();
65 assert(m_i <
int(m_v.size()) - 1);
72 return current_input_token();
92 template <
typename Syntax,
typename ErrorHandler>
95 template <
typename ErrorHandler>
112 template <
typename ErrorHandler = std::
nullptr_t>
113 inline std::vector<syntax_primitive>
116 return std::move(in);
139 template <
typename ErrorHandler = std::
nullptr_t>
142 std::vector<syntax_primitive> out;
145 tokenize(in.begin(), in.end(), std::back_inserter(out), handler);
189 template <
typename Syntax,
typename ErrorHandler = std::
nullptr_t>
194 return Syntax::consume(s, ctx);
197 template <
typename Syntax>
198 inline Syntax
parse_grammar(std::vector<syntax_primitive>&& in, parse_context& ctx)
201 return parse_grammar<Syntax>(s, ctx,
nullptr);
204 template <
typename Syntax>
205 inline Syntax
parse_grammar(std::u32string&& in, parse_context& ctx)
208 return parse_grammar<Syntax>(s, ctx,
nullptr);
251 template <
typename Syntax,
typename ErrorHandler>
254 std::vector<Syntax> result;
257 auto it1 = v.begin();
261 std::vector<syntax_primitive> tmp;
262 std::swap(*it1++, tmp);
264 result.emplace_back(parse_grammar<Syntax>(s, ctx, handler));
270 template <
typename Syntax>
271 inline std::vector<Syntax>
parse_comma_list(std::vector<syntax_primitive>&& in, parse_context& ctx)
274 return parse_comma_list<Syntax>(s, ctx,
nullptr);
277 template <
typename Syntax>
278 inline std::vector<Syntax>
parse_comma_list(std::u32string&& in, parse_context& ctx)
281 return parse_comma_list<Syntax>(s, ctx,
nullptr);
315 template <
typename ErrorHandler>
322 inline std::vector<syntax_primitive>
parse_stylesheet(std::vector<syntax_primitive>&& in)
341 inline std::vector<syntax_primitive>
342 parse_stylesheet(std::string
const& in, encoding_name fallback =
static_cast<encoding_name
>(0))
345 decode(in.begin(), in.end(), std::back_inserter(buf), fallback);
381 template <
typename ErrorHandler>
388 inline std::vector<syntax_primitive>
parse_list_of_rules(std::vector<syntax_primitive>&& in)
431 template <
typename ErrorHandler>
445 if (!q)
return std::optional<syntax_primitive>();
446 rule = std::move(*q);
452 return std::make_optional<syntax_primitive>(std::move(rule));
455 return std::optional<syntax_primitive>();
458 inline std::optional<syntax_primitive>
parse_rule(std::vector<syntax_primitive>&& in)
464 inline std::optional<syntax_primitive>
parse_rule(std::u32string&& in)
501 template <
typename ErrorHandler>
508 if (decl)
return decl;
510 return std::optional<declaration>();
513 inline std::optional<declaration>
parse_declaration(std::vector<syntax_primitive>&& in)
556 template <
typename ErrorHandler>
605 template <
typename ErrorHandler>
608 using result_type = std::optional<component_value>;
618 return result_type();
664 template <
typename ErrorHandler>
667 std::vector<syntax_primitive> list;
722 template <
typename ErrorHandler>
723 inline std::vector<std::vector<syntax_primitive>>
726 std::vector<std::vector<syntax_primitive>> lists;
730 std::vector<syntax_primitive> v;
737 lists.push_back(std::move(v));
740 lists.push_back(std::move(v));
759 inline std::vector<std::vector<syntax_primitive>>
774 inline std::vector<std::vector<syntax_primitive>>
788 template <
typename ErrorHandler>
789 inline std::vector<syntax_primitive>
consume_list_of_rules(token_stream& in,
bool top_level =
false, ErrorHandler handler =
nullptr);
791 template <
typename ErrorHandler>
792 inline at_rule
consume_at_rule(token_stream& in, ErrorHandler handler);
794 template <
typename ErrorHandler>
797 template <
typename ErrorHandler>
800 template <
typename ErrorHandler>
801 inline std::optional<declaration>
consume_declaration(token_stream& in, ErrorHandler handler);
803 template <
typename ErrorHandler>
804 inline component_value consume_component_value(token_stream& in, ErrorHandler handler);
806 template <
typename ErrorHandler>
807 inline simple_block consume_simple_block(token_stream& in, ErrorHandler handler);
809 template <
typename ErrorHandler>
810 inline function consume_function(token_stream& in, ErrorHandler handler);
832 template <
typename ErrorHandler>
833 inline std::vector<syntax_primitive>
837 std::vector<syntax_primitive> rules;
859 if (rule.has_value()) rules.push_back(std::move(*rule));
868 if (rule.has_value()) rules.push_back(std::move(*rule));
899 template <
typename ErrorHandler>
916 if constexpr (std::is_invocable_v<ErrorHandler, token_stream&>) handler(in);
919 rule.m_block = std::make_unique<simple_block>(consume_simple_block(in, handler));
924 rule.m_block = std::make_unique<simple_block>(tkn.get<
simple_block>());
929 rule.m_prelude.push_back(consume_component_value(in, handler));
958 template <
typename ErrorHandler>
969 if constexpr (std::is_invocable_v<ErrorHandler, token_stream&>) handler(in);
970 return std::optional<qualified_rule>();
972 rule.m_block = consume_simple_block(in, handler);
973 return std::make_optional(std::move(rule));
978 return std::make_optional(std::move(rule));
982 rule.m_prelude.push_back(consume_component_value(in, handler));
987 return std::optional<qualified_rule>();
1017 template <
typename ErrorHandler>
1020 std::vector<syntax_primitive> declarations;
1031 return declarations;
1038 std::vector<syntax_primitive> tmp(1, tkn);
1047 tmp.push_back(consume_component_value(in, handler));
1052 if (decl.has_value()) declarations.push_back(std::move(*decl));
1057 if constexpr (std::is_invocable_v<ErrorHandler, token_stream&>) handler(in);
1066 consume_component_value(in, handler);
1073 return std::vector<syntax_primitive>();
1093 std::u32string_view
const sv = U
"important";
1095 std::uint32_t st = 0;
1096 for (std::uint32_t i = v.size() - 1; 0 <= i; --i)
1107 if (is_ascii_case_insensitive_match(tkn.
m_value.begin(), tkn.
m_value.end(), sv.begin(), sv.end()))
1118 v.erase(std::next(v.begin(), i), v.end());
1143 template <
typename ErrorHandler>
1149 decl.m_name = in.current_input_token().get<
ident_token>().m_value;
1155 if constexpr (std::is_invocable_v<ErrorHandler, token_stream&>) handler(in);
1156 return std::optional<declaration>();
1165 decl.m_value.push_back(consume_component_value(in, handler));
1168 std::vector<component_value>& v = decl.m_value;
1171 decl.m_important_flag =
true;
1176 return std::make_optional(std::move(decl));
1186 template <
typename ErrorHandler>
1187 inline component_value consume_component_value(token_stream& in, ErrorHandler handler)
1191 syntax_primitive
const& tkn = in.current_input_token();
1197 return component_value(consume_simple_block(in, handler));
1199 return component_value(consume_function(in, handler));
1204 return component_value(tkn);
1214 template <
typename ErrorHandler>
1215 inline simple_block consume_simple_block(token_stream& in, ErrorHandler handler)
1221 switch (in.current_input_token().type())
1224 block.m_associated_token = U
'{';
1228 block.m_associated_token = U
'[';
1232 block.m_associated_token = U
'(';
1241 syntax_primitive
const& tkn = in.consume();
1247 if (ending == tkn.type())
return block;
1249 if constexpr (std::is_invocable_v<ErrorHandler, token_stream&>) handler(in);
1256 block.m_value.push_back(consume_component_value(in, handler));
1260 return simple_block();
1270 template <
typename ErrorHandler>
1271 inline function consume_function(token_stream& in, ErrorHandler handler)
1275 function fn{ in.current_input_token().get<function_token>().m_value };
1279 syntax_primitive
const& tkn = in.consume();
1285 if constexpr (std::is_invocable_v<ErrorHandler, token_stream&>) handler(in);
1289 fn.m_value.push_back(consume_component_value(in, handler));