#include "css_tokeniser.hxx"
#include "css_selector.hxx"
#include "css_rule.hxx"
+#include "css.hxx"
#include "fmt/core.h"
#include <vector>
return false;
}
+ style_object = std::make_unique<css_style_sheet>();
+
for (auto &&rule : rules) {
/*
* For now, we do not need any of the at rules, so we can safely ignore them
auto selectors_vec = process_selector_tokens(pool, selector_token_functor);
- auto decls_it = (*simple_block)->get_blocks_or_empty().cbegin();
- auto decls_end = (*simple_block)->get_blocks_or_empty().cend();
- auto declaration_token_functor = [&decls_it,&decls_end](void)
- -> const css_consumed_block & {
- for (;;) {
- if (decls_it == decls_end) {
- return css_parser_eof_block;
+ if (selectors_vec.size() > 0) {
+ msg_debug_css("processed %d selectors", (int)selectors_vec.size());
+ auto decls_it = (*simple_block)->get_blocks_or_empty().cbegin();
+ auto decls_end = (*simple_block)->get_blocks_or_empty().cend();
+ auto declaration_token_functor = [&decls_it, &decls_end](void)
+ -> const css_consumed_block & {
+ for (;;) {
+ if (decls_it == decls_end) {
+ return css_parser_eof_block;
+ }
+
+ const auto &ret = (*decls_it);
+
+ ++decls_it;
+
+ return *ret;
}
+ };
- const auto &ret = (*decls_it);
+ auto declarations_vec = process_declaration_tokens(pool,
+ declaration_token_functor);
- ++decls_it;
+ if (declarations_vec && !declarations_vec->get_rules().empty()) {
+ msg_debug_css("processed %d rules",
+ (int)declarations_vec->get_rules().size());
- return *ret;
}
- };
-
- auto declarations_vec = process_declaration_tokens(pool,
- declaration_token_functor);
+ }
}
}
}
*/
#include "css_rule.hxx"
+#include "css.hxx"
#include <limits>
namespace rspamd::css {
auto process_declaration_tokens(rspamd_mempool_t *pool,
const blocks_gen_functor &next_block_functor)
- -> css_declarations_block
+ -> css_declarations_block_ptr
{
- css_declarations_block ret;
+ css_declarations_block_ptr ret;
bool can_continue = true;
css_property cur_property{css_property_type::PROPERTY_NYI,
css_property_flag::FLAG_NORMAL};
} state = parse_property;
auto seen_not = false;
+ ret = std::make_shared<css_declarations_block>();
while (can_continue) {
const auto &next_tok = next_block_functor();
const auto &parser_tok = next_tok.get_token_or_empty();
if (parser_tok.type == css_parser_token::token_type::semicolon_token && cur_rule) {
- ret.add_rule(std::move(cur_rule));
+ ret->add_rule(std::move(cur_rule));
state = parse_property;
seen_not = false;
continue;
break;
case css_consumed_block::parser_tag_type::css_eof_block:
if (state == parse_value) {
- ret.add_rule(std::move(cur_rule));
+ ret->add_rule(std::move(cur_rule));
}
can_continue = false;
break;
robin_hood::unordered_flat_set<rule_shared_ptr, rule_shared_hash, rule_shared_eq> rules;
};
+using css_declarations_block_ptr = std::shared_ptr<css_declarations_block>;
+
auto process_declaration_tokens(rspamd_mempool_t *pool,
const blocks_gen_functor &next_token_functor)
- -> css_declarations_block;
+ -> css_declarations_block_ptr;
}