]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Project] Css: Start stylesheet implementation
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 18 Mar 2021 22:57:23 +0000 (22:57 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 18 Mar 2021 22:57:23 +0000 (22:57 +0000)
src/libserver/css/css.hxx
src/libserver/css/css_parser.cxx
src/libserver/css/css_parser.hxx
src/libserver/css/css_rule.cxx
src/libserver/css/css_rule.hxx
src/libserver/css/css_selector.cxx

index 1a511dcfddd45e06666e24abd69c67b207977a69..9ed323ec34252d08749947ce1691be6324504ca3 100644 (file)
@@ -22,6 +22,8 @@
 #include <memory>
 #include "logger.h"
 #include "css.h"
+#include "css_rule.hxx"
+#include "css_selector.hxx"
 
 namespace rspamd::css {
 
index f6029739a3ecdcb2873d893e6e199222521c3d6e..415039e19c7a6ebae28b03e91ab17e9ded76ad61 100644 (file)
@@ -18,6 +18,7 @@
 #include "css_tokeniser.hxx"
 #include "css_selector.hxx"
 #include "css_rule.hxx"
+#include "css.hxx"
 #include "fmt/core.h"
 
 #include <vector>
@@ -558,6 +559,8 @@ bool css_parser::consume_input(const std::string_view &sv)
                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
@@ -598,25 +601,34 @@ bool css_parser::consume_input(const std::string_view &sv)
 
                                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);
+                               }
                        }
                }
        }
index 4dbcd9f682882b656827f0d18191a1d297890ddc..be788ea81bdaff0a63ee4078a76f77ca1cd18b6a 100644 (file)
@@ -25,7 +25,6 @@
 #include <string>
 
 #include "css_tokeniser.hxx"
-#include "css.hxx"
 #include "parse_error.hxx"
 #include "contrib/expected/expected.hpp"
 #include "logger.h"
index d16be2276d92f9a2609b155afcd097cedae8c660..bd589da95bd271f2f662ad3e8aafdc08c06a438c 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "css_rule.hxx"
+#include "css.hxx"
 #include <limits>
 
 namespace rspamd::css {
@@ -169,9 +170,9 @@ allowed_property_value(const css_property &prop, const css_consumed_block &parse
 
 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};
@@ -186,6 +187,7 @@ auto process_declaration_tokens(rspamd_mempool_t *pool,
        } state = parse_property;
 
        auto seen_not = false;
+       ret = std::make_shared<css_declarations_block>();
 
        while (can_continue) {
                const auto &next_tok = next_block_functor();
@@ -230,7 +232,7 @@ auto process_declaration_tokens(rspamd_mempool_t *pool,
                                        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;
@@ -298,7 +300,7 @@ auto process_declaration_tokens(rspamd_mempool_t *pool,
                        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;
index dbd4fb1c735562ebfd2950081c293fb354e0e6fd..05c3fd82daefad2e3831f7e9e13fe752e760d0d2 100644 (file)
@@ -94,9 +94,11 @@ private:
        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;
 
 }
 
index 48914dc1e8fc5b4fea8cbb8644cc5eca57db9e5d..d4b578a08aecbc43eebc38c7484441900ad70abf 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include "css_selector.hxx"
+#include "css.hxx"
 #include "fmt/core.h"
 #define DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
 #include "doctest/doctest.h"