aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver/css/css_parser.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/libserver/css/css_parser.cxx')
-rw-r--r--src/libserver/css/css_parser.cxx33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/libserver/css/css_parser.cxx b/src/libserver/css/css_parser.cxx
index e4a8159f1..014ddf680 100644
--- a/src/libserver/css/css_parser.cxx
+++ b/src/libserver/css/css_parser.cxx
@@ -27,11 +27,11 @@ namespace rspamd::css {
const css_consumed_block css_parser_eof_block{};
auto css_consumed_block::attach_block(consumed_block_ptr &&block) -> bool {
- if (content.index() == 0) {
+ if (std::holds_alternative<std::monostate>(content)) {
/* Switch from monostate */
content = std::vector<consumed_block_ptr>();
}
- else if (content.index() == 2) {
+ else if (!std::holds_alternative<std::vector<consumed_block_ptr>>(content)) {
/* A single component, cannot attach a block ! */
return false;
}
@@ -42,6 +42,17 @@ auto css_consumed_block::attach_block(consumed_block_ptr &&block) -> bool {
return true;
}
+auto css_consumed_block::add_function_argument(consumed_block_ptr &&block) -> bool {
+ if (!std::holds_alternative<css_function_block>(content)) {
+ return false;
+ }
+
+ auto &&func_bloc = std::get<css_function_block>(content);
+ func_bloc.args.push_back(std::move(block));
+
+ return true;
+}
+
auto css_consumed_block::token_type_str(void) const -> const char *
{
const auto *ret = "";
@@ -106,6 +117,18 @@ auto css_consumed_block::debug_str(void) -> std::string {
/* Empty block */
ret += R"("empty")";
}
+ else if constexpr (std::is_same_v<T, css_function_block>) {
+ /* Empty block */
+ ret += R"({ "function:" {"name": )";
+ ret += "\"" + arg.function.debug_token_str() + "\"";
+ ret += R"("arguments:" [)";
+ for (const auto &block : arg.args) {
+ ret += "{";
+ ret += block->debug_str();
+ ret += "}, ";
+ }
+ ret += "]}";
+ }
else {
/* Single element block */
ret += "\"" + arg.debug_token_str() + "\"";
@@ -214,9 +237,13 @@ auto css_parser::function_consumer(std::unique_ptr<css_consumed_block> &top) ->
ret = true;
want_more = false;
break;
+ case css_parser_token::token_type::comma_token:
+ case css_parser_token::token_type::delim_token:
+ case css_parser_token::token_type::obrace_token:
+ break;
default:
/* Attach everything to the function block */
- top->attach_block(std::make_unique<css_consumed_block>(
+ top->add_function_argument(std::make_unique<css_consumed_block>(
css::css_consumed_block::parser_tag_type::css_function_arg,
std::move(next_token)));
break;