srctree

Robin Linden parent e2b6e3a1 d3895314
style: Create a new library for mapping css onto a dom tree

inlinesplit
.bazelrc added: 153, removed: 5, total 148
@@ -22,6 +22,7 @@ build:gnulike --cxxopt='-Wshadow'
build:gnulike --cxxopt='-Wsign-compare'
build:gnulike --cxxopt='-Wundef'
build:gnulike --cxxopt='-fno-common'
build:gnulike --cxxopt='-Wno-missing-field-initializers' # Common idiom for zeroing members.
build:gnulike --per_file_copt='http:get@-Wno-sign-compare' # asio leaks this into our code.
build:gnulike --per_file_copt='http:get@-Wno-undef' # asio leaks this into our code.
build:gnulike --per_file_copt='http:get@-Wno-shadow' # asio leaks this into our code.
 
filename was Deleted added: 153, removed: 5, total 148
@@ -0,0 +1,22 @@
load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
 
cc_library(
name = "style",
srcs = ["style.cpp"],
hdrs = ["style.h"],
visibility = ["//visibility:public"],
deps = [
"//css",
"//dom",
],
)
 
cc_test(
name = "style_test",
size = "small",
srcs = ["style_test.cpp"],
deps = [
":style",
"//etest",
],
)
 
filename was Deleted added: 153, removed: 5, total 148
@@ -0,0 +1,33 @@
#include "style/style.h"
 
#include <algorithm>
#include <iterator>
 
namespace style {
 
// TODO(robinlinden): This only matches simple names right now.
bool is_match(dom::Element const &element, std::string_view selector) {
if (element.name == selector) {
return true;
}
 
return false;
}
 
std::vector<std::pair<std::string, std::string>> matching_rules(
dom::Element const &element,
std::vector<css::Rule> const &stylesheet) {
std::vector<std::pair<std::string, std::string>> matched_rules;
 
for (auto const &rule : stylesheet) {
if (std::any_of(rule.selectors.cbegin(), rule.selectors.cend(),
[&](auto const &selector){ return is_match(element, selector); })) {
std::copy(rule.declarations.cbegin(), rule.declarations.cend(),
std::back_inserter(matched_rules));
}
}
 
return matched_rules;
}
 
} // namespace style
 
filename was Deleted added: 153, removed: 5, total 148
@@ -0,0 +1,22 @@
#ifndef STYLE_STYLE_H_
#define STYLE_STYLE_H_
 
#include "css/rule.h"
#include "dom/dom.h"
 
#include <string_view>
#include <string>
#include <utility>
#include <vector>
 
namespace style {
 
bool is_match(dom::Element const &element, std::string_view selector);
 
std::vector<std::pair<std::string, std::string>> matching_rules(
dom::Element const &element,
std::vector<css::Rule> const &stylesheet);
 
} // namespace style
 
#endif
 
filename was Deleted added: 153, removed: 5, total 148
@@ -0,0 +1,70 @@
#include "style/style.h"
 
#include "css/rule.h"
#include "etest/etest.h"
 
using namespace std::literals;
using etest::expect_true;
 
int main() {
etest::test("is_match: simple names", [] {
expect_true(style::is_match(dom::Element{"div"}, "div"sv));
expect_true(!style::is_match(dom::Element{"div"}, "span"sv));
});
 
etest::test("matching_rules: simple names", [] {
std::vector<css::Rule> stylesheet;
expect_true(style::matching_rules(dom::Element{"div"}, stylesheet).empty());
 
stylesheet.push_back(css::Rule{
.selectors = {"span", "p"},
.declarations = {
{"width", "80px"},
}
});
 
expect_true(style::matching_rules(dom::Element{"div"}, stylesheet).empty());
 
{
auto span_rules = style::matching_rules(dom::Element{"span"}, stylesheet);
expect_true(span_rules.size() == 1);
expect_true(span_rules.at(0) == std::pair{"width"s, "80px"s});
}
 
{
auto p_rules = style::matching_rules(dom::Element{"p"}, stylesheet);
expect_true(p_rules.size() == 1);
expect_true(p_rules.at(0) == std::pair{"width"s, "80px"s});
}
 
stylesheet.push_back(css::Rule{
.selectors = {"span", "hr"},
.declarations = {
{"height", "auto"},
}
});
 
expect_true(style::matching_rules(dom::Element{"div"}, stylesheet).empty());
 
{
auto span_rules = style::matching_rules(dom::Element{"span"}, stylesheet);
expect_true(span_rules.size() == 2);
expect_true(span_rules.at(0) == std::pair{"width"s, "80px"s});
expect_true(span_rules.at(1) == std::pair{"height"s, "auto"s});
}
 
{
auto p_rules = style::matching_rules(dom::Element{"p"}, stylesheet);
expect_true(p_rules.size() == 1);
expect_true(p_rules.at(0) == std::pair{"width"s, "80px"s});
}
 
{
auto hr_rules = style::matching_rules(dom::Element{"hr"}, stylesheet);
expect_true(hr_rules.size() == 1);
expect_true(hr_rules.at(0) == std::pair{"height"s, "auto"s});
}
});
 
return etest::run_all_tests();
}