Output all font families in HTML output

Fix our generation of font-family CSS so it contains the full list of
families.

Change-Id: I37d5efa64faeb4b6aeb7e2c5d6a54ff07febe9cc
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Allan Sandfeld Jensen 2019-06-21 13:29:50 +02:00
parent bc8f871784
commit 64033c3592
3 changed files with 44 additions and 2 deletions

View File

@ -2299,7 +2299,11 @@ QString QTextHtmlExporter::toHtml(const QByteArray &encoding, ExportMode mode)
if (mode == ExportEntireDocument) {
html += QLatin1String(" style=\"");
emitFontFamily(defaultCharFormat.fontFamily());
QStringList fontFamilies = defaultCharFormat.fontFamilies().toStringList();
if (!fontFamilies.isEmpty())
emitFontFamily(fontFamilies);
else
emitFontFamily(defaultCharFormat.fontFamily());
if (defaultCharFormat.hasProperty(QTextFormat::FontPointSize)) {
html += QLatin1String(" font-size:");
@ -2361,8 +2365,12 @@ bool QTextHtmlExporter::emitCharFormatStyle(const QTextCharFormat &format)
bool attributesEmitted = false;
{
const QStringList families = format.fontFamilies().toStringList();
const QString family = format.fontFamily();
if (!family.isEmpty() && family != defaultCharFormat.fontFamily()) {
if (!families.isEmpty() && families != defaultCharFormat.fontFamilies().toStringList()) {
emitFontFamily(families);
attributesEmitted = true;
} else if (!family.isEmpty() && family != defaultCharFormat.fontFamily()) {
emitFontFamily(family);
attributesEmitted = true;
}
@ -2639,6 +2647,27 @@ void QTextHtmlExporter::emitFontFamily(const QString &family)
html += QLatin1Char(';');
}
void QTextHtmlExporter::emitFontFamily(const QStringList &families)
{
html += QLatin1String(" font-family:");
bool first = true;
for (const QString &family : families) {
QLatin1String quote("\'");
if (family.contains(QLatin1Char('\'')))
quote = QLatin1String("&quot;");
if (!first)
html += QLatin1String(",");
else
first = false;
html += quote;
html += family.toHtmlEscaped();
html += quote;
}
html += QLatin1Char(';');
}
void QTextHtmlExporter::emitMargins(const QString &top, const QString &bottom, const QString &left, const QString &right)
{
html += QLatin1String(" margin-top:");

View File

@ -396,6 +396,7 @@ private:
void emitPageBreakPolicy(QTextFormat::PageBreakFlags policy);
void emitFontFamily(const QString &family);
void emitFontFamily(const QStringList &families);
void emitBackgroundAttribute(const QTextFormat &format);
QString findUrlForImage(const QTextDocument *doc, qint64 cacheKey, bool isPixmap);

View File

@ -861,6 +861,18 @@ void tst_QTextDocument::toHtml_data()
<< QString("<p DEFAULTBLOCKSTYLE><span style=\" font-family:'Foo&quot;s Family';\">Blah</span></p>");
}
{
CREATE_DOC_AND_CURSOR();
QTextCharFormat fmt;
fmt.setFontFamily("Times");
fmt.setFontFamilies(QStringList{ "Times", "serif" });
cursor.insertText("Blah", fmt);
QTest::newRow("font-family-with-fallback") << QTextDocumentFragment(&doc)
<< QString("<p DEFAULTBLOCKSTYLE><span style=\" font-family:'Times','serif';\">Blah</span></p>");
}
{
CREATE_DOC_AND_CURSOR();