Kaydet (Commit) c20a76a0 authored tarafından Miklos Vajna's avatar Miklos Vajna Kaydeden (comit) Andras Timar

tdf#90611 DOCX import: fix missing paragraph style on footnotes

One one hand, a problem since commit
330b8602 (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 9389cf78 (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 519b3430)

Change-Id: I33020ac761c94addfec8164a17863565e4453b07
Reviewed-on: https://gerrit.libreoffice.org/16810Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst da80a5ff
......@@ -2725,6 +2725,16 @@ DECLARE_OOXMLIMPORT_TEST(testTdf87460, "tdf87460.docx")
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), xEndnotes->getCount());
}
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();
......
......@@ -991,7 +991,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_doc_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);
......
......@@ -208,6 +208,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 ),
......@@ -1747,6 +1748,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;
......@@ -1759,9 +1763,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()
{
......
......@@ -393,6 +393,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;
......@@ -607,6 +609,8 @@ public:
void PushFootOrEndnote( bool bIsFootnote );
void PopFootOrEndnote();
bool IsInFootOrEndnote() const { return m_bInFootOrEndnote; }
/// Got a <w:separator/>.
void SeenFootOrEndnoteSeparator();
void PushAnnotation();
void PopAnnotation();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment