switch to qdcss for parsing
make it not horrible to look at Signed-off-by: kumquat-ir <66188216+kumquat-ir@users.noreply.github.com>
This commit is contained in:
@ -140,3 +140,11 @@ A TOML language parser. Used by Forge 1.14+ to store mod metadata.
|
||||
See [github repo](https://github.com/marzer/tomlplusplus).
|
||||
|
||||
Licenced under the MIT licence.
|
||||
|
||||
## qdcss
|
||||
|
||||
A quick and dirty css parser, used by NilLoader to store mod metadata.
|
||||
|
||||
Translated (and heavily trimmed down) from [the original Java code](https://github.com/unascribed/NilLoader/blob/trunk/src/main/java/nilloader/api/lib/qdcss/QDCSS.java) from NilLoader
|
||||
|
||||
Licensed under LGPL version 3.
|
||||
|
18
libraries/qdcss/CMakeLists.txt
Normal file
18
libraries/qdcss/CMakeLists.txt
Normal file
@ -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})
|
21
libraries/qdcss/include/qdcss.h
Normal file
21
libraries/qdcss/include/qdcss.h
Normal file
@ -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
|
49
libraries/qdcss/src/qdcss.cpp
Normal file
49
libraries/qdcss/src/qdcss.cpp
Normal file
@ -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());
|
||||
}
|
Reference in New Issue
Block a user