Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/2503
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/03/2503/1
fdo#59638 import of DOCX w:lvlOverride / RTF_LFOLEVEL
Also handle RTF_F inside RTF_LISTLEVEL. Word typically uses the Symbol
font to describe bullet characters instead of using a sane Unicode
value, the previous can only be handled if we parse the custom font set
for the list.
(cherry picked from commits 521586b328305c4466603438a9931993b92873c6,
2f82a08d3565239c2bfe8d21fbebd89bd4657708 and
58c30a3545a5725d704eabd79071db02f1f2cb23)
Change-Id: I1491f07c40953949e381a035c1596c207cdc4c35
---
A sw/qa/extras/ooxmlimport/data/fdo59638.docx
M sw/qa/extras/ooxmlimport/ooxmlimport.cxx
A sw/qa/extras/rtfimport/data/fdo59638.rtf
M sw/qa/extras/rtfimport/rtfimport.cxx
M writerfilter/source/dmapper/NumberingManager.cxx
M writerfilter/source/rtftok/rtfdocumentimpl.cxx
M writerfilter/source/rtftok/rtfdocumentimpl.hxx
7 files changed, 118 insertions(+), 2 deletions(-)
diff --git a/sw/qa/extras/ooxmlimport/data/fdo59638.docx
b/sw/qa/extras/ooxmlimport/data/fdo59638.docx
new file mode 100755
index 0000000..d33e7cc
--- /dev/null
+++ b/sw/qa/extras/ooxmlimport/data/fdo59638.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 2c32f13..1ade3ed 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -112,6 +112,7 @@
void testFineTableDash();
void testN779642();
void testFdo53985();
+ void testFdo59638();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -176,6 +177,7 @@
{"tableborder-finedash.docx", &Test::testFineTableDash},
{"n779642.docx", &Test::testN779642},
{"fdo53985.docx", &Test::testFdo53985},
+ {"fdo59638.docx", &Test::testFdo59638},
};
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
{
@@ -1096,6 +1098,29 @@
CPPUNIT_ASSERT_EQUAL(sal_Int32(5), xTables->getCount()); // Only 4 tables were imported.
}
+void Test::testFdo59638()
+{
+ // The problem was that w:lvlOverride inside w:num was ignores by dmapper.
+
+ uno::Reference<beans::XPropertySet>
xPropertySet(getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess>
xLevels(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
+ uno::Sequence<beans::PropertyValue> aProps;
+ xLevels->getByIndex(0) >>= aProps; // 1st level
+
+ for (int i = 0; i < aProps.getLength(); ++i)
+ {
+ const beans::PropertyValue& rProp = aProps[i];
+
+ if (rProp.Name == "BulletChar")
+ {
+ // Was '*', should be 'o'.
+ CPPUNIT_ASSERT_EQUAL(OUString("\xEF\x82\xB7", 3, RTL_TEXTENCODING_UTF8),
rProp.Value.get<OUString>());
+ return;
+ }
+ }
+ CPPUNIT_FAIL("no BulletChar property");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/qa/extras/rtfimport/data/fdo59638.rtf b/sw/qa/extras/rtfimport/data/fdo59638.rtf
new file mode 100644
index 0000000..e2572bf
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/fdo59638.rtf
@@ -0,0 +1,35 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0
+{\fonttbl
+{\f0\fbidi \froman\fcharset238\fprq2
+Times New Roman;}
+{\f2\fbidi \fmodern\fcharset238\fprq1
+Courier New;}
+{\f3\fbidi \froman\fcharset2\fprq2
+Symbol;}
+}
+{\*\listtable
+{\list\listtemplateid-1784933330\listsimple
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0
+{\leveltext\'01*;}
+{\levelnumbers;}
+\hres0\chhres0 }
+{\listname ;}
+\listid-2}
+}
+{\*\listoverridetable
+{\listoverride\listid-2\listoverridecount1
+{\lfolevel\listoverrideformat
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0
+\levelindent0
+{\leveltext\'01\u-3913 ?;}
+{\levelnumbers;}
+\f3\fbias0 }
+}
+\ls1}
+}
+\pard\plain \ltrpar\ql \fi-360\li720\ri0\nowidctlpar\wrapdefault
+\faauto\ls1\rin0\lin720\itap0\pararsid7241016 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0
\fs22\lang1031\langfe1031\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1031\langfenp1031
+{\rtlch\fcs1 \af37 \ltrch\fcs0
+\f37\insrsid15285686 \hich\af37\dbch\af31505\loch\f37 3
+\par }
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 18ae927..b55aad9 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -139,6 +139,7 @@
void testFdo44053();
void testFdo58646line();
void testFdo59953();
+ void testFdo59638();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -228,6 +229,7 @@
{"fdo44053.rtf", &Test::testFdo44053},
{"fdo58646line.rtf", &Test::testFdo58646line},
{"fdo59953.rtf", &Test::testFdo59953},
+ {"fdo59638.rtf", &Test::testFdo59638},
};
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
{
@@ -1085,6 +1087,29 @@
CPPUNIT_ASSERT_EQUAL(sal_Int16(7650), getProperty< uno::Sequence<text::TableColumnSeparator>
(xTableRows->getByIndex(0), "TableColumnSeparators")[0].Position);
}
+void Test::testFdo59638()
+{
+ // The problem was that w:lvlOverride inside w:num was ignores by dmapper.
+
+ uno::Reference<beans::XPropertySet>
xPropertySet(getStyles("NumberingStyles")->getByName("WWNum1"), uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess>
xLevels(xPropertySet->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
+ uno::Sequence<beans::PropertyValue> aProps;
+ xLevels->getByIndex(0) >>= aProps; // 1st level
+
+ for (int i = 0; i < aProps.getLength(); ++i)
+ {
+ const beans::PropertyValue& rProp = aProps[i];
+
+ if (rProp.Name == "BulletChar")
+ {
+ // Was '*', should be 'o'.
+ CPPUNIT_ASSERT_EQUAL(OUString("\xEF\x82\xB7", 3, RTL_TEXTENCODING_UTF8),
rProp.Value.get<OUString>());
+ return;
+ }
+ }
+ CPPUNIT_FAIL("no BulletChar property");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx
b/writerfilter/source/dmapper/NumberingManager.cxx
index 529a794..470cb0c 100644
--- a/writerfilter/source/dmapper/NumberingManager.cxx
+++ b/writerfilter/source/dmapper/NumberingManager.cxx
@@ -495,7 +495,7 @@
for ( sal_Int32 i = 0; i < nThisCount; i++ )
{
uno::Sequence< beans::PropertyValue > level = aThis[i];
- if ( level.getLength( ) == 0 )
+ if ( level.hasElements() )
{
// If the the element contains something, merge it
lcl_mergeProperties( level, aAbstract[i] );
@@ -953,6 +953,13 @@
pLevel->SetParaStyle( pStyle );
}
break;
+ case NS_ooxml::LN_CT_Num_lvlOverride:
+ {
+ writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
+ if (pProperties.get())
+ pProperties->resolve(*this);
+ }
+ break;
case NS_ooxml::LN_EG_RPrBase_rFonts: //contains font properties
case NS_ooxml::LN_EG_RPrBase_color:
case NS_ooxml::LN_EG_RPrBase_u:
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index d966275..c35b0d9 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -1238,6 +1238,10 @@
case RTF_LIST:
m_aStates.top().nDestinationState = DESTINATION_LISTENTRY;
break;
+ case RTF_LFOLEVEL:
+ m_aStates.top().nDestinationState = DESTINATION_LFOLEVEL;
+ m_aStates.top().aTableSprms.clear();
+ break;
case RTF_LISTOVERRIDETABLE:
m_aStates.top().nDestinationState = DESTINATION_LISTOVERRIDETABLE;
break;
@@ -2715,6 +2719,14 @@
{
m_aFontIndexes.push_back(nParam);
m_nCurrentFontIndex = getFontIndex(nParam);
+ }
+ else if (m_aStates.top().nDestinationState == DESTINATION_LISTLEVEL)
+ {
+ RTFSprms aFontSprms;
+ aFontSprms.set(NS_sprm::LN_CRgFtc0, RTFValue::Pointer_t(new
RTFValue(getFontIndex(nParam))));
+ RTFSprms aRunPropsSprms;
+ aRunPropsSprms.set(NS_ooxml::LN_EG_RPrBase_rFonts, RTFValue::Pointer_t(new
RTFValue(RTFSprms(), aFontSprms)));
+ m_aStates.top().aTableSprms.set(NS_ooxml::LN_CT_Lvl_rPr, RTFValue::Pointer_t(new
RTFValue(RTFSprms(), aRunPropsSprms)));
}
else
{
@@ -4195,7 +4207,18 @@
aState.aTableAttributes.set(NS_ooxml::LN_CT_Lvl_ilvl, pInnerValue);
RTFValue::Pointer_t pValue(new RTFValue(aState.aTableAttributes, aState.aTableSprms));
- m_aStates.top().aListLevelEntries.set(NS_ooxml::LN_CT_AbstractNum_lvl, pValue, false);
+ if (m_aStates.top().nDestinationState != DESTINATION_LFOLEVEL)
+ m_aStates.top().aListLevelEntries.set(NS_ooxml::LN_CT_AbstractNum_lvl, pValue, false);
+ else
+ m_aStates.top().aTableSprms.set(NS_ooxml::LN_CT_NumLvl_lvl, pValue);
+ }
+ else if (aState.nDestinationState == DESTINATION_LFOLEVEL)
+ {
+ RTFValue::Pointer_t pInnerValue(new RTFValue(m_aStates.top().nListLevelNum++));
+ aState.aTableAttributes.set(NS_ooxml::LN_CT_NumLvl_ilvl, pInnerValue);
+
+ RTFValue::Pointer_t pValue(new RTFValue(aState.aTableAttributes, aState.aTableSprms));
+ m_aStates.top().aTableSprms.set(NS_ooxml::LN_CT_Num_lvlOverride, pValue);
}
// list override table
else if (aState.nDestinationState == DESTINATION_LISTOVERRIDEENTRY)
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index a26d3ff..c7affd7 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -179,6 +179,7 @@
DESTINATION_MBOX,
DESTINATION_MEQARR,
DESTINATION_UPR,
+ DESTINATION_LFOLEVEL,
};
enum RTFBorderState
--
To view, visit https://gerrit.libreoffice.org/2503
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I1491f07c40953949e381a035c1596c207cdc4c35
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Miklos Vajna <vmiklos@suse.cz>
Context
- [PATCH libreoffice-4-0] fdo#59638 import of DOCX w:lvlOverride / RTF_LFOLEVEL · Miklos Vajna (via Code Review)
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.