summaryrefslogtreecommitdiff
path: root/writerfilter
diff options
context:
space:
mode:
authorVasily Melenchuk <vasily.melenchuk@cib.de>2020-04-13 11:06:29 +0300
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2020-05-05 22:22:37 +0200
commit10e99b6ad18a8575351e1a9a6b129b6a6e1f0586 (patch)
treeea0c3b4d6528911535c7339fb921810272ecf1b8 /writerfilter
parent76beaebdb4e45149576e3946895d77bd3054fe50 (diff)
tdf#116883: sw: support for lists level format string
Multilevel lists are more flexible in case of DOCX. There is supported custom format for any level in DOCX unlike in LO and ODT where we are limited only with prefix and suffix for hardcoded list levels separated by dot. At the same time DOCX can have lists not only "1.2.3.4", but "1/2/3/4" or even "1!2>3)4" and such format can vary on each list level. Here is basic implementation for list format as a core feature for all documents and old way (prefix-suffix + ".") is left as fallback. Practically its usage is currently implemented only in DOCX import/export. Some RTF/OOXML unittests were redesigned: since we are not creating prefix/suffix for these formats conditions should be checked in a different way. Change-Id: I1ec58bcc5874d4fa19aee6a1f42bf1671d853b14 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92106 Tested-by: Jenkins Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93125 Tested-by: Jenkins Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Change-Id: Ia8f066913a2565559d81f3caabeba24b29c09052 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93456
Diffstat (limited to 'writerfilter')
-rw-r--r--writerfilter/source/dmapper/NumberingManager.cxx73
-rw-r--r--writerfilter/source/dmapper/NumberingManager.hxx5
-rw-r--r--writerfilter/source/dmapper/PropertyIds.cxx1
-rw-r--r--writerfilter/source/dmapper/PropertyIds.hxx1
4 files changed, 14 insertions, 66 deletions
diff --git a/writerfilter/source/dmapper/NumberingManager.cxx b/writerfilter/source/dmapper/NumberingManager.cxx
index 32dead60a100..eab1ac81ecc7 100644
--- a/writerfilter/source/dmapper/NumberingManager.cxx
+++ b/writerfilter/source/dmapper/NumberingManager.cxx
@@ -42,6 +42,7 @@
#include <tools/diagnose_ex.h>
#include <comphelper/sequence.hxx>
#include <comphelper/propertyvalue.hxx>
+#include <comphelper/string.hxx>
using namespace com::sun::star;
@@ -149,55 +150,6 @@ void ListLevel::SetParaStyle( const tools::SvRef< StyleSheetEntry >& pStyle )
&& styleId[ RTL_CONSTASCII_LENGTH( "Heading " ) ] <= '9' );
}
-sal_Int16 ListLevel::GetParentNumbering( const OUString& sText, sal_Int16 nLevel,
- OUString& rPrefix, OUString& rSuffix )
-{
- sal_Int16 nParentNumbering = 1;
-
- //now parse the text to find %n from %1 to %nLevel+1
- //everything before the first % and the last %x is prefix and suffix
- OUString sLevelText( sText );
- sal_Int32 nCurrentIndex = 0;
- sal_Int32 nFound = sLevelText.indexOf( '%', nCurrentIndex );
- if( nFound > 0 )
- {
- rPrefix = sLevelText.copy( 0, nFound );
- sLevelText = sLevelText.copy( nFound );
- }
- sal_Int32 nMinLevel = nLevel;
- //now the text should either be empty or start with %
- nFound = sLevelText.getLength( ) > 1 ? 0 : -1;
- while( nFound >= 0 )
- {
- if( sLevelText.getLength() > 1 )
- {
- sal_Unicode cLevel = sLevelText[1];
- if( cLevel >= '1' && cLevel <= '9' )
- {
- if( cLevel - '1' < nMinLevel )
- nMinLevel = cLevel - '1';
- //remove first char - next char is removed later
- sLevelText = sLevelText.copy( 1 );
- }
- }
- //remove old '%' or number
- sLevelText = sLevelText.copy( 1 );
- nCurrentIndex = 0;
- nFound = sLevelText.indexOf( '%', nCurrentIndex );
- //remove the text before the next %
- if(nFound > 0)
- sLevelText = sLevelText.copy( nFound -1 );
- }
- if( nMinLevel < nLevel )
- {
- nParentNumbering = sal_Int16( nLevel - nMinLevel + 1);
- }
-
- rSuffix = sLevelText;
-
- return nParentNumbering;
-}
-
uno::Sequence<beans::PropertyValue> ListLevel::GetProperties(bool bDefaults)
{
uno::Sequence<beans::PropertyValue> aLevelProps = GetLevelProperties(bDefaults);
@@ -588,19 +540,11 @@ void ListDef::CreateNumberingRules( DomainMapper& rDMapper,
if (pLevel.get() && !pLevel->GetBulletChar().isEmpty())
sText = pLevel->GetBulletChar( );
- OUString sPrefix;
- OUString sSuffix;
- OUString& rPrefix = sPrefix;
- OUString& rSuffix = sSuffix;
- sal_Int16 nParentNum = ListLevel::GetParentNumbering(
- sText, nLevel, rPrefix, rSuffix );
-
- aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(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.
+ OUString sSuffix;
auto it = std::find_if(aLvlProps.begin(), aLvlProps.end(), [](const beans::PropertyValue& rValue) { return rValue.Name == "NumberingType"; });
if (it != aLvlProps.end())
{
@@ -617,12 +561,19 @@ void ListDef::CreateNumberingRules( DomainMapper& rDMapper,
}
if (bLabelFollowedBy && nNumberFormat == style::NumberingType::NUMBER_NONE)
- rSuffix = OUString(u'\x200B');
+ sSuffix = OUString(u'\x200B');
}
+ aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_SUFFIX), sSuffix));
}
+ else
+ {
+ aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_LIST_FORMAT), sText));
- aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_SUFFIX), rSuffix));
- aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_PARENT_NUMBERING), nParentNum));
+ // Total count of replacement holders is determining amount of required parent numbering to include
+ // TODO: not sure how "%" symbol is escaped. This is not supported yet
+ sal_Int16 nParentNum = comphelper::string::getTokenCount(sText, '%');
+ aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_PARENT_NUMBERING), nParentNum));
+ }
aLvlProps.push_back(comphelper::makePropertyValue(getPropertyName(PROP_POSITION_AND_SPACE_MODE), sal_Int16(text::PositionAndSpaceMode::LABEL_ALIGNMENT)));
diff --git a/writerfilter/source/dmapper/NumberingManager.hxx b/writerfilter/source/dmapper/NumberingManager.hxx
index c0e68d9327a5..3949c3bf7dcd 100644
--- a/writerfilter/source/dmapper/NumberingManager.hxx
+++ b/writerfilter/source/dmapper/NumberingManager.hxx
@@ -86,11 +86,6 @@ public:
bool HasValues() const;
// UNO mapping functions
-
- // rPrefix and rSuffix are out parameters
- static sal_Int16 GetParentNumbering( const OUString& sText, sal_Int16 nLevel,
- OUString& rPrefix, OUString& rSuffix );
-
css::uno::Sequence<css::beans::PropertyValue> GetProperties(bool bDefaults);
css::uno::Sequence<css::beans::PropertyValue> GetCharStyleProperties();
diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx
index 0d5740e9fa83..6fecf7fe2be4 100644
--- a/writerfilter/source/dmapper/PropertyIds.cxx
+++ b/writerfilter/source/dmapper/PropertyIds.cxx
@@ -207,6 +207,7 @@ OUString getPropertyName( PropertyIds eId )
case PROP_LEVEL_FOLLOW : sName = "LabelFollowedBy"; break;
case PROP_LEVEL_PARAGRAPH_STYLES : sName = "LevelParagraphStyles"; break;
case PROP_LEVEL_FORMAT : sName = "LevelFormat"; break;
+ case PROP_LIST_FORMAT : sName = "ListFormat"; break;
case PROP_TOKEN_TYPE : sName = "TokenType"; break;
case PROP_TOKEN_HYPERLINK_START : sName = "TokenHyperlinkStart"; break;
case PROP_TOKEN_HYPERLINK_END : sName = "TokenHyperlinkEnd"; break;
diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx
index a1a0c8f851a1..d511fd737238 100644
--- a/writerfilter/source/dmapper/PropertyIds.hxx
+++ b/writerfilter/source/dmapper/PropertyIds.hxx
@@ -205,6 +205,7 @@ enum PropertyIds
,PROP_LEVEL_FORMAT
,PROP_LEVEL_PARAGRAPH_STYLES
,PROP_LISTTAB_STOP_POSITION
+ ,PROP_LIST_FORMAT
,PROP_MACRO_NAME
,PROP_NAME
,PROP_NUMBERING_LEVEL