summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/model/Style.cpp (renamed from src/core/CSS.cpp)4
-rw-r--r--src/core/model/Style.hpp (renamed from src/core/CSS.hpp)8
-rw-r--r--src/plugins/css/CSSParser.cpp87
-rw-r--r--src/plugins/css/CSSParser.hpp24
4 files changed, 67 insertions, 56 deletions
diff --git a/src/core/CSS.cpp b/src/core/model/Style.cpp
index c42cf6c..b01b0c7 100644
--- a/src/core/CSS.cpp
+++ b/src/core/model/Style.cpp
@@ -16,9 +16,10 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "CSS.hpp"
+#include "Style.hpp"
namespace ousia {
+namespace model {
void RuleSet::merge(Rooted<RuleSet> other){
for(auto& o : other->rules){
@@ -140,3 +141,4 @@ std::vector<Rooted<SelectorNode>> SelectorNode::append(Handle<SelectorNode> node
return append(new SelectorEdge{this->getManager(), node});
}
}
+}
diff --git a/src/core/CSS.hpp b/src/core/model/Style.hpp
index 75ac73f..673f51e 100644
--- a/src/core/CSS.hpp
+++ b/src/core/model/Style.hpp
@@ -17,12 +17,12 @@
*/
/**
- * @file CSS.hpp
+ * @file Style.hpp
* @author Benjamin Paaßen (bpaassen@techfak.uni-bielefeld.de)
*/
-#ifndef _OUSIA_CSS_HPP_
-#define _OUSIA_CSS_HPP_
+#ifndef _OUSIA_STYLE_HPP_
+#define _OUSIA_STYLE_HPP_
#include <map>
#include <vector>
@@ -33,6 +33,7 @@
#include <core/model/Node.hpp>
namespace ousia {
+namespace model {
/*
* The Specificity or Precedence of a CSS RuleSet, which decides which
@@ -402,4 +403,5 @@ public:
void setAccepting(bool accepting) { this->accepting = accepting; }
};
}
+}
#endif
diff --git a/src/plugins/css/CSSParser.cpp b/src/plugins/css/CSSParser.cpp
index cf92d32..40179bf 100644
--- a/src/plugins/css/CSSParser.cpp
+++ b/src/plugins/css/CSSParser.cpp
@@ -79,12 +79,13 @@ Rooted<Node> CSSParser::doParse(CharReader &reader, ParserContext &ctx)
CodeTokenizer tokenizer{reader, CSS_ROOT, CSS_DESCRIPTORS};
tokenizer.ignoreComments = true;
tokenizer.ignoreLinebreaks = true;
- Rooted<SelectorNode> root = {new SelectorNode{ctx.getManager(), "root"}};
+ Rooted<model::SelectorNode> root = {
+ new model::SelectorNode{ctx.getManager(), "root"}};
parseDocument(root, tokenizer, ctx);
return root;
}
-void CSSParser::parseDocument(Rooted<SelectorNode> root,
+void CSSParser::parseDocument(Rooted<model::SelectorNode> root,
CodeTokenizer &tokenizer, ParserContext &ctx)
{
Token t;
@@ -92,11 +93,11 @@ void CSSParser::parseDocument(Rooted<SelectorNode> root,
return;
}
tokenizer.resetPeek();
- std::vector<Rooted<SelectorNode>> leafList;
+ std::vector<Rooted<model::SelectorNode>> leafList;
// parse the SelectorTree for this ruleSet.
parseSelectors(root, tokenizer, leafList, ctx);
// parse the RuleSet itself.
- Rooted<RuleSet> ruleSet = parseRuleSet(tokenizer, ctx);
+ Rooted<model::RuleSet> ruleSet = parseRuleSet(tokenizer, ctx);
for (auto &leaf : leafList) {
/*
* every leaf is an accepting node, if one considers the SelectorTree
@@ -113,14 +114,14 @@ void CSSParser::parseDocument(Rooted<SelectorNode> root,
parseDocument(root, tokenizer, ctx);
}
-void CSSParser::parseSelectors(Rooted<SelectorNode> root,
- CodeTokenizer &tokenizer,
- std::vector<Rooted<SelectorNode>> &leafList,
- ParserContext &ctx)
+void CSSParser::parseSelectors(
+ Rooted<model::SelectorNode> root, CodeTokenizer &tokenizer,
+ std::vector<Rooted<model::SelectorNode>> &leafList, ParserContext &ctx)
{
auto tuple = parseSelector(tokenizer, ctx);
// append the SelectorPath to the root node.
- std::vector<Rooted<SelectorNode>> unmergedLeafs = root->append(tuple.first);
+ std::vector<Rooted<model::SelectorNode>> unmergedLeafs =
+ root->append(tuple.first);
// append the leaf to the leafList.
switch (unmergedLeafs.size()) {
case 0:
@@ -146,10 +147,10 @@ void CSSParser::parseSelectors(Rooted<SelectorNode> root,
}
}
-std::pair<Rooted<SelectorNode>, Rooted<SelectorNode>> CSSParser::parseSelector(
- CodeTokenizer &tokenizer, ParserContext &ctx)
+std::pair<Rooted<model::SelectorNode>, Rooted<model::SelectorNode>>
+CSSParser::parseSelector(CodeTokenizer &tokenizer, ParserContext &ctx)
{
- Rooted<SelectorNode> s = parsePrimitiveSelector(tokenizer, ctx);
+ Rooted<model::SelectorNode> s = parsePrimitiveSelector(tokenizer, ctx);
Token t;
if (!tokenizer.peek(t)) {
// if we are at the end the found selector is the immediate child as
@@ -164,8 +165,8 @@ std::pair<Rooted<SelectorNode>, Rooted<SelectorNode>> CSSParser::parseSelector(
// so we parse the rest of the subsequent SelectorPath
auto tuple = parseSelector(tokenizer, ctx);
// then we establish the DESCENDANT relationship
- s->getEdges().push_back(
- new SelectorNode::SelectorEdge(ctx.getManager(), tuple.first));
+ s->getEdges().push_back(new model::SelectorNode::SelectorEdge(
+ ctx.getManager(), tuple.first));
// and we return this node as well as the leaf.
return std::make_pair(s, tuple.second);
}
@@ -176,9 +177,9 @@ std::pair<Rooted<SelectorNode>, Rooted<SelectorNode>> CSSParser::parseSelector(
// so we parse the rest of the subsequent SelectorPath
auto tuple = parseSelector(tokenizer, ctx);
// then we establish the DESCENDANT relationship
- s->getEdges().push_back(new SelectorNode::SelectorEdge(
+ s->getEdges().push_back(new model::SelectorNode::SelectorEdge(
ctx.getManager(), tuple.first,
- SelectionOperator::DIRECT_DESCENDANT));
+ model::SelectionOperator::DIRECT_DESCENDANT));
// and we return this node as well as the leaf.
return std::make_pair(s, tuple.second);
}
@@ -189,8 +190,8 @@ std::pair<Rooted<SelectorNode>, Rooted<SelectorNode>> CSSParser::parseSelector(
}
}
-Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
- ParserContext &ctx)
+Rooted<model::SelectorNode> CSSParser::parsePrimitiveSelector(
+ CodeTokenizer &tokenizer, ParserContext &ctx)
{
// first and foremost we expect a class name.
Token t;
@@ -198,7 +199,8 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
const std::string name = t.content;
if (!tokenizer.peek(t)) {
// if we are at the end, we just return this selector with its name.
- Rooted<SelectorNode> n{new SelectorNode(ctx.getManager(), name)};
+ Rooted<model::SelectorNode> n{
+ new model::SelectorNode(ctx.getManager(), name)};
return n;
}
@@ -218,8 +220,9 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
// look for additional arguments.
if (!expect(PAREN_OPEN, tokenizer, t, false, ctx)) {
// if we don't have any, we return here.
- Rooted<SelectorNode> n{new SelectorNode(
- ctx.getManager(), name, {pseudo_select_name, isGenerative})};
+ Rooted<model::SelectorNode> n{
+ new model::SelectorNode(ctx.getManager(), name,
+ {pseudo_select_name, isGenerative})};
return n;
}
// parse the argument list.
@@ -227,18 +230,19 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
// we require at least one argument, if parantheses are used
// XXX
args.push_back(VariantReader::parseGeneric(tokenizer.getInput(),
- ctx.getLogger(),
- {',', ')'}).second);
+ ctx.getLogger(),
+ {',', ')'}).second);
while (expect(COMMA, tokenizer, t, false, ctx)) {
// as long as we find commas we expect new arguments.
- args.push_back(
- VariantReader::parseGeneric(
- tokenizer.getInput(), ctx.getLogger(), {',', ')'}).second);
+ args.push_back(VariantReader::parseGeneric(tokenizer.getInput(),
+ ctx.getLogger(),
+ {',', ')'}).second);
}
expect(PAREN_CLOSE, tokenizer, t, true, ctx);
// and we return with the finished Selector.
- Rooted<SelectorNode> n{new SelectorNode(
- ctx.getManager(), name, {pseudo_select_name, args, isGenerative})};
+ Rooted<model::SelectorNode> n{
+ new model::SelectorNode(ctx.getManager(), name,
+ {pseudo_select_name, args, isGenerative})};
return n;
}
case HASH: {
@@ -249,8 +253,8 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
expect(TOKEN_TEXT, tokenizer, t, true, ctx);
Variant::arrayType args{Variant(t.content.c_str())};
// and we return the finished Selector
- Rooted<SelectorNode> n{
- new SelectorNode(ctx.getManager(), name, {"has_id", args, false})};
+ Rooted<model::SelectorNode> n{new model::SelectorNode(
+ ctx.getManager(), name, {"has_id", args, false})};
return n;
}
case BRACKET_OPEN: {
@@ -269,7 +273,7 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
// we expect a closing bracket.
expect(BRACKET_CLOSE, tokenizer, t, true, ctx);
// and then we can return the result.
- Rooted<SelectorNode> n{new SelectorNode(
+ Rooted<model::SelectorNode> n{new model::SelectorNode(
ctx.getManager(), name, {"has_attribute", args, false})};
return n;
} else {
@@ -280,7 +284,7 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
// then we expect a closing bracket.
expect(BRACKET_CLOSE, tokenizer, t, true, ctx);
// and then we can return the result.
- Rooted<SelectorNode> n{new SelectorNode(
+ Rooted<model::SelectorNode> n{new model::SelectorNode(
ctx.getManager(), name, {"has_value", args, false})};
return n;
}
@@ -288,15 +292,16 @@ Rooted<SelectorNode> CSSParser::parsePrimitiveSelector(CodeTokenizer &tokenizer,
default:
// everything else is not part of the Selector anymore.
tokenizer.resetPeek();
- Rooted<SelectorNode> n{new SelectorNode(ctx.getManager(), name)};
+ Rooted<model::SelectorNode> n{
+ new model::SelectorNode(ctx.getManager(), name)};
return n;
}
}
-Rooted<RuleSet> CSSParser::parseRuleSet(CodeTokenizer &tokenizer,
- ParserContext &ctx)
+Rooted<model::RuleSet> CSSParser::parseRuleSet(CodeTokenizer &tokenizer,
+ ParserContext &ctx)
{
- Rooted<RuleSet> ruleSet{new RuleSet(ctx.getManager())};
+ Rooted<model::RuleSet> ruleSet{new model::RuleSet(ctx.getManager())};
// if we have no ruleset content, we return an empty ruleset.
Token t;
if (!expect(CURLY_OPEN, tokenizer, t, false, ctx)) {
@@ -309,8 +314,8 @@ Rooted<RuleSet> CSSParser::parseRuleSet(CodeTokenizer &tokenizer,
return ruleSet;
}
-void CSSParser::parseRules(CodeTokenizer &tokenizer, Rooted<RuleSet> ruleSet,
- ParserContext &ctx)
+void CSSParser::parseRules(CodeTokenizer &tokenizer,
+ Rooted<model::RuleSet> ruleSet, ParserContext &ctx)
{
std::string key;
Variant value;
@@ -333,7 +338,7 @@ bool CSSParser::parseRule(CodeTokenizer &tokenizer, ParserContext &ctx,
// then the value
// TODO: Resolve key for appropriate parsing function here.
value = VariantReader::parseGeneric(tokenizer.getInput(), ctx.getLogger(),
- {';'}).second;
+ {';'}).second;
// and a ;
expect(SEMICOLON, tokenizer, t, true, ctx);
return true;
@@ -347,10 +352,10 @@ bool CSSParser::expect(int expectedType, CodeTokenizer &tokenizer, Token &t,
if (force) {
if (end) {
throw LoggableException{"Unexpected end of file!",
- tokenizer.getInput()};
+ tokenizer.getInput()};
} else {
throw LoggableException{"Unexpected token!",
- tokenizer.getInput()};
+ tokenizer.getInput()};
}
} else {
tokenizer.resetPeek();
diff --git a/src/plugins/css/CSSParser.hpp b/src/plugins/css/CSSParser.hpp
index c6594f6..2f37e6a 100644
--- a/src/plugins/css/CSSParser.hpp
+++ b/src/plugins/css/CSSParser.hpp
@@ -32,8 +32,8 @@
#include <utility>
#include <core/CodeTokenizer.hpp>
-#include <core/CSS.hpp>
#include <core/common/CharReader.hpp>
+#include <core/model/Style.hpp>
#include <core/parser/Parser.hpp>
namespace ousia {
@@ -71,42 +71,44 @@ private:
/**
* Implements the DOC Nonterminal
*/
- void parseDocument(Rooted<SelectorNode> root, CodeTokenizer &tokenizer,
- ParserContext &ctx);
+ void parseDocument(Rooted<model::SelectorNode> root,
+ CodeTokenizer &tokenizer, ParserContext &ctx);
/**
* Implements the SELECTORS Nonterminal and adds all leaf nodes of the
* resulting SelectorTree to the input leafList so that a parsed RuleSet can
* be inserted there.
*/
- void parseSelectors(Rooted<SelectorNode> root, CodeTokenizer &tokenizer,
- std::vector<Rooted<SelectorNode>> &leafList,
+ void parseSelectors(Rooted<model::SelectorNode> root,
+ CodeTokenizer &tokenizer,
+ std::vector<Rooted<model::SelectorNode>> &leafList,
ParserContext &ctx);
/**
* Implements the SELECT Nonterminal, which in effect parses a SelectorPath
* of the SelectorTree and returns the beginning node of the path as first
* element as well as the leaf of the path as second tuple element.
*/
- std::pair<Rooted<SelectorNode>, Rooted<SelectorNode>> parseSelector(
- CodeTokenizer &tokenizer, ParserContext &ctx);
+ std::pair<Rooted<model::SelectorNode>, Rooted<model::SelectorNode>>
+ parseSelector(CodeTokenizer &tokenizer, ParserContext &ctx);
/**
* Implements the SELECT' Nonterminal, which parses a single Selector with
* its PseudoSelector and returns it.
*/
- Rooted<SelectorNode> parsePrimitiveSelector(CodeTokenizer &tokenizer,
- ParserContext &ctx);
+ Rooted<model::SelectorNode> parsePrimitiveSelector(CodeTokenizer &tokenizer,
+ ParserContext &ctx);
/**
* Implements the RULESET Nonterminal, which parses an entire RuleSet. Note
* that we do not require RuleSets to be parsed. It is permitted to just
* insert Selector expressions.
*/
- Rooted<RuleSet> parseRuleSet(CodeTokenizer &tokenizer, ParserContext &ctx);
+ Rooted<model::RuleSet> parseRuleSet(CodeTokenizer &tokenizer,
+ ParserContext &ctx);
/**
* Implements the RULES Nonterminal, which parses CSSRules inside a RuleSet.
*/
- void parseRules(CodeTokenizer &tokenizer, Rooted<RuleSet> ruleSet,
+ void parseRules(CodeTokenizer &tokenizer, Rooted<model::RuleSet> ruleSet,
ParserContext &ctx);
/**