summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2014-12-19 16:26:59 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2014-12-19 17:32:06 +0100
commite155e05ab70f1744d296dbee8c61564a5b7d346c (patch)
treefd4caaf9ad44103f5a71d4aa54e6940fcce7bf13
parentf3d54642672b4a4fb6cca0c2439744189de5f0bc (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.docxbin0 -> 13517 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport5.cxx7
-rw-r--r--sw/qa/extras/rtfimport/rtfimport.cxx5
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx7
-rw-r--r--writerfilter/source/dmapper/NumberingManager.cxx19
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
new file mode 100644
index 000000000000..d7ec47997611
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/decimal-numbering-no-leveltext.docx
Binary files differ
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 );