QTextDocument: Give fontFamily() precedence over fontFamilies()
If the singular fontFamily() is given, then this is obviously the one to be preferred over any plural fontFamilies(). Make sure it always ends up first in the list of emitted font families. Change-Id: I1e3b1ba29721c8298b1a0d4a1e1da49ba5b4e7ac Fixes: QTBUG-80475 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
809a96d6d9
commit
a1f4321bbb
@ -2297,6 +2297,17 @@ QTextHtmlExporter::QTextHtmlExporter(const QTextDocument *_doc)
|
||||
defaultCharFormat.clearProperty(QTextFormat::TextUnderlineStyle);
|
||||
}
|
||||
|
||||
static QStringList resolvedFontFamilies(const QTextCharFormat &format)
|
||||
{
|
||||
QStringList fontFamilies = format.fontFamilies().toStringList();
|
||||
const QString mainFontFamily = format.fontFamily();
|
||||
if (!mainFontFamily.isEmpty() && !fontFamilies.startsWith(mainFontFamily)) {
|
||||
fontFamilies.removeAll(mainFontFamily);
|
||||
fontFamilies.prepend(mainFontFamily);
|
||||
}
|
||||
return fontFamilies;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the document in HTML format. The conversion may not be
|
||||
perfect, especially for complex documents, due to the limitations
|
||||
@ -2325,11 +2336,7 @@ QString QTextHtmlExporter::toHtml(const QByteArray &encoding, ExportMode mode)
|
||||
if (mode == ExportEntireDocument) {
|
||||
html += QLatin1String(" style=\"");
|
||||
|
||||
QStringList fontFamilies = defaultCharFormat.fontFamilies().toStringList();
|
||||
if (!fontFamilies.isEmpty())
|
||||
emitFontFamily(fontFamilies);
|
||||
else
|
||||
emitFontFamily(defaultCharFormat.fontFamily());
|
||||
emitFontFamily(resolvedFontFamilies(defaultCharFormat));
|
||||
|
||||
if (defaultCharFormat.hasProperty(QTextFormat::FontPointSize)) {
|
||||
html += QLatin1String(" font-size:");
|
||||
@ -2391,14 +2398,10 @@ bool QTextHtmlExporter::emitCharFormatStyle(const QTextCharFormat &format)
|
||||
bool attributesEmitted = false;
|
||||
|
||||
{
|
||||
const QStringList families = format.fontFamilies().toStringList();
|
||||
const QString family = format.fontFamily();
|
||||
if (!families.isEmpty() && families != defaultCharFormat.fontFamilies().toStringList()) {
|
||||
const QStringList families = resolvedFontFamilies(format);
|
||||
if (!families.isEmpty() && families != resolvedFontFamilies(defaultCharFormat)) {
|
||||
emitFontFamily(families);
|
||||
attributesEmitted = true;
|
||||
} else if (!family.isEmpty() && family != defaultCharFormat.fontFamily()) {
|
||||
emitFontFamily(family);
|
||||
attributesEmitted = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2661,20 +2664,6 @@ void QTextHtmlExporter::emitPageBreakPolicy(QTextFormat::PageBreakFlags policy)
|
||||
html += QLatin1String(" page-break-after:always;");
|
||||
}
|
||||
|
||||
void QTextHtmlExporter::emitFontFamily(const QString &family)
|
||||
{
|
||||
html += QLatin1String(" font-family:");
|
||||
|
||||
QLatin1String quote("\'");
|
||||
if (family.contains(QLatin1Char('\'')))
|
||||
quote = QLatin1String(""");
|
||||
|
||||
html += quote;
|
||||
html += family.toHtmlEscaped();
|
||||
html += quote;
|
||||
html += QLatin1Char(';');
|
||||
}
|
||||
|
||||
void QTextHtmlExporter::emitFontFamily(const QStringList &families)
|
||||
{
|
||||
html += QLatin1String(" font-family:");
|
||||
|
@ -396,7 +396,6 @@ private:
|
||||
void emitBorderStyle(QTextFrameFormat::BorderStyle style);
|
||||
void emitPageBreakPolicy(QTextFormat::PageBreakFlags policy);
|
||||
|
||||
void emitFontFamily(const QString &family);
|
||||
void emitFontFamily(const QStringList &families);
|
||||
|
||||
void emitBackgroundAttribute(const QTextFormat &format);
|
||||
|
@ -194,6 +194,8 @@ private slots:
|
||||
void fontTagFace();
|
||||
|
||||
void clearUndoRedoStacks();
|
||||
void mergeFontFamilies();
|
||||
|
||||
private:
|
||||
void backgroundImage_checkExpectedHtml(const QTextDocument &doc);
|
||||
void buildRegExpData();
|
||||
@ -3579,6 +3581,25 @@ void tst_QTextDocument::fontTagFace()
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QTextDocument::mergeFontFamilies()
|
||||
{
|
||||
QTextDocument td;
|
||||
td.setHtml(QLatin1String(
|
||||
"<html><body>"
|
||||
"<span style=\" font-family:'MS Shell Dlg 2';\">Hello world</span>"
|
||||
"</body></html>"));
|
||||
|
||||
QTextCharFormat newFormat;
|
||||
newFormat.setFontFamily(QLatin1String("Jokerman"));
|
||||
|
||||
QTextCursor cursor = QTextCursor(&td);
|
||||
cursor.setPosition(0);
|
||||
cursor.setPosition(QByteArray("Hello World").length(), QTextCursor::KeepAnchor);
|
||||
cursor.mergeCharFormat(newFormat);
|
||||
|
||||
QVERIFY(td.toHtml().contains(QLatin1String("font-family:'Jokerman','MS Shell Dlg 2';")));
|
||||
}
|
||||
|
||||
void tst_QTextDocument::clearUndoRedoStacks()
|
||||
{
|
||||
QTextDocument doc;
|
||||
|
Loading…
x
Reference in New Issue
Block a user