From ac1081170c5bc2234b14ce99b7ea8e583bac82b5 Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Wed, 6 Sep 2017 19:29:40 -0400 Subject: tdf#109310 ooxmlexport: write Xnote character style LibreOffice will just ignore the defined style on import (since that is statically defined by the footnote code). Microsoft Office, however, requires the character style be provided for the footnote number. It doesn't have any built-in formatting for footnotes. So, this patch is strictly for MSO's benefit. Change-Id: I6631dd0eb697589cfd3c13d7838fe14c31a71bbf Reviewed-on: https://gerrit.libreoffice.org/42035 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- .../data/tdf109310_endnoteStyleForMSO.docx | Bin 0 -> 5109 bytes sw/qa/extras/ooxmlexport/ooxmlexport9.cxx | 7 +++++++ sw/source/filter/ww8/attributeoutputbase.hxx | 2 +- sw/source/filter/ww8/docxattributeoutput.cxx | 18 ++++++++++++++++-- sw/source/filter/ww8/docxattributeoutput.hxx | 2 +- sw/source/filter/ww8/wrtw8nds.cxx | 8 +++++++- 6 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx (limited to 'sw') diff --git a/sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx b/sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx new file mode 100644 index 000000000000..9949b98d5f68 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf109310_endnoteStyleForMSO.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx index a89799b87e39..24016d38c43c 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx @@ -420,6 +420,13 @@ DECLARE_OOXMLEXPORT_TEST(testTdf103975_notPageBreakE, "tdf103975_notPageBreakE.d CPPUNIT_ASSERT_EQUAL(style::BreakType_COLUMN_BEFORE, getProperty(getParagraph(2), "BreakType")); } +DECLARE_OOXMLEXPORT_TEST(testTdf109310_endnoteStyleForMSO, "tdf109310_endnoteStyleForMSO.docx") +{ + xmlDocPtr pXmlDoc = parseExport("word/endnotes.xml"); + if (!pXmlDoc) + return; + assertXPath(pXmlDoc, "/w:endnotes/w:endnote[@w:id='2']/w:p/w:r[1]/w:rPr/w:rStyle", "w:val"); +} DECLARE_OOXMLEXPORT_TEST(testTdf103389, "tdf103389.docx") { diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx b/sw/source/filter/ww8/attributeoutputbase.hxx index 21111322b2f2..00ab40dcb88a 100644 --- a/sw/source/filter/ww8/attributeoutputbase.hxx +++ b/sw/source/filter/ww8/attributeoutputbase.hxx @@ -181,7 +181,7 @@ public: virtual void EndRunProperties( const SwRedlineData* pRedlineData ) = 0; /// docx requires footnoteRef/endnoteRef tag at the beginning of each of them - virtual void FootnoteEndnoteRefTag() {}; + virtual bool FootnoteEndnoteRefTag() { return false; }; /// for docx footnotePr/endnotePr inside sectPr virtual void SectFootnoteEndnotePr() {}; diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 1d0a3dfed712..3d7d8b53957e 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -2096,12 +2096,26 @@ void DocxAttributeOutput::WritePostponedDiagram() m_pPostponedDiagrams.reset(nullptr); } -void DocxAttributeOutput::FootnoteEndnoteRefTag() +bool DocxAttributeOutput::FootnoteEndnoteRefTag() { if( m_footnoteEndnoteRefTag == 0 ) - return; + return false; + + // output the character style for MS Word's benefit + const SwEndNoteInfo& rInfo = m_footnoteEndnoteRefTag == XML_footnoteRef ? + m_rExport.m_pDoc->GetFootnoteInfo() : m_rExport.m_pDoc->GetEndNoteInfo(); + const SwCharFormat* pCharFormat = rInfo.GetCharFormat( *m_rExport.m_pDoc ); + if ( pCharFormat ) + { + const OString aStyleId(m_rExport.m_pStyles->GetStyleId(m_rExport.GetId(pCharFormat))); + m_pSerializer->startElementNS( XML_w, XML_rPr, FSEND ); + m_pSerializer->singleElementNS( XML_w, XML_rStyle, FSNS( XML_w, XML_val ), aStyleId.getStr(), FSEND ); + m_pSerializer->endElementNS( XML_w, XML_rPr ); + } + m_pSerializer->singleElementNS( XML_w, m_footnoteEndnoteRefTag, FSEND ); m_footnoteEndnoteRefTag = 0; + return true; } /** Output sal_Unicode* as a run text (the text). diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index d06486403a07..8024566433f6 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -174,7 +174,7 @@ public: /// Called after we end outputting the attributes. virtual void EndRunProperties( const SwRedlineData* pRedlineData ) override; - virtual void FootnoteEndnoteRefTag() override; + virtual bool FootnoteEndnoteRefTag() override; virtual void SectFootnoteEndnotePr() override; diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx index 4c99f18b1d53..1397526a02d5 100644 --- a/sw/source/filter/ww8/wrtw8nds.cxx +++ b/sw/source/filter/ww8/wrtw8nds.cxx @@ -2153,7 +2153,13 @@ void MSWordExportBase::OutputTextNode( SwTextNode& rNode ) AttrOutput().StartRun( pRedlineData, bSingleEmptyRun ); if( m_nTextTyp == TXT_FTN || m_nTextTyp == TXT_EDN ) - AttrOutput().FootnoteEndnoteRefTag(); + { + if( AttrOutput().FootnoteEndnoteRefTag() ) + { + AttrOutput().EndRun(); + AttrOutput().StartRun( pRedlineData, bSingleEmptyRun ); + } + } if( nNextAttr > nEnd ) nNextAttr = nEnd; -- cgit