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 | |
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')
-rw-r--r-- | libraries/qdcss/CMakeLists.txt | 18 | ||||
-rw-r--r-- | libraries/qdcss/include/qdcss.h | 21 | ||||
-rw-r--r-- | libraries/qdcss/src/qdcss.cpp | 49 |
3 files changed, 88 insertions, 0 deletions
diff --git a/libraries/qdcss/CMakeLists.txt b/libraries/qdcss/CMakeLists.txt new file mode 100644 index 00000000..0afdef32 --- /dev/null +++ b/libraries/qdcss/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.9.4) +project(qdcss) + +if(QT_VERSION_MAJOR EQUAL 5) + find_package(Qt5 COMPONENTS Core REQUIRED) +elseif(Launcher_QT_VERSION_MAJOR EQUAL 6) + find_package(Qt6 COMPONENTS Core Core5Compat REQUIRED) + list(APPEND qdcss_LIBS Qt${QT_VERSION_MAJOR}::Core5Compat) +endif() + +set(QDCSS_SOURCES + include/qdcss.h + src/qdcss.cpp +) + +add_library(qdcss STATIC ${QDCSS_SOURCES}) +target_include_directories(qdcss PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) +target_link_libraries(qdcss Qt${QT_VERSION_MAJOR}::Core ${qdcss_LIBS}) diff --git a/libraries/qdcss/include/qdcss.h b/libraries/qdcss/include/qdcss.h new file mode 100644 index 00000000..2bcac36f --- /dev/null +++ b/libraries/qdcss/include/qdcss.h @@ -0,0 +1,21 @@ +#ifndef QDCSS_H +#define QDCSS_H + +#include <QMap> +#include <QString> +#include <QStringList> +#include <optional> + +class QDCSS { + // these are all we need to parse a couple string values out of a css string + // lots more in the original code, yet to be ported + // https://github.com/unascribed/NilLoader/blob/trunk/src/main/java/nilloader/api/lib/qdcss/QDCSS.java + public: + QDCSS(QString); + std::optional<QString>* get(QString); + + private: + QMap<QString, QStringList> m_data; +}; + +#endif // QDCSS_H 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()); +} |