i18npool/qa/cppunit/test_defaultnumberingprovider.cxx | 58 ++++++++ i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx | 17 +- include/editeng/svxenum.hxx | 4 include/svtools/rtfkeywd.hxx | 12 + offapi/com/sun/star/style/NumberingType.idl | 14 + sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt |binary sw/qa/extras/odfexport/odfexport.cxx | 13 + sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport14.cxx | 13 + sw/qa/extras/rtfexport/rtfexport5.cxx | 32 ++++ sw/source/filter/ww8/docxattributeoutput.cxx | 30 +++- sw/source/filter/ww8/docxexport.cxx | 5 sw/source/filter/ww8/rtfattributeoutput.cxx | 71 ++++++++++ sw/source/filter/ww8/rtfattributeoutput.hxx | 4 sw/source/filter/ww8/rtfexport.cxx | 5 writerfilter/source/dmapper/ConversionHelper.cxx | 12 + writerfilter/source/dmapper/ConversionHelper.hxx | 1 writerfilter/source/dmapper/DomainMapper.cxx | 43 +++++- writerfilter/source/dmapper/NumberingManager.cxx | 46 +++++- writerfilter/source/dmapper/NumberingManager.hxx | 3 writerfilter/source/ooxml/model.xml | 10 + writerfilter/source/rtftok/rtfdispatchflag.cxx | 23 ++- writerfilter/source/rtftok/rtfdispatchvalue.cxx | 11 - 23 files changed, 393 insertions(+), 34 deletions(-)
New commits: commit e654b1e27eb1690104d360dfc1a7d7ef84dd220f Author: Miklos Vajna <[email protected]> AuthorDate: Fri Mar 20 13:38:45 2020 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Tue May 19 11:30:10 2020 +0200 sw pad-to-4 numbering: add doc model, UNO API and layout This is the actual numbering the customer needed, pad-to-2 and pad-to-3 was added just for compleness (since Word has it and it's related). (cherry picked from commit fcef4857e042ff3c9dd8a6c60cf1a58e07f3224c) Change-Id: I7fdf67488955ab3ee0db169f11fffd21d9cc1e3b diff --git a/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx b/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx index 4418a283de2b..e5991ee6461d 100644 --- a/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx +++ b/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx @@ -81,6 +81,35 @@ CPPUNIT_TEST_FIXTURE(I18npoolDefaultnumberingproviderTest, testArabicZero3) CPPUNIT_ASSERT_EQUAL(OUString("100"), aActual); } +CPPUNIT_TEST_FIXTURE(I18npoolDefaultnumberingproviderTest, testArabicZero4) +{ + uno::Reference<uno::XComponentContext> xComponentContext + = comphelper::getComponentContext(getMultiServiceFactory()); + + // 100 -> "0100" + uno::Reference<text::XNumberingFormatter> xFormatter( + text::DefaultNumberingProvider::create(xComponentContext), uno::UNO_QUERY); + uno::Sequence<beans::PropertyValue> aProperties = { + comphelper::makePropertyValue("NumberingType", + static_cast<sal_uInt16>(style::NumberingType::ARABIC_ZERO4)), + comphelper::makePropertyValue("Value", static_cast<sal_Int32>(100)), + }; + lang::Locale aLocale; + OUString aActual = xFormatter->makeNumberingString(aProperties, aLocale); + // Without the accompanying fix in place, this test would have failed with a + // lang.IllegalArgumentException, support for ARABIC_ZERO4 was missing. + CPPUNIT_ASSERT_EQUAL(OUString("0100"), aActual); + + // 1000 -> "1000" + aProperties = { + comphelper::makePropertyValue("NumberingType", + static_cast<sal_uInt16>(style::NumberingType::ARABIC_ZERO4)), + comphelper::makePropertyValue("Value", static_cast<sal_Int32>(1000)), + }; + aActual = xFormatter->makeNumberingString(aProperties, aLocale); + CPPUNIT_ASSERT_EQUAL(OUString("1000"), aActual); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx index 39b7954cee7a..5f79508a6766 100644 --- a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx +++ b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx @@ -945,6 +945,10 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal result += lcl_formatArabicZero(number, 3); break; + case ARABIC_ZERO4: + result += lcl_formatArabicZero(number, 4); + break; + default: OSL_ASSERT(false); throw IllegalArgumentException(); diff --git a/include/editeng/svxenum.hxx b/include/editeng/svxenum.hxx index eced6c884afa..b020ebd26e50 100644 --- a/include/editeng/svxenum.hxx +++ b/include/editeng/svxenum.hxx @@ -208,6 +208,7 @@ enum SvxNumType : sal_Int16 SVX_NUM_SYMBOL_CHICAGO = css::style::NumberingType::SYMBOL_CHICAGO, SVX_NUM_ARABIC_ZERO = css::style::NumberingType::ARABIC_ZERO, SVX_NUM_ARABIC_ZERO3 = css::style::NumberingType::ARABIC_ZERO3, + SVX_NUM_ARABIC_ZERO4 = css::style::NumberingType::ARABIC_ZERO4, }; #endif diff --git a/offapi/com/sun/star/style/NumberingType.idl b/offapi/com/sun/star/style/NumberingType.idl index 2ecf03734e10..e19bd25aecd3 100644 --- a/offapi/com/sun/star/style/NumberingType.idl +++ b/offapi/com/sun/star/style/NumberingType.idl @@ -506,6 +506,13 @@ published constants NumberingType @since LibreOffice 7.0 */ const short ARABIC_ZERO3 = 65; + + /** Numbering is in Arabic numbers, padded with zero to have a length of at least four, as + "0001, 0002, ..., 1000, 1001, ...". + + @since LibreOffice 7.0 + */ + const short ARABIC_ZERO4 = 66; }; commit c62f573b3ecb89cc842ea88b61e99863a33d4212 Author: Miklos Vajna <[email protected]> AuthorDate: Thu Mar 19 17:54:26 2020 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Tue May 19 11:30:10 2020 +0200 sw pad-to-3 numbering: add DOCX filter There is no NS_ooxml::LN_Value_ST_NumberFormat_foo code for this on the import side, rather the number format code is set to NS_ooxml::LN_Value_ST_NumberFormat_custom, then a separate NS_ooxml::LN_CT_NumFmt_format contains the number format string. Declare w14 as an XML namespace on the export side, even if we write no <w14:something> elements. This is needed by <mc:Choice Requires="w14">, which refers to an XML namespace in the OOXML markup. (Interestingly officeotron doesn't check for this, though.) (cherry picked from commit 52ed1091be05d5a07a021403095c52f0f3986ed6) Change-Id: If5fbcea4f163bd4d1a1ed820e15ceb61dc9c0519 diff --git a/sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx b/sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx new file mode 100644 index 000000000000..bd95186a6091 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/arabic-zero3-numbering.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx index 71e17ec25964..379ae540bb46 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx @@ -121,6 +121,19 @@ DECLARE_ODFEXPORT_TEST(testArabicZeroNumbering, "arabic-zero-numbering.docx") aMap["NumberingType"].get<sal_uInt16>()); } +DECLARE_ODFEXPORT_TEST(testArabicZero3Numbering, "arabic-zero3-numbering.docx") +{ + auto xNumberingRules + = getProperty<uno::Reference<container::XIndexAccess>>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 65 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO3. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(style::NumberingType::ARABIC_ZERO3), + aMap["NumberingType"].get<sal_uInt16>()); +} + CPPUNIT_TEST_FIXTURE(Test, testArabicZeroNumberingFootnote) { // Create a document, set footnote numbering type to ARABIC_ZERO. diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index c4f01bbcb804..fafd5c5d189b 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -6321,7 +6321,7 @@ static OString impl_NumberingType( sal_uInt16 nNumberingType ) } // Converting Level Numbering Format Code to string -static OString impl_LevelNFC( sal_uInt16 nNumberingType , const SfxItemSet *pOutSet) +static OString impl_LevelNFC(sal_uInt16 nNumberingType, const SfxItemSet* pOutSet, OString& rFormat) { OString aType; @@ -6374,6 +6374,10 @@ static OString impl_LevelNFC( sal_uInt16 nNumberingType , const SfxItemSet *pOut case style::NumberingType::TEXT_ORDINAL: aType="ordinalText"; break; case style::NumberingType::SYMBOL_CHICAGO: aType="chicago"; break; case style::NumberingType::ARABIC_ZERO: aType = "decimalZero"; break; + case style::NumberingType::ARABIC_ZERO3: + aType = "custom"; + rFormat = "001, 002, 003, ..."; + break; /* Fallback the rest to decimal. case style::NumberingType::NATIVE_NUMBERING: @@ -6787,10 +6791,30 @@ void DocxAttributeOutput::NumberingLevel( sal_uInt8 nLevel, FSNS( XML_w, XML_val ), m_rExport.m_pStyles->GetStyleId(nId) ); } // format - OString aFormat( impl_LevelNFC( nNumberingType ,pOutSet) ); + OString aCustomFormat; + OString aFormat(impl_LevelNFC(nNumberingType, pOutSet, aCustomFormat)); if ( !aFormat.isEmpty() ) - m_pSerializer->singleElementNS(XML_w, XML_numFmt, FSNS(XML_w, XML_val), aFormat); + { + if (aCustomFormat.isEmpty()) + { + m_pSerializer->singleElementNS(XML_w, XML_numFmt, FSNS(XML_w, XML_val), aFormat); + } + else + { + m_pSerializer->startElementNS(XML_mc, XML_AlternateContent); + m_pSerializer->startElementNS(XML_mc, XML_Choice, XML_Requires, "w14"); + + m_pSerializer->singleElementNS(XML_w, XML_numFmt, FSNS(XML_w, XML_val), aFormat, + FSNS(XML_w, XML_format), aCustomFormat); + + m_pSerializer->endElementNS(XML_mc, XML_Choice); + m_pSerializer->startElementNS(XML_mc, XML_Fallback); + m_pSerializer->singleElementNS(XML_w, XML_numFmt, FSNS(XML_w, XML_val), "decimal"); + m_pSerializer->endElementNS(XML_mc, XML_Fallback); + m_pSerializer->endElementNS(XML_mc, XML_AlternateContent); + } + } // suffix const char *pSuffix = nullptr; diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx index b0f1ccf51627..a46b3eb779a2 100644 --- a/sw/source/filter/ww8/docxexport.cxx +++ b/sw/source/filter/ww8/docxexport.cxx @@ -762,7 +762,10 @@ void DocxExport::WriteNumbering() FSNS( XML_xmlns, XML_w ), m_pFilter->getNamespaceURL(OOX_NS(doc)).toUtf8(), FSNS( XML_xmlns, XML_o ), m_pFilter->getNamespaceURL(OOX_NS(vmlOffice)).toUtf8(), FSNS( XML_xmlns, XML_r ), m_pFilter->getNamespaceURL(OOX_NS(officeRel)).toUtf8(), - FSNS( XML_xmlns, XML_v ), m_pFilter->getNamespaceURL(OOX_NS(vml)).toUtf8() ); + FSNS( XML_xmlns, XML_v ), m_pFilter->getNamespaceURL(OOX_NS(vml)).toUtf8(), + FSNS( XML_xmlns, XML_mc ), m_pFilter->getNamespaceURL(OOX_NS(mce)).toUtf8(), + FSNS( XML_xmlns, XML_w14 ), m_pFilter->getNamespaceURL(OOX_NS(w14)).toUtf8(), + FSNS( XML_mc, XML_Ignorable ), "w14" ); BulletDefinitions(); diff --git a/writerfilter/source/dmapper/ConversionHelper.cxx b/writerfilter/source/dmapper/ConversionHelper.cxx index 81d0dce54fa9..d8ca06e5ed34 100644 --- a/writerfilter/source/dmapper/ConversionHelper.cxx +++ b/writerfilter/source/dmapper/ConversionHelper.cxx @@ -614,6 +614,18 @@ sal_Int16 ConvertNumberingType(sal_Int32 nFmt) return nRet; } +sal_Int16 ConvertCustomNumberFormat(const OUString& rFormat) +{ + sal_Int16 nRet = -1; + + if (rFormat == "001, 002, 003, ...") + { + nRet = style::NumberingType::ARABIC_ZERO3; + } + + return nRet; +} + util::DateTime ConvertDateStringToDateTime( const OUString& rDateTime ) { util::DateTime aDateTime; diff --git a/writerfilter/source/dmapper/ConversionHelper.hxx b/writerfilter/source/dmapper/ConversionHelper.hxx index 25ca7f8b8ce9..fd7a85870d2b 100644 --- a/writerfilter/source/dmapper/ConversionHelper.hxx +++ b/writerfilter/source/dmapper/ConversionHelper.hxx @@ -51,6 +51,7 @@ namespace ConversionHelper{ sal_Int16 convertTableJustification( sal_Int32 nIntValue ); css::text::RubyAdjust convertRubyAlign( sal_Int32 nIntValue ); sal_Int16 ConvertNumberingType(sal_Int32 nFmt); + sal_Int16 ConvertCustomNumberFormat(const OUString& rFormat); css::util::DateTime ConvertDateStringToDateTime(const OUString& rDateTime); } // namespace ConversionHelper diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index e3feb55ee2ef..5a74e421a31b 100644 --- a/writerfilter/source/dmapper/NumberingManager.cxx +++ b/writerfilter/source/dmapper/NumberingManager.cxx @@ -130,6 +130,8 @@ void ListLevel::SetValue( Id nId, sal_Int32 nValue ) m_bHasValues = true; } +void ListLevel::SetCustomNumberFormat(const OUString& rValue) { m_aCustomNumberFormat = rValue; } + bool ListLevel::HasValues() const { return m_bHasValues; @@ -190,7 +192,15 @@ uno::Sequence<beans::PropertyValue> ListLevel::GetLevelProperties(bool bDefaults if( m_nIStartAt >= 0) aNumberingProperties.push_back(lcl_makePropVal<sal_Int16>(PROP_START_WITH, m_nIStartAt) ); - sal_Int16 nNumberFormat = ConversionHelper::ConvertNumberingType(m_nNFC); + sal_Int16 nNumberFormat = -1; + if (m_nNFC == NS_ooxml::LN_Value_ST_NumberFormat_custom) + { + nNumberFormat = ConversionHelper::ConvertCustomNumberFormat(m_aCustomNumberFormat); + } + else + { + nNumberFormat = ConversionHelper::ConvertNumberingType(m_nNFC); + } if( m_nNFC >= 0) { if (m_xGraphicBitmap.is()) @@ -692,8 +702,17 @@ void ListsManager::lcl_attribute( Id nName, Value& rVal ) case NS_ooxml::LN_CT_Lvl_isLgl: case NS_ooxml::LN_CT_Lvl_legacy: if ( pCurrentLvl.get( ) ) - pCurrentLvl->SetValue( nName, sal_Int32( nIntValue ) ); - break; + { + if (nName == NS_ooxml::LN_CT_NumFmt_format) + { + pCurrentLvl->SetCustomNumberFormat(rVal.getString()); + } + else + { + pCurrentLvl->SetValue(nName, sal_Int32(nIntValue)); + } + } + break; case NS_ooxml::LN_CT_Num_numId: m_pCurrentDefinition->SetId( rVal.getString().toInt32( ) ); break; diff --git a/writerfilter/source/dmapper/NumberingManager.hxx b/writerfilter/source/dmapper/NumberingManager.hxx index 3949c3bf7dcd..88ce887869a1 100644 --- a/writerfilter/source/dmapper/NumberingManager.hxx +++ b/writerfilter/source/dmapper/NumberingManager.hxx @@ -45,6 +45,8 @@ class ListLevel : public PropertyMap sal_Int32 m_nIStartAt; //LN_CT_Lvl_start sal_Int32 m_nStartOverride; sal_Int32 m_nNFC; //LN_CT_Lvl_numFmt + /// LN_CT_NumFmt_format, in case m_nNFC is custom. + OUString m_aCustomNumberFormat; sal_Int16 m_nXChFollow; //LN_IXCHFOLLOW OUString m_sBulletChar; css::awt::Size m_aGraphicSize; @@ -69,6 +71,7 @@ public: // Setters for the import void SetValue( Id nId, sal_Int32 nValue ); + void SetCustomNumberFormat(const OUString& rValue); void SetBulletChar( const OUString& sValue ) { m_sBulletChar = sValue; }; void SetGraphicSize( const css::awt::Size& aValue ) { m_aGraphicSize = aValue; }; commit 0acdc84c5053dc32c0f65ec416f3f21502537496 Author: Miklos Vajna <[email protected]> AuthorDate: Mon Mar 16 17:25:31 2020 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Tue May 19 11:30:09 2020 +0200 DOCX import: tokenize <w:numFmt w:val="custom" w:format="..."> Which means CT_NumFmt has to be a property resource, not a single value, and also ST_NumberFormat needs to recognize "custom" as a valid value. Adapt the RTF tokenizer to emit the new token format. This is needed (but not enough) to support markup like this: <w:numFmt w:val="custom" w:format="001, 002, 003, ..."/> (cherry picked from commit 496197fe4dff2cd94ceeb42fc04d0263ac8d8971) Conflicts: writerfilter/source/dmapper/NumberingManager.cxx writerfilter/source/rtftok/rtfdispatchvalue.cxx Change-Id: I767e4b92fc41f9425f446d6eaad1d875e2233964 diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 72ec656a7574..a749169dc009 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -1180,6 +1180,37 @@ void DomainMapper::lcl_attribute(Id nName, Value & val) m_pImpl->startOrEndPermissionRange(nIntValue); break; } + case NS_ooxml::LN_CT_NumFmt_val: + { + try + { + uno::Reference<beans::XPropertySet> xFtnEdnSettings; + if (m_pImpl->IsInFootnoteProperties()) + { + uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier( + m_pImpl->GetTextDocument(), uno::UNO_QUERY); + if (xFootnotesSupplier.is()) + xFtnEdnSettings = xFootnotesSupplier->getFootnoteSettings(); + } + else + { + uno::Reference<text::XEndnotesSupplier> xEndnotesSupplier( + m_pImpl->GetTextDocument(), uno::UNO_QUERY); + if (xEndnotesSupplier.is()) + xFtnEdnSettings = xEndnotesSupplier->getEndnoteSettings(); + } + if (xFtnEdnSettings.is()) + { + sal_Int16 nNumType = ConversionHelper::ConvertNumberingType(nIntValue); + xFtnEdnSettings->setPropertyValue(getPropertyName(PROP_NUMBERING_TYPE), + uno::makeAny(nNumType)); + } + } + catch (const uno::Exception&) + { + } + } + break; default: SAL_WARN("writerfilter", "DomainMapper::lcl_attribute: unhandled token: " << nName); } @@ -2290,10 +2321,18 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, const PropertyMapPtr& rContext ) //endnotes in word can be at section end or document end - writer supports only the latter // -> so this property can be ignored break; - case NS_ooxml::LN_EG_FtnEdnNumProps_numStart: - case NS_ooxml::LN_EG_FtnEdnNumProps_numRestart: case NS_ooxml::LN_CT_FtnProps_numFmt: case NS_ooxml::LN_CT_EdnProps_numFmt: + { + writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); + if (pProperties.get()) + { + pProperties->resolve(*this); + } + } + break; + case NS_ooxml::LN_EG_FtnEdnNumProps_numStart: + case NS_ooxml::LN_EG_FtnEdnNumProps_numRestart: { try { diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx index 764fe2a387a7..e3feb55ee2ef 100644 --- a/writerfilter/source/dmapper/NumberingManager.cxx +++ b/writerfilter/source/dmapper/NumberingManager.cxx @@ -105,7 +105,7 @@ void ListLevel::SetValue( Id nId, sal_Int32 nValue ) case NS_ooxml::LN_CT_NumLvl_startOverride: m_nStartOverride = nValue; break; - case NS_ooxml::LN_CT_Lvl_numFmt: + case NS_ooxml::LN_CT_NumFmt_val: m_nNFC = nValue; break; case NS_ooxml::LN_CT_Lvl_isLgl: @@ -687,6 +687,8 @@ void ListsManager::lcl_attribute( Id nName, Value& rVal ) break; case NS_ooxml::LN_CT_Lvl_start: case NS_ooxml::LN_CT_Lvl_numFmt: + case NS_ooxml::LN_CT_NumFmt_format: + case NS_ooxml::LN_CT_NumFmt_val: case NS_ooxml::LN_CT_Lvl_isLgl: case NS_ooxml::LN_CT_Lvl_legacy: if ( pCurrentLvl.get( ) ) @@ -909,18 +911,29 @@ void ListsManager::lcl_sprm( Sprm& rSprm ) bIsStartVisited = true; break; case NS_ooxml::LN_CT_Lvl_numFmt: - case NS_ooxml::LN_CT_Lvl_isLgl: - case NS_ooxml::LN_CT_Lvl_legacy: + { + writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); + if (pProperties.get()) + { + pProperties->resolve(*this); + } if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel()) { - pCurrentLevel->SetValue( nSprmId, nIntValue ); if( !bIsStartVisited ) { pCurrentLevel->SetValue( NS_ooxml::LN_CT_Lvl_start, 0 ); bIsStartVisited = true; } } + } break; + case NS_ooxml::LN_CT_Lvl_isLgl: + case NS_ooxml::LN_CT_Lvl_legacy: + if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel()) + { + pCurrentLevel->SetValue(nSprmId, nIntValue); + } + break; case NS_ooxml::LN_CT_Lvl_suff: { if (ListLevel::Pointer pCurrentLevel = m_pCurrentDefinition->GetCurrentLevel()) diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 17c8f5217fec..eb84d6e6a4e8 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -12880,6 +12880,7 @@ <value>thaiNumbers</value> <!-- Thai Counting System --> <value>thaiCounting</value> + <value>custom</value> </choice> </define> <define name="ST_PageOrientation"> @@ -14795,6 +14796,9 @@ </attribute> </define> <define name="CT_NumFmt"> + <attribute name="format"> + <data type="string"/> + </attribute> <attribute name="val"> <ref name="ST_NumberFormat"/> </attribute> @@ -17750,6 +17754,7 @@ <value tokenid="ooxml:Value_ST_NumberFormat_thaiLetters">thaiLetters</value> <value tokenid="ooxml:Value_ST_NumberFormat_thaiNumbers">thaiNumbers</value> <value tokenid="ooxml:Value_ST_NumberFormat_thaiCounting">thaiCounting</value> + <value tokenid="ooxml:Value_ST_NumberFormat_custom">custom</value> </resource> <resource name="ST_PageOrientation" resource="List"> <value tokenid="ooxml:Value_ST_PageOrientation_portrait">portrait</value> @@ -18522,8 +18527,9 @@ <resource name="CT_EdnPos" resource="Value"> <attribute name="val" tokenid="ooxml:CT_EdnPos_val" action="setValue"/> </resource> - <resource name="CT_NumFmt" resource="Value"> - <attribute name="val" tokenid="ooxml:CT_NumFmt_val" action="setValue"/> + <resource name="CT_NumFmt" resource="Properties"> + <attribute name="format" tokenid="ooxml:CT_NumFmt_format"/> + <attribute name="val" tokenid="ooxml:CT_NumFmt_val"/> </resource> <resource name="ST_RestartNumber" resource="List"> <value tokenid="ooxml:Value_ST_RestartNumber_continuous">continuous</value> diff --git a/writerfilter/source/rtftok/rtfdispatchflag.cxx b/writerfilter/source/rtftok/rtfdispatchflag.cxx index 894716b2897c..35fe4b381283 100644 --- a/writerfilter/source/rtftok/rtfdispatchflag.cxx +++ b/writerfilter/source/rtftok/rtfdispatchflag.cxx @@ -294,10 +294,13 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) } if (nParam >= 0) { - auto pValue = new RTFValue(nParam); + auto pInner = new RTFValue(nParam); + RTFSprms aAttributes; + aAttributes.set(NS_ooxml::LN_CT_NumFmt_val, pInner); + auto pOuter = new RTFValue(aAttributes); putNestedSprm(m_aDefaultState.getParagraphSprms(), NS_ooxml::LN_EG_SectPrContents_footnotePr, NS_ooxml::LN_CT_FtnProps_numFmt, - pValue); + pOuter); return RTFError::OK; } @@ -351,9 +354,12 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) } if (nParam >= 0) { - auto pValue = new RTFValue(nParam); + auto pInner = new RTFValue(nParam); + RTFSprms aAttributes; + aAttributes.set(NS_ooxml::LN_CT_NumFmt_val, pInner); + auto pOuter = new RTFValue(aAttributes); putNestedSprm(m_aDefaultState.getParagraphSprms(), NS_ooxml::LN_EG_SectPrContents_endnotePr, - NS_ooxml::LN_CT_EdnProps_numFmt, pValue); + NS_ooxml::LN_CT_EdnProps_numFmt, pOuter); return RTFError::OK; } @@ -1087,16 +1093,17 @@ RTFError RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) case RTF_PNDEC: { auto pValue = new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_decimal); - m_aStates.top().getTableSprms().set(NS_ooxml::LN_CT_Lvl_numFmt, pValue); + putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_Lvl_numFmt, + NS_ooxml::LN_CT_NumFmt_val, pValue); } break; case RTF_PNLVLBLT: { m_aStates.top().getTableAttributes().set(NS_ooxml::LN_CT_AbstractNum_nsid, new RTFValue(1)); - m_aStates.top().getTableSprms().set( - NS_ooxml::LN_CT_Lvl_numFmt, - new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_bullet)); + putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_Lvl_numFmt, + NS_ooxml::LN_CT_NumFmt_val, + new RTFValue(NS_ooxml::LN_Value_ST_NumberFormat_bullet)); } break; case RTF_LANDSCAPE: diff --git a/writerfilter/source/rtftok/rtfdispatchvalue.cxx b/writerfilter/source/rtftok/rtfdispatchvalue.cxx index 4f7c71ecf73e..7f458bf5ca94 100644 --- a/writerfilter/source/rtftok/rtfdispatchvalue.cxx +++ b/writerfilter/source/rtftok/rtfdispatchvalue.cxx @@ -137,10 +137,6 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) pIntValue = new RTFValue(nValue); break; } - case RTF_LEVELNFC: - nSprm = NS_ooxml::LN_CT_Lvl_numFmt; - pIntValue = new RTFValue(getNumberFormat(nParam)); - break; case RTF_LEVELSTARTAT: nSprm = NS_ooxml::LN_CT_Lvl_start; break; @@ -159,6 +155,13 @@ RTFError RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) m_aStates.top().getTableSprms().set(nSprm, pIntValue); return RTFError::OK; } + if (nKeyword == RTF_LEVELNFC) + { + pIntValue = new RTFValue(getNumberFormat(nParam)); + putNestedAttribute(m_aStates.top().getTableSprms(), NS_ooxml::LN_CT_Lvl_numFmt, + NS_ooxml::LN_CT_NumFmt_val, pIntValue); + return RTFError::OK; + } // Trivial character sprms. switch (nKeyword) { commit 34c10f30268b515e7bf7fcecb4241c36a6512e15 Author: Miklos Vajna <[email protected]> AuthorDate: Wed Mar 18 10:18:42 2020 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Tue May 19 11:30:09 2020 +0200 sw pad-to-3 numbering: add ODF filter This makes the UI work as well. (cherry picked from commit 086bfde59232076644995ae862cd43865419ad98) Change-Id: I8d64b88e57ba3e4fd61afba892f0ee2267f1c8b2 diff --git a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx index 8dfc18291491..39b7954cee7a 100644 --- a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx +++ b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx @@ -1044,6 +1044,7 @@ static const Supported_NumberingType aSupportedTypes[] = {style::NumberingType::CHARS_GREEK_UPPER_LETTER, C_GR_A ", " C_GR_B ", ... (gr)", LANG_ALL}, {style::NumberingType::CHARS_GREEK_LOWER_LETTER, S_GR_A ", " S_GR_B ", ... (gr)", LANG_ALL}, {style::NumberingType::ARABIC_ZERO, "01, 02, 03, ...", LANG_ALL}, + {style::NumberingType::ARABIC_ZERO3, "001, 002, 003, ...", LANG_ALL}, }; static const sal_Int32 nSupported_NumberingTypes = SAL_N_ELEMENTS(aSupportedTypes); diff --git a/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt b/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt new file mode 100644 index 000000000000..0bdca270eece Binary files /dev/null and b/sw/qa/extras/odfexport/data/arabic-zero3-numbering.odt differ diff --git a/sw/qa/extras/odfexport/odfexport.cxx b/sw/qa/extras/odfexport/odfexport.cxx index 0d5c28f07ebd..550d7079a089 100644 --- a/sw/qa/extras/odfexport/odfexport.cxx +++ b/sw/qa/extras/odfexport/odfexport.cxx @@ -2348,5 +2348,18 @@ DECLARE_ODFEXPORT_TEST(testArabicZeroNumbering, "arabic-zero-numbering.odt") aMap["NumberingType"].get<sal_uInt16>()); } +DECLARE_ODFEXPORT_TEST(testArabicZero3Numbering, "arabic-zero3-numbering.odt") +{ + auto xNumberingRules + = getProperty<uno::Reference<container::XIndexAccess>>(getParagraph(1), "NumberingRules"); + comphelper::SequenceAsHashMap aMap(xNumberingRules->getByIndex(0)); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 65 + // - Actual : 4 + // i.e. numbering type was ARABIC, not ARABIC_ZERO3. + CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(style::NumberingType::ARABIC_ZERO3), + aMap["NumberingType"].get<sal_uInt16>()); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 007709e54e13863e78502c5ce35590e889fada91 Author: Miklos Vajna <[email protected]> AuthorDate: Tue Mar 17 17:01:05 2020 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Tue May 19 11:30:09 2020 +0200 sw pad-to-3 numbering: add doc model, UNO API and layout This is similar to the existing padded numbering, but that one padded to 2. Another difference is pad-to-2 has more file format support: pad-to-3 is not supported in DOC and RTF. (cherry picked from commit f4dd9ecdc21696b360dedf7fefa371c8858c1830) Change-Id: Ie2ac2691c58a89e181d24d7002cf873ebab380c4 diff --git a/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx b/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx index 2a1cb55502e2..4418a283de2b 100644 --- a/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx +++ b/i18npool/qa/cppunit/test_defaultnumberingprovider.cxx @@ -52,6 +52,35 @@ CPPUNIT_TEST_FIXTURE(I18npoolDefaultnumberingproviderTest, testArabicZero) CPPUNIT_ASSERT_EQUAL(OUString("10"), aActual); } +CPPUNIT_TEST_FIXTURE(I18npoolDefaultnumberingproviderTest, testArabicZero3) +{ + uno::Reference<uno::XComponentContext> xComponentContext + = comphelper::getComponentContext(getMultiServiceFactory()); + + // 10 -> "010" + uno::Reference<text::XNumberingFormatter> xFormatter( + text::DefaultNumberingProvider::create(xComponentContext), uno::UNO_QUERY); + uno::Sequence<beans::PropertyValue> aProperties = { + comphelper::makePropertyValue("NumberingType", + static_cast<sal_uInt16>(style::NumberingType::ARABIC_ZERO3)), + comphelper::makePropertyValue("Value", static_cast<sal_Int32>(10)), + }; + lang::Locale aLocale; + OUString aActual = xFormatter->makeNumberingString(aProperties, aLocale); + // Without the accompanying fix in place, this test would have failed with a + // lang.IllegalArgumentException, support for ARABIC_ZERO3 was missing. + CPPUNIT_ASSERT_EQUAL(OUString("010"), aActual); + + // 100 -> "100" + aProperties = { + comphelper::makePropertyValue("NumberingType", + static_cast<sal_uInt16>(style::NumberingType::ARABIC_ZERO3)), + comphelper::makePropertyValue("Value", static_cast<sal_Int32>(100)), + }; + aActual = xFormatter->makeNumberingString(aProperties, aLocale); + CPPUNIT_ASSERT_EQUAL(OUString("100"), aActual); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx index 797d7360a283..8dfc18291491 100644 --- a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx +++ b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx @@ -553,11 +553,11 @@ bool should_ignore( const OUString& s ) } /** - * Turn nNumber into a string and pad the result to 2 using zero characters. + * Turn nNumber into a string and pad the result to nLimit by inserting zero characters at the + * start. */ -static OUString lcl_formatArabicZero(sal_Int32 nNumber) +static OUString lcl_formatArabicZero(sal_Int32 nNumber, sal_Int32 nLimit) { - sal_Int32 nLimit = 2; OUString aRet = OUString::number(nNumber); sal_Int32 nDiff = nLimit - aRet.getLength(); @@ -938,7 +938,11 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal break; case ARABIC_ZERO: - result += lcl_formatArabicZero(number); + result += lcl_formatArabicZero(number, 2); + break; + + case ARABIC_ZERO3: + result += lcl_formatArabicZero(number, 3); break; default: diff --git a/include/editeng/svxenum.hxx b/include/editeng/svxenum.hxx index f425e97cde0c..eced6c884afa 100644 --- a/include/editeng/svxenum.hxx +++ b/include/editeng/svxenum.hxx @@ -206,7 +206,8 @@ enum SvxNumType : sal_Int16 SVX_NUM_TEXT_CARDINAL = css::style::NumberingType::TEXT_CARDINAL, SVX_NUM_TEXT_ORDINAL = css::style::NumberingType::TEXT_ORDINAL, SVX_NUM_SYMBOL_CHICAGO = css::style::NumberingType::SYMBOL_CHICAGO, - SVX_NUM_ARABIC_ZERO = css::style::NumberingType::ARABIC_ZERO + SVX_NUM_ARABIC_ZERO = css::style::NumberingType::ARABIC_ZERO, + SVX_NUM_ARABIC_ZERO3 = css::style::NumberingType::ARABIC_ZERO3, }; #endif diff --git a/offapi/com/sun/star/style/NumberingType.idl b/offapi/com/sun/star/style/NumberingType.idl index 66159a818e66..2ecf03734e10 100644 --- a/offapi/com/sun/star/style/NumberingType.idl +++ b/offapi/com/sun/star/style/NumberingType.idl @@ -499,6 +499,13 @@ published constants NumberingType @since LibreOffice 7.0 */ const short ARABIC_ZERO = 64; + + /** Numbering is in Arabic numbers, padded with zero to have a length of at least three, as + "001, 002, ..., 100, 101, ...". + + @since LibreOffice 7.0 + */ + const short ARABIC_ZERO3 = 65; }; commit 47bb90ad09553d8d36bdc22616c00f82a6f6d87c Author: Miklos Vajna <[email protected]> AuthorDate: Fri Mar 6 16:16:56 2020 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Tue May 19 11:30:09 2020 +0200 sw chicago numbering: add RTF footnote export Chicago numbering is not supported for paragraph numbering (same as DOC), so focus on footnote/endnote export only. There is markup in RTF to store doc-global footnote/endnote numbering type and the same for per-section. DOC writes both, then Writer only reads the global setting and Word only reads the per-section setting. This means only export is needed here, import already handled the doc-global markup, and that's enough. (cherry picked from commit 4ba09be7e260ce2a79a23465db7b2837422cde30) Change-Id: I3590560ca913e04078988fe4784e50fa5cbf17bf diff --git a/include/svtools/rtfkeywd.hxx b/include/svtools/rtfkeywd.hxx index 8a4a3f6b4c7b..fa297843e6be 100644 --- a/include/svtools/rtfkeywd.hxx +++ b/include/svtools/rtfkeywd.hxx @@ -411,6 +411,12 @@ #define OOO_STRING_SVTOOLS_RTF_AFTNNCHI "\\aftnnchi" #define OOO_STRING_SVTOOLS_RTF_AFTNNRLC "\\aftnnrlc" #define OOO_STRING_SVTOOLS_RTF_AFTNNRUC "\\aftnnruc" +#define OOO_STRING_SVTOOLS_RTF_SAFTNNALC "\\saftnnalc" +#define OOO_STRING_SVTOOLS_RTF_SAFTNNAR "\\saftnnar" +#define OOO_STRING_SVTOOLS_RTF_SAFTNNAUC "\\saftnnauc" +#define OOO_STRING_SVTOOLS_RTF_SAFTNNCHI "\\saftnnchi" +#define OOO_STRING_SVTOOLS_RTF_SAFTNNRLC "\\saftnnrlc" +#define OOO_STRING_SVTOOLS_RTF_SAFTNNRUC "\\saftnnruc" #define OOO_STRING_SVTOOLS_RTF_AFTNRESTART "\\aftnrestart" #define OOO_STRING_SVTOOLS_RTF_AFTNRSTCONT "\\aftnrstcont" #define OOO_STRING_SVTOOLS_RTF_AFTNSEP "\\aftnsep" @@ -552,6 +558,12 @@ #define OOO_STRING_SVTOOLS_RTF_FTNNCHI "\\ftnnchi" #define OOO_STRING_SVTOOLS_RTF_FTNNRLC "\\ftnnrlc" #define OOO_STRING_SVTOOLS_RTF_FTNNRUC "\\ftnnruc" +#define OOO_STRING_SVTOOLS_RTF_SFTNNALC "\\sftnnalc" +#define OOO_STRING_SVTOOLS_RTF_SFTNNAR "\\sftnnar" +#define OOO_STRING_SVTOOLS_RTF_SFTNNAUC "\\sftnnauc" +#define OOO_STRING_SVTOOLS_RTF_SFTNNCHI "\\sftnnchi" +#define OOO_STRING_SVTOOLS_RTF_SFTNNRLC "\\sftnnrlc" +#define OOO_STRING_SVTOOLS_RTF_SFTNNRUC "\\sftnnruc" #define OOO_STRING_SVTOOLS_RTF_FTNRSTCONT "\\ftnrstcont" #define OOO_STRING_SVTOOLS_RTF_FTNRSTPG "\\ftnrstpg" #define OOO_STRING_SVTOOLS_RTF_FTTRUETYPE "\\fttruetype" diff --git a/sw/qa/extras/rtfexport/rtfexport5.cxx b/sw/qa/extras/rtfexport/rtfexport5.cxx index 75678fb6971b..fb9555c5a1ee 100644 --- a/sw/qa/extras/rtfexport/rtfexport5.cxx +++ b/sw/qa/extras/rtfexport/rtfexport5.cxx @@ -29,6 +29,7 @@ #include <com/sun/star/text/XTextViewCursorSupplier.hpp> #include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/graphic/XGraphic.hpp> +#include <com/sun/star/text/XTextContentAppend.hpp> #include <rtl/ustring.hxx> #include <vcl/svapp.hxx> @@ -1069,6 +1070,37 @@ DECLARE_RTFEXPORT_TEST(testTdf104744, "tdf104744.rtf") CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), aRule["IndentAt"].get<sal_Int32>()); } +CPPUNIT_TEST_FIXTURE(SwModelTestBase, testChicagoNumberingFootnote) +{ + // Create a document, set footnote numbering type to SYMBOL_CHICAGO. + loadURL("private:factory/swriter", nullptr); + uno::Reference<text::XFootnotesSupplier> xFootnotesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xFootnoteSettings + = xFootnotesSupplier->getFootnoteSettings(); + sal_uInt16 nNumberingType = style::NumberingType::SYMBOL_CHICAGO; + xFootnoteSettings->setPropertyValue("NumberingType", uno::makeAny(nNumberingType)); + + // Insert a footnote. + uno::Reference<lang::XMultiServiceFactory> xFactory(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XTextContent> xFootnote( + xFactory->createInstance("com.sun.star.text.Footnote"), uno::UNO_QUERY); + uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY); + uno::Reference<text::XTextContentAppend> xTextContentAppend(xTextDocument->getText(), + uno::UNO_QUERY); + xTextContentAppend->appendTextContent(xFootnote, {}); + + reload("Rich Text Format", ""); + xFootnotesSupplier.set(mxComponent, uno::UNO_QUERY); + sal_uInt16 nExpected = style::NumberingType::SYMBOL_CHICAGO; + auto nActual + = getProperty<sal_uInt16>(xFootnotesSupplier->getFootnoteSettings(), "NumberingType"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 63 + // - Actual : 4 + // i.e. the numbering type was ARABIC, not SYMBOL_CHICAGO. + CPPUNIT_ASSERT_EQUAL(nExpected, nActual); +} + DECLARE_RTFEXPORT_TEST(testTdf105852, "tdf105852.rtf") { uno::Reference<text::XTextTablesSupplier> xTablesSupplier(mxComponent, uno::UNO_QUERY); diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx index edd666e28cf9..9f174bd6d14d 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.cxx +++ b/sw/source/filter/ww8/rtfattributeoutput.cxx @@ -1359,6 +1359,77 @@ void RtfAttributeOutput::SectionType(sal_uInt8 nBreakCode) m_rExport.Strm().WriteOString(m_aSectionBreaks.makeStringAndClear()); } +void RtfAttributeOutput::SectFootnoteEndnotePr() +{ + WriteFootnoteEndnotePr(true, m_rExport.m_pDoc->GetFootnoteInfo()); + WriteFootnoteEndnotePr(false, m_rExport.m_pDoc->GetEndNoteInfo()); +} + +void RtfAttributeOutput::WriteFootnoteEndnotePr(bool bFootnote, const SwEndNoteInfo& rInfo) +{ + const char* pOut = nullptr; + + if (bFootnote) + { + switch (rInfo.aFormat.GetNumberingType()) + { + default: + pOut = OOO_STRING_SVTOOLS_RTF_SFTNNAR; + break; + case SVX_NUM_CHARS_LOWER_LETTER: + case SVX_NUM_CHARS_LOWER_LETTER_N: + pOut = OOO_STRING_SVTOOLS_RTF_SFTNNALC; + break; + case SVX_NUM_CHARS_UPPER_LETTER: + case SVX_NUM_CHARS_UPPER_LETTER_N: + pOut = OOO_STRING_SVTOOLS_RTF_SFTNNAUC; + break; + case SVX_NUM_ROMAN_LOWER: + pOut = OOO_STRING_SVTOOLS_RTF_SFTNNRLC; + break; + case SVX_NUM_ROMAN_UPPER: + pOut = OOO_STRING_SVTOOLS_RTF_SFTNNRUC; + break; + case SVX_NUM_SYMBOL_CHICAGO: + pOut = OOO_STRING_SVTOOLS_RTF_SFTNNCHI; + break; + } + } + else + { + switch (rInfo.aFormat.GetNumberingType()) + { + default: + pOut = OOO_STRING_SVTOOLS_RTF_SAFTNNAR; + break; + case SVX_NUM_CHARS_LOWER_LETTER: + case SVX_NUM_CHARS_LOWER_LETTER_N: + pOut = OOO_STRING_SVTOOLS_RTF_SAFTNNALC; + break; + case SVX_NUM_CHARS_UPPER_LETTER: + case SVX_NUM_CHARS_UPPER_LETTER_N: + pOut = OOO_STRING_SVTOOLS_RTF_SAFTNNAUC; + break; + case SVX_NUM_ROMAN_LOWER: + pOut = OOO_STRING_SVTOOLS_RTF_SAFTNNRLC; + break; + case SVX_NUM_ROMAN_UPPER: + pOut = OOO_STRING_SVTOOLS_RTF_SAFTNNRUC; + break; + case SVX_NUM_SYMBOL_CHICAGO: + pOut = OOO_STRING_SVTOOLS_RTF_SAFTNNCHI; + break; + } + } + + m_aSectionBreaks.append(pOut); + + if (!m_bBufferSectionBreaks) + { + m_rExport.Strm().WriteOString(m_aSectionBreaks.makeStringAndClear()); + } +} + void RtfAttributeOutput::NumberingDefinition(sal_uInt16 nId, const SwNumRule& /*rRule*/) { m_rExport.Strm().WriteChar('{').WriteCharPtr(OOO_STRING_SVTOOLS_RTF_LISTOVERRIDE); diff --git a/sw/source/filter/ww8/rtfattributeoutput.hxx b/sw/source/filter/ww8/rtfattributeoutput.hxx index 4ea8b3845bcd..791fdf8d2678 100644 --- a/sw/source/filter/ww8/rtfattributeoutput.hxx +++ b/sw/source/filter/ww8/rtfattributeoutput.hxx @@ -198,6 +198,10 @@ public: /// The type of breaking. void SectionType(sal_uInt8 nBreakCode) override; + void SectFootnoteEndnotePr() override; + + void WriteFootnoteEndnotePr(bool bFootnote, const SwEndNoteInfo& rInfo); + /// Definition of a numbering instance. void NumberingDefinition(sal_uInt16 nId, const SwNumRule& rRule) override; diff --git a/sw/source/filter/ww8/rtfexport.cxx b/sw/source/filter/ww8/rtfexport.cxx index 366cc18b3b0c..81550b420f0f 100644 --- a/sw/source/filter/ww8/rtfexport.cxx +++ b/sw/source/filter/ww8/rtfexport.cxx @@ -827,6 +827,7 @@ ErrCode RtfExport::ExportDocument_Impl() Strm() .WriteCharPtr(OOO_STRING_SVTOOLS_RTF_SECTD) .WriteCharPtr(OOO_STRING_SVTOOLS_RTF_SBKNONE); + m_pAttrOutput->SectFootnoteEndnotePr(); // All sections are unlocked by default Strm().WriteCharPtr(OOO_STRING_SVTOOLS_RTF_SECTUNLOCKED); OutLong(1); @@ -888,7 +889,7 @@ ErrCode RtfExport::ExportDocument_Impl() case SVX_NUM_ROMAN_UPPER: pOut = OOO_STRING_SVTOOLS_RTF_FTNNRUC; break; - case SVX_NUM_CHAR_SPECIAL: + case SVX_NUM_SYMBOL_CHICAGO: pOut = OOO_STRING_SVTOOLS_RTF_FTNNCHI; break; default: @@ -921,7 +922,7 @@ ErrCode RtfExport::ExportDocument_Impl() case SVX_NUM_ROMAN_UPPER: pOut = OOO_STRING_SVTOOLS_RTF_AFTNNRUC; break; - case SVX_NUM_CHAR_SPECIAL: + case SVX_NUM_SYMBOL_CHICAGO: pOut = OOO_STRING_SVTOOLS_RTF_AFTNNCHI; break; default: _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
