r22118 by jghali -
scribus-commit
scribus-commit at lists.scribus.net
Fri Jul 21 11:14:21 UTC 2017
Author: jghali
Date: Fri Jul 21 11:14:21 2017
New Revision: 22118
URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=22118
Log:
#14916: fix several issues causing text imported from ODT document to use wrong font
Modified:
trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.cpp
trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.h
Modified: trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.cpp
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22118&path=/trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.cpp
==============================================================================
--- trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.cpp (original)
+++ trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.cpp Fri Jul 21 11:14:21 2017
@@ -645,10 +645,17 @@
void ODTIm::parseTextSpan(QDomElement &elem, PageItem* item, ParagraphStyle &tmpStyle, CharStyle &tmpCStyle, ObjStyleODT &tmpOStyle, int &posC)
{
- ObjStyleODT cStyle = tmpOStyle;
- if (elem.hasAttribute("text:style-name"))
- resolveStyle(cStyle, elem.attribute("text:style-name"));
- applyCharacterStyle(tmpCStyle, cStyle);
+ ObjStyleODT odtStyle = tmpOStyle;
+ CharStyle cStyle = tmpCStyle;
+
+ QString textStyleName = elem.attribute("text:style-name");
+ if (textStyleName.length() > 0)
+ {
+ resolveStyle(odtStyle, textStyleName);
+ m_textStylesStack.push(textStyleName);
+ }
+
+ applyCharacterStyle(cStyle, odtStyle);
if (!elem.hasChildNodes())
return;
@@ -659,7 +666,7 @@
if (spn.nodeName() == "#text")
txt = spn.nodeValue();
else if (spn.nodeName() == "text:span")
- parseTextSpan(spEl, item, tmpStyle, tmpCStyle, cStyle, posC);
+ parseTextSpan(spEl, item, tmpStyle, cStyle, odtStyle, posC);
else if (spn.nodeName() == "text:s")
{
if (spEl.hasAttribute("text:c"))
@@ -682,9 +689,12 @@
txt.replace(QChar(0xAD), SpecialChars::SHYPHEN);
txt.replace(QChar(0x2011), SpecialChars::NBHYPHEN);
txt.replace(QChar(0xA0), SpecialChars::NBSPACE);
- insertChars(item, txt, tmpStyle, tmpCStyle, posC);
- }
- }
+ insertChars(item, txt, tmpStyle, cStyle, posC);
+ }
+ }
+
+ if (textStyleName.length() > 0)
+ m_textStylesStack.pop();
}
void ODTIm::parseTextParagraph(QDomNode &elem, PageItem* item, ParagraphStyle &newStyle, ObjStyleODT &tmpOStyle, int &posC)
@@ -693,9 +703,10 @@
CharStyle tmpCStyle = tmpStyle.charStyle();
ObjStyleODT pStyle = tmpOStyle;
QString parStyleName = "";
- if (elem.toElement().hasAttribute("text:style-name"))
- {
- QString pStyleName = elem.toElement().attribute("text:style-name");
+
+ QString pStyleName = elem.toElement().attribute("text:style-name");
+ if (pStyleName.length() > 0)
+ {
resolveStyle(pStyle, pStyleName);
if (m_Styles.contains(pStyleName))
{
@@ -716,6 +727,7 @@
}
}
}
+ m_textStylesStack.push(pStyleName);
}
if ((pStyle.breakBefore == "column") && (item->itemText.length() > 0))
{
@@ -802,6 +814,9 @@
item->itemText.insertChars(posC, SpecialChars::PARSEP);
item->itemText.applyStyle(posC, tmpStyle);
posC = item->itemText.length();
+
+ if (pStyleName.length() > 0)
+ m_textStylesStack.pop();
}
void ODTIm::parseText(QDomElement &elem, PageItem* item, ObjStyleODT &tmpOStyle)
@@ -1067,15 +1082,57 @@
m_fontMap[actStyle.fontName.value] = tmpOStyle.fontName;
}
}
- else if (parDefaultStyle.fontName.valid)
- {
- tmpOStyle.fontName = constructFontName(parDefaultStyle.fontName.value, "");
- m_fontMap[parDefaultStyle.fontName.value] = tmpOStyle.fontName;
- }
- else if (txtDefaultStyle.fontName.valid)
- {
- tmpOStyle.fontName = constructFontName(txtDefaultStyle.fontName.value, "");
- m_fontMap[txtDefaultStyle.fontName.value] = tmpOStyle.fontName;
+ else
+ {
+ QString fontName;
+ QStack<QString> textStyleStack = m_textStylesStack;
+ while (!textStyleStack.isEmpty())
+ {
+ QString styleName = textStyleStack.pop();
+ if (!m_Styles.contains(styleName))
+ continue;
+ const DrawStyle& odtStyle = m_Styles[styleName];
+ if (odtStyle.fontName.valid)
+ {
+ if (m_fontMap.contains(odtStyle.fontName.value))
+ tmpOStyle.fontName = m_fontMap[odtStyle.fontName.value];
+ else
+ tmpOStyle.fontName = constructFontName(odtStyle.fontName.value, "");
+ if (!PrefsManager::instance()->appPrefs.fontPrefs.AvailFonts.contains(tmpOStyle.fontName))
+ {
+ tmpOStyle.fontName = constructFontName(tmpOStyle.fontName, "");
+ m_fontMap[odtStyle.fontName.value] = tmpOStyle.fontName;
+ }
+ fontName = tmpOStyle.fontName;
+ break;
+ }
+ if (odtStyle.parentStyle.valid)
+ {
+ QVector<QString> parentStyles;
+ DrawStyle drawStyle = odtStyle;
+ while (drawStyle.parentStyle.valid)
+ {
+ if (!m_Styles.contains(drawStyle.parentStyle.value))
+ break;
+ parentStyles.prepend(drawStyle.parentStyle.value);
+ drawStyle = m_Styles[drawStyle.parentStyle.value];
+ }
+ if (parentStyles.count() > 0)
+ textStyleStack += parentStyles;
+ }
+ }
+ if (txtDefaultStyle.fontName.valid && fontName.isEmpty())
+ {
+ tmpOStyle.fontName = constructFontName(txtDefaultStyle.fontName.value, "");
+ m_fontMap[txtDefaultStyle.fontName.value] = tmpOStyle.fontName;
+ fontName = tmpOStyle.fontName;
+ }
+ if (parDefaultStyle.fontName.valid && fontName.isEmpty())
+ {
+ tmpOStyle.fontName = constructFontName(parDefaultStyle.fontName.value, "");
+ m_fontMap[parDefaultStyle.fontName.value] = tmpOStyle.fontName;
+ fontName = tmpOStyle.fontName;
+ }
}
if (actStyle.fontStyle.valid)
tmpOStyle.fontStyle = actStyle.fontStyle.value;
Modified: trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.h
URL: http://scribus.net/websvn/diff.php?repname=Scribus&rev=22118&path=/trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.h
==============================================================================
--- trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.h (original)
+++ trunk/Scribus/scribus/plugins/gettext/odt2im/importodt.h Fri Jul 21 11:14:21 2017
@@ -19,8 +19,10 @@
#include <QDomDocument>
#include <QDomElement>
+#include <QHash>
+#include <QStack>
#include <QString>
-#include <QHash>
+
class ScZipHandler;
extern "C" PLUGIN_API void GetText2(QString filename, QString encoding, bool textOnly, bool prefix, bool append, PageItem *textItem);
@@ -159,6 +161,7 @@
QHash<QString, QString> map_ID_to_Name;
QHash<QString, QString> m_fontMap;
QHash<QString, DrawStyle> m_Styles;
+ QStack<QString> m_textStylesStack;
DrawStyle parDefaultStyle;
DrawStyle txtDefaultStyle;
};
More information about the scribus-commit
mailing list