2023-02-24 20:01:59 +00:00
|
|
|
// SPDX-FileCopyrightText: 2023 kumquat-ir 66188216+kumquat-ir@users.noreply.github.com
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
|
|
|
2023-02-12 22:23:15 +00:00
|
|
|
#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());
|
|
|
|
}
|