aboutsummaryrefslogtreecommitdiff
path: root/libraries/qdcss/src/qdcss.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/qdcss/src/qdcss.cpp')
-rw-r--r--libraries/qdcss/src/qdcss.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/libraries/qdcss/src/qdcss.cpp b/libraries/qdcss/src/qdcss.cpp
new file mode 100644
index 00000000..c531fb63
--- /dev/null
+++ b/libraries/qdcss/src/qdcss.cpp
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: 2023 kumquat-ir 66188216+kumquat-ir@users.noreply.github.com
+//
+// SPDX-License-Identifier: LGPL-3.0-only
+
+#include "qdcss.h"
+
+#include <QRegularExpression>
+#include <QRegularExpressionMatch>
+#include <QRegularExpressionMatchIterator>
+
+QRegularExpression ruleset_re = QRegularExpression(R"([#.]?(@?\w+?)\s*\{(.*?)\})", QRegularExpression::DotMatchesEverythingOption);
+QRegularExpression rule_re = QRegularExpression(R"((\S+?)\s*:\s*(?:\"(.*?)(?<!\\)\"|'(.*?)(?<!\\)'|(\S+?))\s*(?:;|$))");
+
+QDCSS::QDCSS(QString s)
+{
+ // not much error handling over here...
+ // the original java code used indeces returned by the matcher for them, but QRE does not expose those
+ QRegularExpressionMatchIterator ruleset_i = ruleset_re.globalMatch(s);
+ while (ruleset_i.hasNext()) {
+ QRegularExpressionMatch ruleset = ruleset_i.next();
+ QString selector = ruleset.captured(1);
+ QString rules = ruleset.captured(2);
+ QRegularExpressionMatchIterator rule_i = rule_re.globalMatch(rules);
+ while (rule_i.hasNext()) {
+ QRegularExpressionMatch rule = rule_i.next();
+ QString property = rule.captured(1);
+ QString value;
+ if (!rule.captured(2).isNull()) {
+ value = rule.captured(2);
+ } else if (!rule.captured(3).isNull()) {
+ value = rule.captured(3);
+ } else {
+ value = rule.captured(4);
+ }
+ QString key = selector + "." + property;
+ if (!m_data.contains(key)) {
+ m_data.insert(key, QStringList());
+ }
+ m_data.find(key)->append(value);
+ }
+ }
+}
+
+std::optional<QString>* QDCSS::get(QString key)
+{
+ auto found = m_data.find(key);
+
+ if (found == m_data.end() || found->empty()) {
+ return new std::optional<QString>;
+ }
+
+ return new std::optional<QString>(found->back());
+}