diff options
author | Nicolas Werner <nicolas.werner@hotmail.de> | 2023-02-15 01:34:54 +0100 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2023-03-22 10:50:58 +0100 |
commit | 3f40a8b5b1f7d83130d6ec2b85a28a782072b6a9 (patch) | |
tree | 6968953bf1b6388f8bdcfb0a63dc26b7ee8a7dea /src/gui/text/qtextlist.cpp | |
parent | b05540bd00d051c74e67d138f5148eb23e018996 (diff) |
Add QTextListFormat::start: html and markdown ordered list index offset
This is useful for a lot of applications that render text coming from
sources which already support arbitrarily numbered lists (like chat
applications for example). Application-side workarounds usually have
significant overhead; and this feature has been requested multiple times.
It should be possible to both read and write HTML with the <ol start="x">
attribute, and read and write Markdown with arbitrary numbers for the
first item in a list.
[ChangeLog][QtGui] QTextList now supports specifying a start index using
the new QTextList::{setStart, start} functions. The HTML start attribute
on ordered lists in rich text documents is now parsed and used when
rendering a text list. Non-negative indices in markdown lists are now
also parsed and written properly. This allows starting a list with a
different number than 1.
Fixes: QTBUG-30407
Fixes: QTBUG-65384
Task-number: QTBUG-107562
Change-Id: Ib35b9378d9134ffedaa2d92f728b0984793aa7c1
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src/gui/text/qtextlist.cpp')
-rw-r--r-- | src/gui/text/qtextlist.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/gui/text/qtextlist.cpp b/src/gui/text/qtextlist.cpp index 8b4b308d0c..90a6cf8867 100644 --- a/src/gui/text/qtextlist.cpp +++ b/src/gui/text/qtextlist.cpp @@ -147,6 +147,9 @@ QString QTextList::itemText(const QTextBlock &blockIt) const QString numberPrefix; QString numberSuffix = u"."_s; + // the number of the item might be offset by start, which defaults to 1 + const int itemNumber = item + format().start() - 1; + if (format().hasProperty(QTextFormat::ListNumberPrefix)) numberPrefix = format().numberPrefix(); if (format().hasProperty(QTextFormat::ListNumberSuffix)) @@ -154,15 +157,21 @@ QString QTextList::itemText(const QTextBlock &blockIt) const switch (style) { case QTextListFormat::ListDecimal: - result = QString::number(item); + result = QString::number(itemNumber); break; // from the old richtext case QTextListFormat::ListLowerAlpha: case QTextListFormat::ListUpperAlpha: { + // match the html default behavior of falling back to decimal numbers + if (itemNumber < 1) { + result = QString::number(itemNumber); + break; + } + const char baseChar = style == QTextListFormat::ListUpperAlpha ? 'A' : 'a'; - int c = item; + int c = itemNumber; while (c > 0) { c--; result.prepend(QChar::fromUcs2(baseChar + (c % 26))); @@ -173,7 +182,10 @@ QString QTextList::itemText(const QTextBlock &blockIt) const case QTextListFormat::ListLowerRoman: case QTextListFormat::ListUpperRoman: { - if (item < 5000) { + // match the html default behavior of falling back to decimal numbers + if (itemNumber < 1) { + result = QString::number(itemNumber); + } else if (itemNumber < 5000) { QByteArray romanNumeral; // works for up to 4999 items @@ -186,7 +198,7 @@ QString QTextList::itemText(const QTextBlock &blockIt) const romanSymbols = QByteArray::fromRawData(romanSymbolsUpper, sizeof(romanSymbolsUpper)); int c[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000 }; - int n = item; + int n = itemNumber; for (int i = 12; i >= 0; n %= c[i], i--) { int q = n / c[i]; if (q > 0) { @@ -212,8 +224,7 @@ QString QTextList::itemText(const QTextBlock &blockIt) const } } result = QString::fromLatin1(romanNumeral); - } - else { + } else { result = u"?"_s; } |