summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/CSS.hpp5
-rw-r--r--src/plugins/css/CSSParser.cpp9
-rw-r--r--test/plugins/css/CSSParserTest.cpp8
3 files changed, 21 insertions, 1 deletions
diff --git a/src/core/CSS.hpp b/src/core/CSS.hpp
index 1c0ed17..1f5fedc 100644
--- a/src/core/CSS.hpp
+++ b/src/core/CSS.hpp
@@ -251,6 +251,7 @@ private:
ManagedVector<SelectorEdge> edges;
// TODO: This is temporarily commented out until the TypeSystem works.
// Owned<RuleSet> ruleSets;
+ bool accepting;
/**
* This is an internal method all getChildren variants refer to.
@@ -386,6 +387,10 @@ public:
* automatically using the DESCENDANT SelectionOperator.
*/
std::vector<Rooted<SelectorNode>> append(Rooted<SelectorNode> node);
+
+ bool isAccepting() { return accepting; }
+
+ void setAccepting(bool accepting) { this->accepting = accepting; }
};
}
#endif
diff --git a/src/plugins/css/CSSParser.cpp b/src/plugins/css/CSSParser.cpp
index d239359..00b5af5 100644
--- a/src/plugins/css/CSSParser.cpp
+++ b/src/plugins/css/CSSParser.cpp
@@ -99,6 +99,15 @@ void CSSParser::parseDocument(Rooted<SelectorNode> root,
std::vector<Rooted<SelectorNode>> leafList;
parseSelectors(root, tokenizer, leafList, ctx);
// TODO: Parse Ruleset
+ for (auto &leaf : leafList) {
+ /* every leaf is an accepting node, if one considers the SelectorTree
+ * to be a finite state machine. This is relevant, if users do not use
+ * the CSS Parser to parse actual Ruleset content but to construct a
+ * SelectorTree just to identify a part of the DocumentTree.
+ */
+ leaf->setAccepting(true);
+ //TODO: append RuleSets
+ }
parseDocument(root, tokenizer, ctx);
}
diff --git a/test/plugins/css/CSSParserTest.cpp b/test/plugins/css/CSSParserTest.cpp
index 84d4893..20d0836 100644
--- a/test/plugins/css/CSSParserTest.cpp
+++ b/test/plugins/css/CSSParserTest.cpp
@@ -24,7 +24,7 @@
namespace ousia {
namespace parser {
-namespace css {
+namespace css {
TEST(CSSParser, testParseSelectors)
{
// create a string describing a SelectorTree as input.
@@ -58,6 +58,7 @@ TEST(CSSParser, testParseSelectors)
ASSERT_EQ(select, A->getPseudoSelector());
}
ASSERT_EQ(2, A->getEdges().size());
+ ASSERT_FALSE(A->isAccepting());
{
// assert A > B
std::vector<Rooted<SelectorNode>> Achildren =
@@ -70,6 +71,7 @@ TEST(CSSParser, testParseSelectors)
ASSERT_EQ(select, B->getPseudoSelector());
}
ASSERT_EQ(0, B->getEdges().size());
+ ASSERT_TRUE(B->isAccepting());
// assert A B:r
Achildren = A->getChildren(SelectionOperator::DESCENDANT, "B");
ASSERT_EQ(1, Achildren.size());
@@ -80,6 +82,7 @@ TEST(CSSParser, testParseSelectors)
ASSERT_EQ(select, Br->getPseudoSelector());
}
ASSERT_EQ(0, Br->getEdges().size());
+ ASSERT_TRUE(Br->isAccepting());
}
// assert C#a
children = root->getChildren("C");
@@ -91,6 +94,7 @@ TEST(CSSParser, testParseSelectors)
ASSERT_EQ(select, C->getPseudoSelector());
}
ASSERT_EQ(1, C->getEdges().size());
+ ASSERT_FALSE(C->isAccepting());
{
// assert C#a A[bla=\"blub\"]
std::vector<Rooted<SelectorNode>> Cchildren =
@@ -103,6 +107,7 @@ TEST(CSSParser, testParseSelectors)
ASSERT_EQ(select, A->getPseudoSelector());
}
ASSERT_EQ(0, A->getEdges().size());
+ ASSERT_TRUE(A->isAccepting());
}
// assert A::g(4,2,3)
children = root->getChildren("A");
@@ -114,6 +119,7 @@ TEST(CSSParser, testParseSelectors)
ASSERT_EQ(select, Ag->getPseudoSelector());
}
ASSERT_EQ(0, Ag->getEdges().size());
+ ASSERT_TRUE(Ag->isAccepting());
}
}
}