diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2020-03-16 17:25:31 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2020-05-19 11:30:09 +0200 |
commit | 0acdc84c5053dc32c0f65ec416f3f21502537496 (patch) | |
tree | 9fb263c2b859f25123a17d946cecf95ddff868e4 /writerfilter/source/dmapper | |
parent | 34c10f30268b515e7bf7fcecb4241c36a6512e15 (diff) |
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
Diffstat (limited to 'writerfilter/source/dmapper')
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 43 | ||||
-rw-r--r-- | writerfilter/source/dmapper/NumberingManager.cxx | 21 |
2 files changed, 58 insertions, 6 deletions
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,11 +2321,19 @@ 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 { uno::Reference< beans::XPropertySet > xFtnEdnSettings; 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()) |