diff options
Diffstat (limited to 'libraries/qdcss/src/qdcss.cpp')
-rw-r--r-- | libraries/qdcss/src/qdcss.cpp | 53 |
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()); +} |