7#include "mapcssparser.h"
8#include "mapcssparser_p.h"
11#include "mapcssparser_impl.h"
12#include "mapcssdeclaration_p.h"
13#include "mapcssrule_p.h"
14#include "mapcssscanner.h"
15#include "mapcssstyle.h"
16#include "mapcssstyle_p.h"
25char* unquoteString(
const char *str)
27 const auto size = strlen(str) - 2;
31 auto out = (
char*)malloc(size + 1);
32 memset(out, 0, size + 1);
34 for (
auto it = str + 1; it < str + size + 1; ++it, ++outIt) {
58MapCSSParser::MapCSSParser()
59 : d(new MapCSSParserPrivate)
63MapCSSParser::~MapCSSParser() =
default;
65bool MapCSSParser::hasError()
const
70QString MapCSSParser::fileName()
const
72 return d->m_currentFileName;
75QString MapCSSParser::errorMessage()
const
89 d->parse(&style, fileName, {});
97void MapCSSParserPrivate::parse(
MapCSSStyle *style,
const QString &fileName, ClassSelectorKey importClass)
101 qCWarning(
Log) << f.fileName() << f.errorString();
103 m_errorMsg = f.errorString();
106 m_currentFileName = fileName;
107 m_currentStyle = style;
108 m_importClass = importClass;
111 if (yylex_init(&scanner)) {
114 const auto lexerCleanup = qScopeGuard([&scanner]{ yylex_destroy(scanner); });
116 const auto b = f.readAll();
117 YY_BUFFER_STATE state;
118 state = yy_scan_string(b.constData(), scanner);
119 if (yyparse(
this, scanner)) {
124 yy_delete_buffer(state, scanner);
127 m_currentStyle =
nullptr;
131bool MapCSSParserPrivate::addImport(
char* fileName, ClassSelectorKey importClass)
141 p.d->parse(m_currentStyle, cssFile, importClass);
143 m_error = p.d->m_error;
144 m_errorMsg = p.errorMessage();
146 return !p.hasError();
149void MapCSSParserPrivate::addRule(MapCSSRule *rule)
151 if (!m_importClass.isNull()) {
152 auto decl =
new MapCSSDeclaration(MapCSSDeclaration::ClassDeclaration);
153 decl->setClassSelectorKey(m_importClass);
154 rule->addDeclaration(decl);
156 MapCSSStylePrivate::get(m_currentStyle)->m_rules.push_back(std::unique_ptr<MapCSSRule>(rule));
159void MapCSSParserPrivate::setError(
const QString &msg,
int line,
int column)
167ClassSelectorKey MapCSSParserPrivate::makeClassSelector(
const char *str, std::size_t len)
const
169 return MapCSSStylePrivate::get(m_currentStyle)->m_classSelectorRegistry.makeKey(str, len, OSM::StringMemory::Transient);
172LayerSelectorKey MapCSSParserPrivate::makeLayerSelector(
const char *str, std::size_t len)
const
174 if (!str || std::strcmp(str,
"default") == 0) {
177 return MapCSSStylePrivate::get(m_currentStyle)->m_layerSelectorRegistry.makeKey(str, len, OSM::StringMemory::Transient);
A parsed MapCSS style sheet.
OSM-based multi-floor indoor maps for buildings.
QString absolutePath() const const
QString fromUtf8(QByteArrayView str)
QString number(double n, char format, int precision)