diff options
author | kumquat-ir <66188216+kumquat-ir@users.noreply.github.com> | 2023-02-12 17:23:15 -0500 |
---|---|---|
committer | kumquat-ir <66188216+kumquat-ir@users.noreply.github.com> | 2023-02-12 17:23:15 -0500 |
commit | c07fff750354e23149470d493a7c96624fe2ab26 (patch) | |
tree | 8d9c030ad178c08a8183b3bd2c5a89a573f641f9 /libraries/qdcss/src | |
parent | 7896dd19c12c0276551ba188adc6184dcf0a3184 (diff) | |
download | PrismLauncher-c07fff750354e23149470d493a7c96624fe2ab26.tar.gz PrismLauncher-c07fff750354e23149470d493a7c96624fe2ab26.tar.bz2 PrismLauncher-c07fff750354e23149470d493a7c96624fe2ab26.zip |
switch to qdcss for parsing
make it not horrible to look at
Signed-off-by: kumquat-ir <66188216+kumquat-ir@users.noreply.github.com>
Diffstat (limited to 'libraries/qdcss/src')
-rw-r--r-- | libraries/qdcss/src/qdcss.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/libraries/qdcss/src/qdcss.cpp b/libraries/qdcss/src/qdcss.cpp new file mode 100644 index 00000000..4426dcae --- /dev/null +++ b/libraries/qdcss/src/qdcss.cpp @@ -0,0 +1,49 @@ +#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()); +} |