sw/qa/extras/rtfimport/data/fdo59638.rtf | 35 +++++++++++++++++++++++++ sw/qa/extras/rtfimport/rtfimport.cxx | 25 +++++++++++++++++ writerfilter/source/rtftok/rtfdocumentimpl.cxx | 35 ++++++++++++++++++++----- writerfilter/source/rtftok/rtfdocumentimpl.hxx | 1 4 files changed, 90 insertions(+), 6 deletions(-)
New commits: commit 58c30a3545a5725d704eabd79071db02f1f2cb23 Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Mar 1 17:38:03 2013 +0100 fdo#59638 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. Change-Id: I1491f07c40953949e381a035c1596c207cdc4c35 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 f923762..e577f42 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -143,6 +143,7 @@ public: void testFdo59419(); void testFdo58076_2(); void testFdo59953(); + void testFdo59638(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -258,6 +259,7 @@ void Test::run() {"fdo59419.rtf", &Test::testFdo59419}, {"fdo58076-2.rtf", &Test::testFdo58076_2}, {"fdo59953.rtf", &Test::testFdo59953}, + {"fdo59638.rtf", &Test::testFdo59638}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -1120,6 +1122,29 @@ void Test::testFdo59953() 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/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 6ef8009..077ce50 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -2721,6 +2721,14 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) 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 { int nFontIndex = getFontIndex(nParam); commit 2f82a08d3565239c2bfe8d21fbebd89bd4657708 Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Mar 1 17:02:59 2013 +0100 fdo#59638 import RTF_LFOLEVEL Change-Id: Icd0ba0bcbf519a15006af2e0eb176c37766345a3 diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index fdc8bb8..6ef8009 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1239,6 +1239,10 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) 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; @@ -4196,7 +4200,18 @@ int RTFDocumentImpl::popState() 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 @@ namespace writerfilter { DESTINATION_MBOX, DESTINATION_MEQARR, DESTINATION_UPR, + DESTINATION_LFOLEVEL, }; enum RTFBorderState commit 24ba80686c9028b4f6dd1f63bfe905c029068b11 Author: Miklos Vajna <vmik...@suse.cz> Date: Fri Mar 1 13:04:41 2013 +0100 rtftok: clean this up, SAL_INFO already provides location info Change-Id: Ib81753bbe26050e2f108c30a1e596a7c34d72fa3 diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 9266505..fdc8bb8 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -1627,7 +1627,7 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword) m_aStates.top().nDestinationState = DESTINATION_NORMAL; break; default: - SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO handle destination '" << lcl_RtfToString(nKeyword) << "'"); + SAL_INFO("writerfilter", "TODO handle destination '" << lcl_RtfToString(nKeyword) << "'"); // Make sure we skip destinations (even without \*) till we don't handle them m_aStates.top().nDestinationState = DESTINATION_SKIP; aSkip.setParsed(false); @@ -1904,7 +1904,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword) } break; default: - SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO handle symbol '" << lcl_RtfToString(nKeyword) << "'"); + SAL_INFO("writerfilter", "TODO handle symbol '" << lcl_RtfToString(nKeyword) << "'"); aSkip.setParsed(false); break; } @@ -2593,7 +2593,7 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) m_aStates.top().aDrawingObject.xPropertySet->setPropertyValue("CornerRadius", uno::makeAny(sal_Int32(83))); break; default: - SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO handle flag '" << lcl_RtfToString(nKeyword) << "'"); + SAL_INFO("writerfilter", "TODO handle flag '" << lcl_RtfToString(nKeyword) << "'"); aSkip.setParsed(false); break; } @@ -3415,7 +3415,7 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) } break; default: - SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO handle value '" << lcl_RtfToString(nKeyword) << "'"); + SAL_INFO("writerfilter", "TODO handle value '" << lcl_RtfToString(nKeyword) << "'"); aSkip.setParsed(false); break; } @@ -3512,7 +3512,7 @@ int RTFDocumentImpl::dispatchToggle(RTFKeyword nKeyword, bool bParam, int nParam } break; default: - SAL_INFO("writerfilter", OSL_THIS_FUNC << ": TODO handle toggle '" << lcl_RtfToString(nKeyword) << "'"); + SAL_INFO("writerfilter", "TODO handle toggle '" << lcl_RtfToString(nKeyword) << "'"); aSkip.setParsed(false); break; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits