diff options
author | Albert Astals Cid <albert.astals.cid@kdab.com> | 2021-05-28 14:51:34 +0200 |
---|---|---|
committer | Albert Astals Cid <albert.astals.cid@kdab.com> | 2021-06-03 17:05:44 +0200 |
commit | c3102b1f7695789e86c8fc7704736074e9ea61a0 (patch) | |
tree | ad70895c193b9e51273065aa9fffb7c2b3cda91d /src/gui | |
parent | eab0bb73a503007d152a3406a1b96133a3bcab57 (diff) |
Extract the entity parsing code to a static function
This way we can use it from qtdeclarative to parse styled text
Change-Id: Ic888a75a9700558e97b3e743d6d42fda121ddcba
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/text/qtexthtmlparser.cpp | 54 | ||||
-rw-r--r-- | src/gui/text/qtexthtmlparser_p.h | 3 |
2 files changed, 34 insertions, 23 deletions
diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp index ec9cddd9c5..025098856b 100644 --- a/src/gui/text/qtexthtmlparser.cpp +++ b/src/gui/text/qtexthtmlparser.cpp @@ -800,12 +800,38 @@ void QTextHtmlParser::parseExclamationTag() } } +QString QTextHtmlParser::parseEntity(QStringView entity) +{ + QChar resolved = resolveEntity(entity); + if (!resolved.isNull()) + return QString(resolved); + + if (entity.length() > 1 && entity.at(0) == QLatin1Char('#')) { + entity = entity.mid(1); // removing leading # + + int base = 10; + bool ok = false; + + if (entity.at(0).toLower() == QLatin1Char('x')) { // hex entity? + entity = entity.mid(1); + base = 16; + } + + uint uc = entity.toUInt(&ok, base); + if (ok) { + if (uc >= 0x80 && uc < 0x80 + (sizeof(windowsLatin1ExtendedCharacters)/sizeof(windowsLatin1ExtendedCharacters[0]))) + uc = windowsLatin1ExtendedCharacters[uc - 0x80]; + return QStringView{QChar::fromUcs4(uc)}.toString(); + } + } + return {}; +} + // parses an entity after "&", and returns it QString QTextHtmlParser::parseEntity() { const int recover = pos; int entityLen = 0; - QStringView entity; while (pos < len) { QChar c = txt.at(pos++); if (c.isSpace() || pos - recover > 9) { @@ -816,28 +842,10 @@ QString QTextHtmlParser::parseEntity() ++entityLen; } if (entityLen) { - entity = QStringView(txt).mid(recover, entityLen); - QChar resolved = resolveEntity(entity); - if (!resolved.isNull()) - return QString(resolved); - - if (entityLen > 1 && entity.at(0) == QLatin1Char('#')) { - entity = entity.mid(1); // removing leading # - - int base = 10; - bool ok = false; - - if (entity.at(0).toLower() == QLatin1Char('x')) { // hex entity? - entity = entity.mid(1); - base = 16; - } - - uint uc = entity.toUInt(&ok, base); - if (ok) { - if (uc >= 0x80 && uc < 0x80 + (sizeof(windowsLatin1ExtendedCharacters)/sizeof(windowsLatin1ExtendedCharacters[0]))) - uc = windowsLatin1ExtendedCharacters[uc - 0x80]; - return QStringView{QChar::fromUcs4(uc)}.toString(); - } + const QStringView entity = QStringView(txt).mid(recover, entityLen); + const QString parsedEntity = parseEntity(entity); + if (!parsedEntity.isNull()) { + return parsedEntity; } } error: diff --git a/src/gui/text/qtexthtmlparser_p.h b/src/gui/text/qtexthtmlparser_p.h index b99f73fafb..06bbc032a8 100644 --- a/src/gui/text/qtexthtmlparser_p.h +++ b/src/gui/text/qtexthtmlparser_p.h @@ -310,6 +310,9 @@ public: void parse(const QString &text, const QTextDocument *resourceProvider); static int lookupElement(const QString &element); + + Q_GUI_EXPORT static QString parseEntity(QStringView entity); + protected: QTextHtmlParserNode *newNode(int parent); QList<QTextHtmlParserNode *> nodes; |