summaryrefslogtreecommitdiff
path: root/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2018-05-13 03:09:43 +0300
committerEike Rathke <erack@redhat.com>2018-05-15 11:42:36 +0200
commit56a7f308cf57f87d9e2cdeb77f48b570f81de85e (patch)
tree2beac75305f078c6d038ad17eb3b0f96ae9db82f /i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
parent5193d7fc00bd9d2ac2f77989e861c819d994c19c (diff)
tdf#115007: add NatNum codes for cardinal/ordinal number names/indicators
... based on libnumbertext integrated since commit f1579d3d6c5f5f3a651825e035b93bee7a4f43c6. [NatNum12] gives cardinal number names (one, two, three, ...) [NatNum13] gives ordinal number names (first, second, third, ...) [NatNum14] gives ordinal indicators (1st, 2nd, 3rd, ...) Change-Id: Ie2afdeeb82da1b36e9755c02d7b2276c77be9c72 Reviewed-on: https://gerrit.libreoffice.org/54186 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Eike Rathke <erack@redhat.com>
Diffstat (limited to 'i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx')
-rw-r--r--i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx66
1 files changed, 24 insertions, 42 deletions
diff --git a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
index e222611a2afe..af4e27d0f69f 100644
--- a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
+++ b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx
@@ -19,7 +19,6 @@
#include <defaultnumberingprovider.hxx>
#include <com/sun/star/lang/IllegalArgumentException.hpp>
-#include <com/sun/star/linguistic2/NumberText.hpp>
#include <com/sun/star/style/NumberingType.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/configuration/theDefaultProvider.hpp>
@@ -32,9 +31,6 @@
#include <string.h>
#include <comphelper/propertysequence.hxx>
#include <cppuhelper/supportsservice.hxx>
-#include <i18nlangtag/languagetag.hxx>
-#include <unordered_map>
-#include <map>
// Cyrillic upper case
#define C_CYR_A "\xD0\x90"
@@ -588,6 +584,7 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal
sal_Int16 tableSize = 0;
const sal_Unicode *table = nullptr; // initialize to avoid compiler warning
bool bRecycleSymbol = false;
+ bool bCapitalize = false;
Locale locale;
OUString prefix;
@@ -639,45 +636,20 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal
lcl_formatChars( lowerLetter, 26, number-1, result );
break;
case TEXT_NUMBER:
+ natNum = NativeNumberMode::NATNUM14; // ordinal indicators (1st, 2nd, 3rd, ...)
+ locale = aLocale;
+ bCapitalize = true;
+ break;
case TEXT_CARDINAL:
+ natNum = NativeNumberMode::NATNUM12; // cardinal number names (one, two, three, ...)
+ locale = aLocale;
+ bCapitalize = true;
+ break;
case TEXT_ORDINAL:
- {
- static css::uno::Reference< css::linguistic2::XNumberText > xNumberText;
- if (!xNumberText.is())
- xNumberText = linguistic2::NumberText::create( m_xContext );
- OUString aLoc = LanguageTag::convertToBcp47(aLocale);
- OUString numbertext_prefix = "";
- if (numType == TEXT_NUMBER)
- numbertext_prefix += "ordinal-number ";
- else if (numType == TEXT_ORDINAL)
- numbertext_prefix += "ordinal ";
- // Several hundreds of headings could result typing lags because
- // of the continuous update of the multiple number names during typing.
- // We fix this by buffering the result of the conversion.
- static std::unordered_map<sal_Int32,std::map<OUString, OUString> > aBuff;
- auto aBuffItem = aBuff.find(number);
- std::map<OUString, OUString> aItem;
- if (aBuffItem == aBuff.end() || !aBuffItem->second.count(numbertext_prefix + aLoc))
- {
- OUString snumber = OUString::number(number);
- OUString aNum =
- xNumberText->getNumberText( numbertext_prefix + snumber, aLocale);
- if ( !xCharClass.is() )
- xCharClass = CharacterClassification::create( m_xContext );
- // use number at missing number to text conversion
- if (aNum.getLength() == 0)
- aNum = snumber;
- // capitalize first letter
- aItem[numbertext_prefix + aLoc] = xCharClass->toTitle(aNum, 0, 1, aLocale) + aNum.copy(1);
- aBuff.insert(std::make_pair(number, aItem));
- }
- else
- {
- aItem = aBuffItem->second;
- }
- result += aItem[numbertext_prefix + aLoc];
- break;
- }
+ natNum = NativeNumberMode::NATNUM13; // ordinal number names (first, second, third, ...)
+ locale = aLocale;
+ bCapitalize = true;
+ break;
case ROMAN_UPPER:
result += toRoman( number );
break;
@@ -937,7 +909,17 @@ DefaultNumberingProvider::makeNumberingString( const Sequence<beans::PropertyVal
if (natNum) {
rtl::Reference<NativeNumberSupplierService> xNatNum(new NativeNumberSupplierService);
- result += xNatNum->getNativeNumberString(OUString::number( number ), locale, natNum);
+ OUString aNum
+ = xNatNum->getNativeNumberString(OUString::number(number), locale, natNum);
+ if (bCapitalize)
+ {
+ if (!xCharClass.is())
+ xCharClass = CharacterClassification::create(m_xContext);
+ // capitalize first letter
+ result += xCharClass->toTitle(aNum, 0, 1, aLocale) + aNum.copy(1);
+ }
+ else
+ result += aNum;
} else if (tableSize) {
if ( number > tableSize && !bRecycleSymbol)
result += OUString::number( number);