srctree

Robin Linden parent 46bdb16d 07e7fa02
css: Parse and store !important declarations

inlinesplit
css/parser.cpp added: 19, removed: 3, total 16
@@ -400,7 +400,12 @@ std::optional<css::Rule> Parser::parse_rule() {
}
 
auto [name, value] = *decl;
add_declaration(rule.declarations, name, util::trim(value));
if (value.ends_with("!important")) {
value.remove_suffix(std::strlen("!important"));
add_declaration(rule.important_declarations, name, util::trim(value));
} else {
add_declaration(rule.declarations, name, util::trim(value));
}
skip_whitespace_and_comments();
}
 
 
css/parser_test.cpp added: 19, removed: 3, total 16
@@ -120,6 +120,17 @@ int main() {
expect(body.declarations.at(css::PropertyId::Width) == "50px"s);
});
 
etest::test("parser: important rule", [] {
auto rules = css::parse("body { width: 50px !important; }"sv).rules;
require_eq(rules.size(), std::size_t{1});
 
auto body = rules[0];
expect_eq(body.selectors, std::vector{"body"s});
expect(body.declarations.empty());
expect_eq(body.important_declarations.size(), std::size_t{1});
expect_eq(body.important_declarations.at(css::PropertyId::Width), "50px"s);
});
 
etest::test("selector with spaces", [] {
auto rules = css::parse("p a { color: green; }").rules;
expect_eq(rules,