summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-07-06 09:23:40 +0200
committerAndras Timar <andras.timar@collabora.com>2015-09-28 10:06:37 +0200
commit27cededd6443bc0b0654a2e4fa8f5ffdcfa2029c (patch)
treee8f44df55b8759251d250cdcac2baebab6231774
parent03b9aee3f8570511b225953e3e9285a3b984b9eb (diff)
tdf#90611 DOCX import: fix missing paragraph style on footnotes
One one hand, a problem since commit 330b860205c7ba69dd6603f65324d0f89ad9cd5f (fdo#68787 DOCX import: handle when w:separator is missing for footnotes, 2013-09-04) was that the type attribute from <w:footnote w:type="separator"> resulted in two ooxml:CT_FtnEdn_type tokens, ignoring too many paragraph ends for footnotes, which resulted in missing paragraph style on footnotes. On the other hand, fixing the first problem showed that it wasn't correct that commit 9389cf78e304a5a99bcf1745b9388e14ac36281a (cp#1000018 RTF import: empty para at the end of footnote text got lost, 2013-11-15) unconditionally removed the RemoveLastParagraph() call in DomainMapper_Impl::PopFootOrEndnote(). It turns out that RTF and DOCX have different semantics here, the footnote is always within a <p></p> pair in DOCX, while in RTF a \par at the end of a footnote means an empty paragraph. Fix that by conditionally restoring the removed RemoveLastParagraph() call. (cherry picked from commit 519b34300f73b1e08f6194d6ba49d4fc010cf186) Reviewed-on: https://gerrit.libreoffice.org/16879 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com> (cherry picked from commit 884dd05b7c22db2b51bb2c34e81561c43b86b225) Conflicts: sw/qa/extras/ooxmlimport/ooxmlimport.cxx writerfilter/source/dmapper/DomainMapper.cxx Change-Id: I33020ac761c94addfec8164a17863565e4453b07
-rw-r--r--sw/qa/extras/ooxmlimport/data/tdf90611.docxbin0 -> 14706 bytes
-rw-r--r--sw/qa/extras/ooxmlimport/ooxmlimport.cxx10
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx2
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.cxx13
-rw-r--r--writerfilter/source/dmapper/DomainMapper_Impl.hxx4
5 files changed, 28 insertions, 1 deletions
diff --git a/sw/qa/extras/ooxmlimport/data/tdf90611.docx b/sw/qa/extras/ooxmlimport/data/tdf90611.docx
new file mode 100644
index 000000000000..ac54feedd05f
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/tdf90611.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 57210d97fa5c..3168e1105b67 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -2429,6 +2429,16 @@ DECLARE_OOXMLIMPORT_TEST(testFdo87488, "fdo87488.docx")
}
}
+DECLARE_OOXMLIMPORT_TEST(testTdf90611, "tdf90611.docx")
+{
+ uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xFootnotes(xFootnotesSupplier->getFootnotes(), uno::UNO_QUERY);
+ uno::Reference<text::XText> xFootnoteText;
+ xFootnotes->getByIndex(0) >>= xFootnoteText;
+ // This was 11.
+ CPPUNIT_ASSERT_EQUAL(10.f, getProperty<float>(getParagraphOfText(1, xFootnoteText), "CharHeight"));
+}
+
#endif
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 4784c160d0ed..4bed79b9ec64 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -924,7 +924,7 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
case NS_ooxml::LN_CT_FtnEdn_type:
// This is the "separator" footnote, ignore its linebreak.
if (static_cast<sal_uInt32>(nIntValue) == NS_ooxml::LN_Value_wordprocessingml_ST_FtnEdn_separator)
- m_pImpl->m_bIgnoreNextPara = true;
+ m_pImpl->SeenFootOrEndnoteSeparator();
break;
case NS_ooxml::LN_CT_DataBinding_prefixMappings:
m_pImpl->appendGrabBag(m_pImpl->m_aInteropGrabBag, "ooxml:CT_DataBinding_prefixMappings", sStringValue);
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index e2eaeec0b3cf..78675d09cb43 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -179,6 +179,7 @@ DomainMapper_Impl::DomainMapper_Impl(
m_bInHeaderFooterImport( false ),
m_bDiscardHeaderFooter( false ),
m_bInFootOrEndnote(false),
+ m_bSeenFootOrEndnoteSeparator(false),
m_bLineNumberingSet( false ),
m_bIsInFootnoteProperties( false ),
m_bIsCustomFtnMark( false ),
@@ -1757,6 +1758,9 @@ void DomainMapper_Impl::PushAnnotation()
void DomainMapper_Impl::PopFootOrEndnote()
{
+ if (!IsRTFImport())
+ RemoveLastParagraph();
+
// In case the foot or endnote did not contain a tab.
m_bIgnoreNextTab = false;
@@ -1769,9 +1773,18 @@ void DomainMapper_Impl::PopFootOrEndnote()
return;
}
m_aRedlines.pop();
+ m_bSeenFootOrEndnoteSeparator = false;
m_bInFootOrEndnote = false;
}
+void DomainMapper_Impl::SeenFootOrEndnoteSeparator()
+{
+ if (!m_bSeenFootOrEndnoteSeparator)
+ {
+ m_bSeenFootOrEndnoteSeparator = true;
+ m_bIgnoreNextPara = true;
+ }
+}
void DomainMapper_Impl::PopAnnotation()
{
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 68e1af78b22d..6702ce01e1e3 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -369,6 +369,8 @@ private:
bool m_bInHeaderFooterImport;
bool m_bDiscardHeaderFooter;
bool m_bInFootOrEndnote;
+ /// Did we get a <w:separator/> for this footnote already?
+ bool m_bSeenFootOrEndnoteSeparator;
bool m_bLineNumberingSet;
bool m_bIsInFootnoteProperties;
@@ -587,6 +589,8 @@ public:
void PushFootOrEndnote( bool bIsFootnote );
void PopFootOrEndnote();
bool IsInFootOrEndnote() const { return m_bInFootOrEndnote; }
+ /// Got a <w:separator/>.
+ void SeenFootOrEndnoteSeparator();
void PushAnnotation();
void PopAnnotation();