Krita Source Code Documentation
Loading...
Searching...
No Matches
KoWritingSystemUtils Class Reference

The KoScriptUtils class. More...

#include <KoWritingSystemUtils.h>

Classes

struct  Bcp47Locale
 The Bcp47Locale class This holds a parsed BCP47 locale. QLocale is primarily made for POSIX locale format, and even there ignores the @modifier tag. On top of that, many minority languages are not handled by QLocale. To keep track of that extra data we use this BCP Locale struct. More...
 

Static Public Member Functions

static QLocale localeFromBcp47Locale (const Bcp47Locale &locale)
 
static QLocale localeFromBcp47Locale (const QString &locale)
 
static Bcp47Locale parseBcp47Locale (const QString &locale)
 
static QChar::Script qCharScriptForScriptTag (const QString &tag)
 
static QMap< QString, QString > samples ()
 
static QString sampleTagForQLocale (const QLocale &locale)
 
static QLocale::Script scriptForScriptTag (const QString &tag)
 
static QString scriptTagForQCharScript (QChar::Script script)
 
static QString scriptTagForQLocaleScript (QLocale::Script script)
 
static QString scriptTagForWritingSystem (QFontDatabase::WritingSystem system)
 
static QFontDatabase::WritingSystem writingSystemForScriptTag (const QString &tag)
 

Detailed Description

The KoScriptUtils class.

Collection of utility functions to wrangle the different script and writing system enums in QFontDataBase, QLocale and QChar and ISO 15924 tags

Definition at line 19 of file KoWritingSystemUtils.h.

Member Function Documentation

◆ localeFromBcp47Locale() [1/2]

QLocale KoWritingSystemUtils::localeFromBcp47Locale ( const Bcp47Locale & locale)
static

Definition at line 549 of file KoWritingSystemUtils.cpp.

550{
551 return QLocale(locale.toPosixLocaleFormat());
552}

References KoWritingSystemUtils::Bcp47Locale::toPosixLocaleFormat().

◆ localeFromBcp47Locale() [2/2]

QLocale KoWritingSystemUtils::localeFromBcp47Locale ( const QString & locale)
static

Definition at line 554 of file KoWritingSystemUtils.cpp.

555{
557}
static Bcp47Locale parseBcp47Locale(const QString &locale)
static QLocale localeFromBcp47Locale(const Bcp47Locale &locale)

References localeFromBcp47Locale(), and parseBcp47Locale().

◆ parseBcp47Locale()

KoWritingSystemUtils::Bcp47Locale KoWritingSystemUtils::parseBcp47Locale ( const QString & locale)
static

Definition at line 444 of file KoWritingSystemUtils.cpp.

445{
446 Bcp47Locale bcp;
447
448 QStringList tags = grandFathered.value(locale, locale).split("-");
449
450 if (tags.isEmpty()) return bcp;
451
452 auto isAlphaOnly = [] (const QString &string) {
453 auto resultIt = std::find_if(string.begin(), string.end(), [] (QChar ch) {
454 return !ch.isLetter();
455 });
456
457 return resultIt == string.end();
458 };
459
460 auto isDigitOnly = [] (const QString &string) {
461 auto resultIt = std::find_if(string.begin(), string.end(), [] (QChar ch) {
462 return !ch.isDigit();
463 });
464
465 return resultIt == string.end();
466 };
467
468 // Language -- single primary language, followed by optional 3 letter extended tags.
469 if (tags.first().size() == 2 || tags.first().size() == 3) {
470 bcp.languageTags.append(tags.takeFirst().toLower());
471
472 // extensions only happen when first tag is 2 or 3 long.
473 while (!tags.isEmpty() && tags.first().size() == 3 && isAlphaOnly(tags.first())) {
474 bcp.languageTags.append(tags.takeFirst().toLower());
475 }
476 } else if (tags.first().size() >= 4 || tags.first().size() <= 8) {
477 // 4 alpha is reserved for future use and 5-8 is also legit, but practically doesn't exist...
478 bcp.languageTags.append(tags.takeFirst().toLower());
479 } else if (tags.first() == "i" && tags.size() > 0) {
480 QString total = tags.takeFirst();
481 total += "-"+tags.takeFirst();
482 bcp.languageTags.append(total.toLower());
483 }
484
485 if (tags.isEmpty()) return bcp;
486
487 // Script -- This is an 4 letter alpha only.
488
489 if (isAlphaOnly(tags.first()) && tags.first().size() == 4) {
490 bcp.scriptTag = tags.takeFirst().toLower();
491 bcp.scriptTag = bcp.scriptTag.at(0).toUpper()+bcp.scriptTag.mid(1);
492 }
493
494 if (tags.isEmpty()) return bcp;
495
496 // Region -- 2 letter alpha only.
497
498 if ((isAlphaOnly(tags.first()) && tags.first().size() == 2)
499 || (isDigitOnly(tags.first()) && tags.first().size() == 3)) {
500 bcp.regionTag = tags.takeFirst().toUpper();
501 }
502
503 if (tags.isEmpty()) return bcp;
504
505 // Variants -- [0+] alpha numerics, either between 5-8 char long, or 4 but starting with a digit.
506
507 auto isVariantAlphaNumeric = [] (const QString &string) {
508 if (string.size() != 4) return false;
509 if (!string.at(0).isDigit()) return false;
510 if (!string.at(1).isLetterOrNumber() || !string.at(2).isLetterOrNumber() || !string.at(3).isLetterOrNumber())
511 return false;
512 return true;
513 };
514
515 while (!tags.isEmpty()
516 && ( (tags.first().size() >= 5 && tags.first().size() <= 8)
517 || isVariantAlphaNumeric(tags.first()) )
518 ) {
519 bcp.variantTags.append(tags.takeFirst().toLower());
520 }
521
522 if (tags.isEmpty()) return bcp;
523 // extension and private use subtags. Each starts with a single letter to indicate the extension type.
524
525 QStringList currentExtension;
526 while (!tags.isEmpty()) {
527 if (!currentExtension.isEmpty() && tags.first().size() == 1) {
528 if (currentExtension.first() == "x") {
529 bcp.privateUseTags.append(currentExtension.join("-"));
530 } else {
531 bcp.extensionTags.append(currentExtension.join("-"));
532 }
533 currentExtension.clear();
534 }
535 currentExtension.append(tags.takeFirst().toLower());
536 }
537
538 if (!currentExtension.isEmpty()) {
539 if (currentExtension.first() == "x") {
540 bcp.privateUseTags.append(currentExtension.join("-"));
541 } else {
542 bcp.extensionTags.append(currentExtension.join("-"));
543 }
544 }
545
546 return bcp;
547}
const QMap< QString, QString > grandFathered
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References KoWritingSystemUtils::Bcp47Locale::extensionTags, grandFathered, KoWritingSystemUtils::Bcp47Locale::languageTags, KoWritingSystemUtils::Bcp47Locale::privateUseTags, KoWritingSystemUtils::Bcp47Locale::regionTag, KoWritingSystemUtils::Bcp47Locale::scriptTag, and KoWritingSystemUtils::Bcp47Locale::variantTags.

◆ qCharScriptForScriptTag()

QChar::Script KoWritingSystemUtils::qCharScriptForScriptTag ( const QString & tag)
static

Definition at line 372 of file KoWritingSystemUtils.cpp.

373{
374 return QCHAR_SCRIPT_MAP.key(tag, QChar::Script_Unknown);
375}
static QMap< QChar::Script, QString > QCHAR_SCRIPT_MAP

References QCHAR_SCRIPT_MAP.

◆ samples()

QMap< QString, QString > KoWritingSystemUtils::samples ( )
static

This returns a map of samples and an associated tag. Note that the Sample is the first entry, the tag the second. This is because Latin, for example, has multiple sample strings associated depending on Latin coverage in the font. String it is stored with is s_<ISO 15924> tag for scripts and l_<BCP 47 Language> tag for languages. This way we can have samples per language as is useful for vietnamese.

Definition at line 378 of file KoWritingSystemUtils.cpp.

379{
380 QMap <QString, QString> samples;
381 // Also add simplified latin sample. By doing this first, it'll fall back nicely.
382 samples.insert("AaBbGg", "s_Latn");
383
384 // Some symbol samples...
385 samples.insert("\u263A\u2764\u2693\U0001F308", "s_Zsye"); // Emoji
386 samples.insert("βˆ†βˆ…βˆžβ‰ ", "s_Zmth"); // Some math operators
387 samples.insert("π„žπ… π„Ώπ„»", "s_Zsym"); // Musical notes
388 samples.insert("←↕↝↴", "s_Zsym"); // Arrows
389 for (int i = 0; i < QFontDatabase::WritingSystemsCount; i++) {
390 QFontDatabase::WritingSystem w = QFontDatabase::WritingSystem(i);
391 if (w == QFontDatabase::WritingSystem::Any) continue;
392
393 if (w == QFontDatabase::WritingSystem::Vietnamese) {
394 samples.insert(QFontDatabase::writingSystemSample(QFontDatabase::Vietnamese),
395 "l_vi");
396 } else {
397 samples.insert(QFontDatabase::writingSystemSample(w),
398 "s_"+WRITINGSYSTEM_SCRIPT_MAP.value(w, "Zyyy"));
399 }
400 }
401
402 return samples;
403}
static QMap< QFontDatabase::WritingSystem, QString > WRITINGSYSTEM_SCRIPT_MAP
static QMap< QString, QString > samples()

References samples(), and WRITINGSYSTEM_SCRIPT_MAP.

◆ sampleTagForQLocale()

QString KoWritingSystemUtils::sampleTagForQLocale ( const QLocale & locale)
static

Definition at line 405 of file KoWritingSystemUtils.cpp.

406{
407 const QLocale vietnamese(QLocale::Vietnamese, QLocale::LatinScript, QLocale::AnyCountry);
408
409 if (locale == vietnamese) {
410 return "l_vi";
411 }
412
413 return "s_"+QLOCALE_SCRIPT_MAP.value(locale.script(), "Zyyy");
414}
static QMap< QLocale::Script, QString > QLOCALE_SCRIPT_MAP

References QLOCALE_SCRIPT_MAP.

◆ scriptForScriptTag()

QLocale::Script KoWritingSystemUtils::scriptForScriptTag ( const QString & tag)
static

Definition at line 362 of file KoWritingSystemUtils.cpp.

363{
364 return QLOCALE_SCRIPT_MAP.key(tag, QLocale::AnyScript);
365}

References QLOCALE_SCRIPT_MAP.

◆ scriptTagForQCharScript()

QString KoWritingSystemUtils::scriptTagForQCharScript ( QChar::Script script)
static

Definition at line 367 of file KoWritingSystemUtils.cpp.

368{
369 return QCHAR_SCRIPT_MAP.value(script);
370}

References QCHAR_SCRIPT_MAP.

◆ scriptTagForQLocaleScript()

QString KoWritingSystemUtils::scriptTagForQLocaleScript ( QLocale::Script script)
static

Definition at line 357 of file KoWritingSystemUtils.cpp.

358{
359 return QLOCALE_SCRIPT_MAP.value(script);
360}

References QLOCALE_SCRIPT_MAP.

◆ scriptTagForWritingSystem()

QString KoWritingSystemUtils::scriptTagForWritingSystem ( QFontDatabase::WritingSystem system)
static

Definition at line 348 of file KoWritingSystemUtils.cpp.

348 {
349 return WRITINGSYSTEM_SCRIPT_MAP.value(system);
350}

References WRITINGSYSTEM_SCRIPT_MAP.

◆ writingSystemForScriptTag()

QFontDatabase::WritingSystem KoWritingSystemUtils::writingSystemForScriptTag ( const QString & tag)
static

Definition at line 352 of file KoWritingSystemUtils.cpp.

353{
354 return WRITINGSYSTEM_SCRIPT_MAP.key(tag, QFontDatabase::Any);
355}

References WRITINGSYSTEM_SCRIPT_MAP.


The documentation for this class was generated from the following files: