Changeset View
Changeset View
Standalone View
Standalone View
src/lib/definition.cpp
Show All 38 Lines | |||||
39 | #include <QVector> | 39 | #include <QVector> | ||
40 | #include <QXmlStreamReader> | 40 | #include <QXmlStreamReader> | ||
41 | 41 | | |||
42 | #include <algorithm> | 42 | #include <algorithm> | ||
43 | 43 | | |||
44 | using namespace KSyntaxHighlighting; | 44 | using namespace KSyntaxHighlighting; | ||
45 | 45 | | |||
46 | DefinitionData::DefinitionData() | 46 | DefinitionData::DefinitionData() | ||
47 | : delimiters(QStringLiteral("\t !%&()*+,-./:;<=>?[\\]^{|}~")) // must be sorted! | 47 | : wordDelimiters(QStringLiteral("\t !%&()*+,-./:;<=>?[\\]^{|}~")) // must be sorted! | ||
48 | , wordWrapDelimiters(wordDelimiters) | ||||
48 | { | 49 | { | ||
49 | } | 50 | } | ||
50 | 51 | | |||
51 | DefinitionData::~DefinitionData() | 52 | DefinitionData::~DefinitionData() | ||
52 | { | 53 | { | ||
53 | qDeleteAll(contexts); | 54 | qDeleteAll(contexts); | ||
54 | } | 55 | } | ||
55 | 56 | | |||
▲ Show 20 Lines • Show All 114 Lines • ▼ Show 20 Line(s) | |||||
170 | } | 171 | } | ||
171 | 172 | | |||
172 | bool Definition::isWordDelimiter(QChar c) const | 173 | bool Definition::isWordDelimiter(QChar c) const | ||
173 | { | 174 | { | ||
174 | d->load(); | 175 | d->load(); | ||
175 | return d->isWordDelimiter(c); | 176 | return d->isWordDelimiter(c); | ||
176 | } | 177 | } | ||
177 | 178 | | |||
179 | bool Definition::isWordWrapDelimiter(QChar c) const | ||||
180 | { | ||||
181 | d->load(); | ||||
182 | return std::binary_search(d->wordWrapDelimiters.constBegin(), d->wordWrapDelimiters.constEnd(), c); | ||||
183 | } | ||||
184 | | ||||
178 | bool Definition::indentationBasedFoldingEnabled() const | 185 | bool Definition::indentationBasedFoldingEnabled() const | ||
179 | { | 186 | { | ||
180 | d->load(); | 187 | d->load(); | ||
181 | return d->indentationBasedFolding; | 188 | return d->indentationBasedFolding; | ||
182 | } | 189 | } | ||
183 | 190 | | |||
184 | QStringList Definition::foldingIgnoreList() const | 191 | QStringList Definition::foldingIgnoreList() const | ||
185 | { | 192 | { | ||
▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Line(s) | |||||
260 | 267 | | |||
261 | KeywordList DefinitionData::keywordList(const QString& name) const | 268 | KeywordList DefinitionData::keywordList(const QString& name) const | ||
262 | { | 269 | { | ||
263 | return keywordLists.value(name); | 270 | return keywordLists.value(name); | ||
264 | } | 271 | } | ||
265 | 272 | | |||
266 | bool DefinitionData::isWordDelimiter(QChar c) const | 273 | bool DefinitionData::isWordDelimiter(QChar c) const | ||
267 | { | 274 | { | ||
268 | return std::binary_search(delimiters.constBegin(), delimiters.constEnd(), c); | 275 | return std::binary_search(wordDelimiters.constBegin(), wordDelimiters.constEnd(), c); | ||
269 | } | 276 | } | ||
270 | 277 | | |||
271 | Format DefinitionData::formatByName(const QString& name) const | 278 | Format DefinitionData::formatByName(const QString& name) const | ||
272 | { | 279 | { | ||
273 | const auto it = formats.constFind(name); | 280 | const auto it = formats.constFind(name); | ||
274 | if (it != formats.constEnd()) | 281 | if (it != formats.constEnd()) | ||
275 | return it.value(); | 282 | return it.value(); | ||
276 | 283 | | |||
Show All 33 Lines | 293 | { | |||
310 | for (auto it = keywordLists.begin(); it != keywordLists.end(); ++it) | 317 | for (auto it = keywordLists.begin(); it != keywordLists.end(); ++it) | ||
311 | (*it).setCaseSensitivity(caseSensitive); | 318 | (*it).setCaseSensitivity(caseSensitive); | ||
312 | 319 | | |||
313 | foreach (auto context, contexts) { | 320 | foreach (auto context, contexts) { | ||
314 | context->resolveContexts(); | 321 | context->resolveContexts(); | ||
315 | context->resolveIncludes(); | 322 | context->resolveIncludes(); | ||
316 | } | 323 | } | ||
317 | 324 | | |||
318 | Q_ASSERT(std::is_sorted(delimiters.constBegin(), delimiters.constEnd())); | 325 | Q_ASSERT(std::is_sorted(wordDelimiters.constBegin(), wordDelimiters.constEnd())); | ||
319 | return true; | 326 | return true; | ||
320 | } | 327 | } | ||
321 | 328 | | |||
322 | void DefinitionData::clear() | 329 | void DefinitionData::clear() | ||
323 | { | 330 | { | ||
324 | // keep only name and repo, so we can re-lookup to make references persist over repo reloads | 331 | // keep only name and repo, so we can re-lookup to make references persist over repo reloads | ||
325 | keywordLists.clear(); | 332 | keywordLists.clear(); | ||
326 | qDeleteAll(contexts); | 333 | qDeleteAll(contexts); | ||
327 | contexts.clear(); | 334 | contexts.clear(); | ||
328 | formats.clear(); | 335 | formats.clear(); | ||
329 | 336 | | |||
330 | fileName.clear(); | 337 | fileName.clear(); | ||
331 | section.clear(); | 338 | section.clear(); | ||
332 | style.clear(); | 339 | style.clear(); | ||
333 | indenter.clear(); | 340 | indenter.clear(); | ||
334 | author.clear(); | 341 | author.clear(); | ||
335 | license.clear(); | 342 | license.clear(); | ||
336 | mimetypes.clear(); | 343 | mimetypes.clear(); | ||
337 | extensions.clear(); | 344 | extensions.clear(); | ||
338 | delimiters = QStringLiteral("\t !%&()*+,-./:;<=>?[\\]^{|}~"); // must be sorted! | 345 | wordDelimiters = QStringLiteral("\t !%&()*+,-./:;<=>?[\\]^{|}~"); // must be sorted! | ||
346 | wordWrapDelimiters = wordDelimiters; | ||||
339 | caseSensitive = Qt::CaseSensitive; | 347 | caseSensitive = Qt::CaseSensitive; | ||
340 | version = 0.0f; | 348 | version = 0.0f; | ||
341 | priority = 0; | 349 | priority = 0; | ||
342 | hidden = false; | 350 | hidden = false; | ||
343 | } | 351 | } | ||
344 | 352 | | |||
345 | bool DefinitionData::loadMetaData(const QString& definitionFileName) | 353 | bool DefinitionData::loadMetaData(const QString& definitionFileName) | ||
346 | { | 354 | { | ||
▲ Show 20 Lines • Show All 163 Lines • ▼ Show 20 Line(s) | 510 | { | |||
510 | while (!reader.atEnd()) { | 518 | while (!reader.atEnd()) { | ||
511 | switch (reader.tokenType()) { | 519 | switch (reader.tokenType()) { | ||
512 | case QXmlStreamReader::StartElement: | 520 | case QXmlStreamReader::StartElement: | ||
513 | ++elementRefCounter; | 521 | ++elementRefCounter; | ||
514 | 522 | | |||
515 | if (reader.name() == QLatin1String("keywords")) { | 523 | if (reader.name() == QLatin1String("keywords")) { | ||
516 | if (reader.attributes().hasAttribute(QStringLiteral("casesensitive"))) | 524 | if (reader.attributes().hasAttribute(QStringLiteral("casesensitive"))) | ||
517 | caseSensitive = Xml::attrToBool(reader.attributes().value(QStringLiteral("casesensitive"))) ? Qt::CaseSensitive : Qt::CaseInsensitive; | 525 | caseSensitive = Xml::attrToBool(reader.attributes().value(QStringLiteral("casesensitive"))) ? Qt::CaseSensitive : Qt::CaseInsensitive; | ||
518 | delimiters += reader.attributes().value(QStringLiteral("additionalDeliminator")); | 526 | | ||
519 | std::sort(delimiters.begin(), delimiters.end()); | 527 | // adapt sorted wordDelimiters | ||
520 | auto it = std::unique(delimiters.begin(), delimiters.end()); | 528 | wordDelimiters += reader.attributes().value(QStringLiteral("additionalDeliminator")); | ||
521 | delimiters.truncate(std::distance(delimiters.begin(), it)); | 529 | std::sort(wordDelimiters.begin(), wordDelimiters.end()); | ||
530 | auto it = std::unique(wordDelimiters.begin(), wordDelimiters.end()); | ||||
531 | wordDelimiters.truncate(std::distance(wordDelimiters.begin(), it)); | ||||
522 | foreach (const auto c, reader.attributes().value(QLatin1String("weakDeliminator"))) | 532 | foreach (const auto c, reader.attributes().value(QLatin1String("weakDeliminator"))) | ||
523 | delimiters.remove(c); | 533 | wordDelimiters.remove(c); | ||
534 | | ||||
535 | // adaptWordWrapDelimiters, and sort | ||||
536 | wordWrapDelimiters = reader.attributes().value(QStringLiteral("wordWrapDeliminator")).toString(); | ||||
537 | std::sort(wordWrapDelimiters.begin(), wordWrapDelimiters.end()); | ||||
538 | if (wordWrapDelimiters.isEmpty()) | ||||
539 | wordWrapDelimiters = wordDelimiters; | ||||
524 | } else if (reader.name() == QLatin1String("folding")) { | 540 | } else if (reader.name() == QLatin1String("folding")) { | ||
525 | if (reader.attributes().hasAttribute(QStringLiteral("indentationsensitive"))) | 541 | if (reader.attributes().hasAttribute(QStringLiteral("indentationsensitive"))) | ||
526 | indentationBasedFolding = Xml::attrToBool(reader.attributes().value(QStringLiteral("indentationsensitive"))); | 542 | indentationBasedFolding = Xml::attrToBool(reader.attributes().value(QStringLiteral("indentationsensitive"))); | ||
527 | } else if (reader.name() == QLatin1String("emptyLines")) { | 543 | } else if (reader.name() == QLatin1String("emptyLines")) { | ||
528 | loadFoldingIgnoreList(reader); | 544 | loadFoldingIgnoreList(reader); | ||
529 | } else { | 545 | } else { | ||
530 | reader.skipCurrentElement(); | 546 | reader.skipCurrentElement(); | ||
531 | } | 547 | } | ||
▲ Show 20 Lines • Show All 94 Lines • Show Last 20 Lines |