diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-19 16:26:59 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-12-19 17:32:06 +0100 |
commit | e155e05ab70f1744d296dbee8c61564a5b7d346c (patch) | |
tree | fd4caaf9ad44103f5a71d4aa54e6940fcce7bf13 | |
parent | f3d54642672b4a4fb6cca0c2439744189de5f0bc (diff) |
DOCX filter: handle decimal number format with no level text correctly
The first problem was that no level text means no list text in Word, but
Writer only does that for the "none" numbering format.
Also, when the numbering format is "none", then Writer doesn't show the
follow character (typically a tab), either, but Word does: add a zero
width space as a suffix to mimic the Word behavior on DOCX import.
Adapt CppunitTest_sw_rtfimport accordingly, that effectively tested that
LabelFollowedBy is lost on import.
Change-Id: I7d5c7e62ba3d02da4a750ba5afad07e68b0b8c38
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx | bin | 0 -> 13517 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 7 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/rtfimport.cxx | 5 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 7 | ||||
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.cxx | 19 |
5 files changed, 36 insertions, 2 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx b/sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx Binary files differnew file mode 100644 index 000000000000..d7ec47997611 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx index 89ead201944f..c65e54649502 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx @@ -99,6 +99,13 @@ DECLARE_OOXMLEXPORT_TEST(testfdo76589 , "fdo76589.docx") assertXPath ( pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:lvlText","val","%1" ); } +DECLARE_OOXMLEXPORT_TEST(testDecimalNumberingNoLeveltext, "decimal-numbering-no-leveltext.docx") +{ + // This was "%1", not empty: we turned a kind-of-none numbering into a decimal one. + if (xmlDocPtr pXmlDoc = parseExport("word/numbering.xml")) + assertXPath (pXmlDoc, "/w:numbering/w:abstractNum[1]/w:lvl[1]/w:lvlText","val", ""); +} + DECLARE_OOXMLEXPORT_TEST(testfdo79008, "fdo79008.docx") { /* File getting crash while saving in LO. diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index 0e651d003829..4a07fd04c1b8 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -582,7 +582,10 @@ DECLARE_RTFIMPORT_TEST(testFdo49692, "fdo49692.rtf") const beans::PropertyValue& rProp = aProps[i]; if (rProp.Name == "Suffix") - CPPUNIT_ASSERT_EQUAL(sal_Int32(0), rProp.Value.get<OUString>().getLength()); + { + OUString aExpected(static_cast<sal_Unicode>(0x200B)); + CPPUNIT_ASSERT_EQUAL(aExpected, rProp.Value.get<OUString>()); + } } } diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index b45371b833cf..4386d5b64b3e 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -5955,7 +5955,12 @@ void DocxAttributeOutput::NumberingLevel( sal_uInt8 nLevel, } else { - m_pSerializer->singleElementNS( XML_w, XML_lvlText,FSNS( XML_w, XML_val ), OUStringToOString( aBuffer.makeStringAndClear(), RTL_TEXTENCODING_UTF8 ).getStr(), FSEND ); + // Writer's "zero width space" suffix is necessary, so that LabelFollowedBy shows up, but Word doesn't require that. + OUString aLevelText = aBuffer.makeStringAndClear(); + static OUString aZeroWidthSpace(static_cast<sal_Unicode>(0x200B)); + if (aLevelText == aZeroWidthSpace) + aLevelText.clear(); + m_pSerializer->singleElementNS(XML_w, XML_lvlText, FSNS(XML_w, XML_val), aLevelText.toUtf8(), FSEND); } // bullet diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index 0a1c52fb8a50..cae1b6aee81a 100644 --- a/writerfilter/source/dmapper/NumberingManager.cxx +++ b/writerfilter/source/dmapper/NumberingManager.cxx @@ -33,6 +33,7 @@ #include <osl/diagnose.h> #include <rtl/ustring.hxx> +#include <comphelper/sequenceashashmap.hxx> #include "dmapperLoggers.hxx" @@ -273,6 +274,10 @@ uno::Sequence< beans::PropertyValue > ListLevel::GetLevelProperties( ) { if (!m_sGraphicURL.isEmpty() || m_sGraphicBitmap.is()) nNumberFormat = style::NumberingType::BITMAP; + else if (m_sBulletChar.isEmpty() && nNumberFormat != style::NumberingType::CHAR_SPECIAL) + // w:lvlText is empty, that means no numbering in Word. + // CHAR_SPECIAL is handled separately below. + nNumberFormat = style::NumberingType::NUMBER_NONE; aNumberingProperties.push_back( MAKE_PROPVAL(PROP_NUMBERING_TYPE, nNumberFormat )); } @@ -619,6 +624,20 @@ void ListDef::CreateNumberingRules( DomainMapper& rDMapper, aLvlProps.realloc( aLvlProps.getLength( ) + 4 ); aLvlProps[sal::static_int_cast<sal_uInt32>(aLvlProps.getLength()) - 4] = MAKE_PROPVAL( PROP_PREFIX, rPrefix ); + + if (sText.isEmpty()) + { + // Empty <w:lvlText>? Then put a Unicode "zero width space" as a suffix, so LabelFollowedBy is still shown, as in Word. + // With empty suffix, Writer does not show LabelFollowedBy, either. + comphelper::SequenceAsHashMap aMap(aLvlProps); + if (aMap.find("NumberingType") != aMap.end()) + { + sal_Int16 nNumberFormat = aMap["NumberingType"].get<sal_Int16>(); + if (nNumberFormat == style::NumberingType::NUMBER_NONE) + rSuffix = OUString(static_cast<sal_Unicode>(0x200B)); + } + } + aLvlProps[sal::static_int_cast<sal_uInt32>(aLvlProps.getLength()) - 3] = MAKE_PROPVAL( PROP_SUFFIX, rSuffix ); aLvlProps[sal::static_int_cast<sal_uInt32>(aLvlProps.getLength()) - 2] = MAKE_PROPVAL( PROP_PARENT_NUMBERING, nParentNum ); |