summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/BufferedCharReader.cpp2
-rw-r--r--src/core/CSS.hpp18
-rw-r--r--src/core/CodeTokenizer.cpp26
-rw-r--r--src/core/CodeTokenizer.hpp4
4 files changed, 33 insertions, 17 deletions
diff --git a/src/core/BufferedCharReader.cpp b/src/core/BufferedCharReader.cpp
index 23c219a..f3792ec 100644
--- a/src/core/BufferedCharReader.cpp
+++ b/src/core/BufferedCharReader.cpp
@@ -147,7 +147,7 @@ bool BufferedCharReader::readCharacterAtCursor(ReadCursor &cursor, char *c)
// If data has been read, append it to the input buffer and try
// again
if (cnt > 0) {
- buffer.emplace_back(buf.data());
+ buffer.emplace_back(std::string(buf.data(), cnt));
continue;
}
diff --git a/src/core/CSS.hpp b/src/core/CSS.hpp
index 3b4289a..4cf15be 100644
--- a/src/core/CSS.hpp
+++ b/src/core/CSS.hpp
@@ -70,17 +70,24 @@ struct Specificity {
*/
class RuleSet : public Managed {
private:
- const std::map<std::string, variant::Variant> values;
+ std::map<std::string, variant::Variant> rules;
public:
/**
* Initializes an empty RuleSet.
*/
- RuleSet(Manager &mgr) : Managed(mgr), values() {}
+ RuleSet(Manager &mgr) : Managed(mgr), rules() {}
- const std::map<std::string, variant::Variant> &getValues() const
+ std::map<std::string, variant::Variant> &getRules() { return rules; }
+
+ const std::map<std::string, variant::Variant> &getRules() const
{
- return values;
+ return rules;
+ }
+
+ void merge(Rooted<RuleSet> other)
+ {
+ rules.insert(other->rules.begin(), other->rules.end());
}
};
@@ -244,7 +251,7 @@ private:
const PseudoSelector pseudoSelector;
ManagedVector<SelectorEdge> edges;
Owned<RuleSet> ruleSet;
- bool accepting;
+ bool accepting = false;
/**
* This is an internal method all getChildren variants refer to.
@@ -254,7 +261,6 @@ private:
const PseudoSelector *select);
public:
-
/**
* This initializes an empty SelectorNode with the given name and the
* given PseudoSelector.
diff --git a/src/core/CodeTokenizer.cpp b/src/core/CodeTokenizer.cpp
index ce4afe5..e9c1bbf 100644
--- a/src/core/CodeTokenizer.cpp
+++ b/src/core/CodeTokenizer.cpp
@@ -59,10 +59,14 @@ bool CodeTokenizer::doPrepare(const Token &t, std::deque<Token> &peeked)
state = CodeTokenizerState::IN_LINE_COMMENT;
break;
case CodeTokenMode::LINEBREAK:
- peeked.push_back({it->second.id, t.content, t.startColumn,
- t.startLine, t.endColumn, t.endLine});
- return true;
+ if (!ignoreLinebreaks) {
+ peeked.push_back({it->second.id, t.content,
+ t.startColumn, t.startLine,
+ t.endColumn, t.endLine});
+ }
+ return !ignoreLinebreaks;
default:
+ bool empty = true;
if (t.tokenId == TOKEN_TEXT) {
int begin = -1;
for (size_t c = 0; c < t.content.length(); c++) {
@@ -86,20 +90,22 @@ bool CodeTokenizer::doPrepare(const Token &t, std::deque<Token> &peeked)
t.startColumn + begin, t.startLine,
t.startColumn + (int)c, t.endLine});
begin = -1;
+ empty = false;
}
}
}
- if(begin >= 0){
- peeked.push_back(Token{
- TOKEN_TEXT,
- t.content.substr(begin),
- t.startColumn + begin, t.startLine,
- t.endColumn, t.endLine});
+ if (begin >= 0) {
+ peeked.push_back(
+ Token{TOKEN_TEXT, t.content.substr(begin),
+ t.startColumn + begin, t.startLine,
+ t.endColumn, t.endLine});
+ empty = false;
}
} else {
+ empty = false;
peeked.push_back(t);
}
- return true;
+ return !empty;
}
startToken = t;
returnTokenId = it->second.id;
diff --git a/src/core/CodeTokenizer.hpp b/src/core/CodeTokenizer.hpp
index 247918e..43c7abb 100644
--- a/src/core/CodeTokenizer.hpp
+++ b/src/core/CodeTokenizer.hpp
@@ -101,6 +101,10 @@ public:
* true.
*/
bool ignoreComments = false;
+ /**
+ * If you do not want linebreaks to be returned you can set this to true.
+ */
+ bool ignoreLinebreaks = false;
/**
*