sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx |binary sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx | 9 ++++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 16 ++++++++++++++- sw/source/filter/ww8/docxattributeoutput.hxx | 2 + writerfilter/source/ooxml/modelpreprocess.py | 5 ---- 5 files changed, 26 insertions(+), 6 deletions(-)
New commits: commit 60974f5643745b7714b5a8629d9c574224b67e8c Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Aug 21 15:09:29 2014 +0200 DOCX export: prevent multiple paragraphs in some SDT containers E.g. Word doesn't do anything if you hit return in the middle of a title; if that's so, then we should handle this situation on export as well. Change-Id: Ib5b52a59250b09c97023b53906b8046f530d0e31 diff --git a/sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx b/sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx new file mode 100644 index 0000000..96d25ff Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sdt-company-multipara.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx index d52423f..9a8951d 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlfieldexport.cxx @@ -628,6 +628,15 @@ DECLARE_OOXMLEXPORT_TEST(testSdtHeader, "sdt-header.docx") assertXPath(pXmlDoc, "//w:sdt/w:sdtPr/w:date", 1); } +DECLARE_OOXMLEXPORT_TEST(testSdtCompanyMultipara, "sdt-company-multipara.docx") +{ + if (xmlDocPtr pXmlDoc = parseExport("word/document.xml")) + { + // This was 3, but multiple paragraphs inside "Company" SDT is now allowed. + assertXPath(pXmlDoc, "//w:sdtContent/w:p", 1); + } +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 5e59bcc..f6ec6e3 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -223,6 +223,12 @@ void DocxAttributeOutput::RTLAndCJKState( bool bIsRTL, sal_uInt16 /*nScript*/ ) m_pSerializer->singleElementNS( XML_w, XML_rtl, FSNS( XML_w, XML_val ), "true", FSEND ); } +/// Are multiple paragraphs disallowed inside this type of SDT? +static bool lcl_isOnelinerSdt(const OUString& rName) +{ + return rName == "Title" || rName == "Subtitle" || rName == "Company"; +} + void DocxAttributeOutput::StartParagraph( ww8::WW8TableNodeInfo::Pointer_t pTextNodeInfo ) { if ( m_nColBreakStatus == COLBRK_POSTPONE ) @@ -292,12 +298,15 @@ void DocxAttributeOutput::StartParagraph( ww8::WW8TableNodeInfo::Pointer_t pText bEndParaSdt = m_bStartedParaSdt && rMap.find("ParaSdtEndBefore") != rMap.end(); } } - if (bEndParaSdt || (m_bStartedParaSdt && m_bHadSectPr)) + // TODO also avoid multiline paragarphs in those SDT types for shape text + bool bOneliner = m_bStartedParaSdt && !m_rExport.SdrExporter().IsDMLAndVMLDrawingOpen() && lcl_isOnelinerSdt(m_aStartedParagraphSdtPrAlias); + if (bEndParaSdt || (m_bStartedParaSdt && m_bHadSectPr) || bOneliner) { // This is the common case: "close sdt before the current paragraph" was requrested by the next paragraph. EndSdtBlock(); bEndParaSdt = false; m_bStartedParaSdt = false; + m_aStartedParagraphSdtPrAlias = ""; } m_bHadSectPr = false; @@ -7951,6 +7960,7 @@ void DocxAttributeOutput::ParaGrabBag(const SfxGrabBagItem& rItem) { if (!(aPropertyValue.Value >>= m_aParagraphSdtPrAlias)) SAL_WARN("sw.ww8", "DocxAttributeOutput::ParaGrabBag: unexpected sdt alias value"); + m_aStartedParagraphSdtPrAlias = m_aParagraphSdtPrAlias; } else if (aPropertyValue.Name == "ooxml:CT_SdtPr_checkbox") { @@ -8007,6 +8017,10 @@ void DocxAttributeOutput::ParaGrabBag(const SfxGrabBagItem& rItem) uno::Sequence<beans::PropertyValue> aAttributes = i->second.get< uno::Sequence<beans::PropertyValue> >(); m_pTableStyleExport->CnfStyle(aAttributes); } + else if (i->first == "ParaSdtEndBefore") + { + // Handled already in StartParagraph(). + } else SAL_WARN("sw.ww8", "DocxAttributeOutput::ParaGrabBag: unhandled grab bag property " << i->first ); } diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index d0bfe92..1277203 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -911,6 +911,8 @@ private: ::sax_fastparser::FastAttributeList *m_pRunSdtPrDataBindingAttrs; /// Value of the <w:alias> paragraph SDT element. OUString m_aParagraphSdtPrAlias; + /// Same as m_aParagraphSdtPrAlias, but its content is aviailable till the SDT is closed. + OUString m_aStartedParagraphSdtPrAlias; OUString m_aRunSdtPrAlias; /// Currently paragraph SDT has a <w:id> child element. bool m_bParagraphSdtHasId; commit 42faa9f0514c2f55f19cc04338518fd039e2883a Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Thu Aug 21 13:05:04 2014 +0200 writerfilter: remove unused qname attribute Change-Id: I412390fba4caa4579dec0dab68f4a1c276284118 diff --git a/writerfilter/source/ooxml/modelpreprocess.py b/writerfilter/source/ooxml/modelpreprocess.py index 11fa3e8..246fae3 100644 --- a/writerfilter/source/ooxml/modelpreprocess.py +++ b/writerfilter/source/ooxml/modelpreprocess.py @@ -134,11 +134,6 @@ def preprocess(model): localname = j.getAttribute("name") # set the attributes - qname = "" - if len(ns): - qname += ns + ":" - j.setAttribute("qname", qname + localname) - j.setAttribute("prefix", prefix) j.setAttribute("localname", localname) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits