From f1579d3d6c5f5f3a651825e035b93bee7a4f43c6 Mon Sep 17 00:00:00 2001 From: László Németh Date: Tue, 20 Feb 2018 11:38:24 +0100 Subject: tdf#117171 support localized number name numbering styles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit in page number, chapter and outline numbering in ~30 languages by integrating libnumbertext library. - offapi: add linguistic2::NumberText New NumberingType constants: - ordinal indicators (1st, 2nd, 3rd...) - cardinal number names (One, Two, Three...) - ordinal number names (First, Second, Third...) Note: these numberings are parts of OOXML, too. Plain text files of Libnumbertext's language data are installed in share/numbertext (similar to share/fingerprint), allowing further customization. Change-Id: I4034da0a40a8c926f14a3f591749a89a8d807d5a Reviewed-on: https://gerrit.libreoffice.org/53313 Tested-by: Jenkins Reviewed-by: László Németh --- lingucomponent/source/numbertext/numbertext.cxx | 207 ++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 lingucomponent/source/numbertext/numbertext.cxx (limited to 'lingucomponent/source/numbertext/numbertext.cxx') diff --git a/lingucomponent/source/numbertext/numbertext.cxx b/lingucomponent/source/numbertext/numbertext.cxx new file mode 100644 index 000000000000..e86278d851f4 --- /dev/null +++ b/lingucomponent/source/numbertext/numbertext.cxx @@ -0,0 +1,207 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#ifdef SYSTEM_LIBNUMBERTEXT +#include +#else +#ifdef ENABLE_LIBNUMBERTEXT +#include +#endif +#endif + +using namespace ::osl; +using namespace ::cppu; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::linguistic2; + +#define SERVICENAME "com.sun.star.linguistic2.NumberText" +#define IMPLNAME "com.sun.star.lingu2.NumberText" + +static Sequence getSupportedServiceNames_NumberText_Impl() +{ + Sequence names{ SERVICENAME }; + return names; +} + +static OUString getImplementationName_NumberText_Impl() { return OUString(IMPLNAME); } + +static osl::Mutex& GetNumberTextMutex() +{ + static osl::Mutex aMutex; + return aMutex; +} + +class NumberText_Impl : public ::cppu::WeakImplHelper +{ +#if defined(ENABLE_LIBNUMBERTEXT) || defined(SYSTEM_LIBNUMBERTEXT) + Numbertext m_aNumberText; +#endif + bool m_bInitialized; + + virtual ~NumberText_Impl() override {} + void EnsureInitialized(); + +public: + NumberText_Impl(); + NumberText_Impl(const NumberText_Impl&) = delete; + NumberText_Impl& operator=(const NumberText_Impl&) = delete; + + // XServiceInfo implementation + virtual OUString SAL_CALL getImplementationName() override; + virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; + virtual Sequence SAL_CALL getSupportedServiceNames() override; + static Sequence getSupportedServiceNames_Static(); + + // XNumberText implementation + virtual OUString SAL_CALL getNumberText(const OUString& aText, + const ::css::lang::Locale& rLocale) override; + virtual css::uno::Sequence SAL_CALL getAvailableLanguages() override; +}; + +NumberText_Impl::NumberText_Impl() + : m_bInitialized(false) +{ +} + +void NumberText_Impl::EnsureInitialized() +{ + if (!m_bInitialized) + { + // set this to true at the very start to prevent loops because of + // implicitly called functions below + m_bInitialized = true; + + // set default numbertext path to where those get installed + OUString aPhysPath; + OUString aURL(SvtPathOptions().GetNumbertextPath()); + osl::FileBase::getSystemPathFromFileURL(aURL, aPhysPath); +#ifdef _WIN32 + aPhysPath += "\\"; +#else + aPhysPath += "/"; +#endif +#if defined(ENABLE_LIBNUMBERTEXT) || defined(SYSTEM_LIBNUMBERTEXT) + OString path = OUStringToOString(aPhysPath, osl_getThreadTextEncoding()); + m_aNumberText.set_prefix(path.getStr()); +#endif + } +} + +OUString SAL_CALL NumberText_Impl::getNumberText(const OUString& rText, const Locale& +#if defined(ENABLE_LIBNUMBERTEXT) || defined(SYSTEM_LIBNUMBERTEXT) + rLocale) +#else +) +#endif +{ + osl::MutexGuard aGuard(GetNumberTextMutex()); + EnsureInitialized(); +#if defined(ENABLE_LIBNUMBERTEXT) || defined(SYSTEM_LIBNUMBERTEXT) + // libnumbertext supports Language + Country tags (separated by "_" or "-") + LanguageTag aLanguageTag(rLocale); + OUString aCode(aLanguageTag.getLanguage()); + OUString aCountry(aLanguageTag.getCountry()); + if (!aCountry.isEmpty()) + aCode += "-" + aCountry; + OString aLangCode(OUStringToOString(aCode, RTL_TEXTENCODING_ASCII_US)); + OString aInput(OUStringToOString(rText, RTL_TEXTENCODING_UTF8)); + std::wstring aResult = m_aNumberText.string2wstring(aInput.getStr()); + bool result = m_aNumberText.numbertext(aResult, aLangCode.getStr()); + DBG_ASSERT(result, "numbertext: false"); + OString aResult2(m_aNumberText.wstring2string(aResult).c_str()); + return OUString::fromUtf8(aResult2); +#else + return rText; +#endif +} + +uno::Sequence SAL_CALL NumberText_Impl::getAvailableLanguages() +{ + osl::MutexGuard aGuard(GetNumberTextMutex()); + // TODO + Sequence aRes; + return aRes; +} + +OUString SAL_CALL NumberText_Impl::getImplementationName() { return OUString(IMPLNAME); } + +sal_Bool SAL_CALL NumberText_Impl::supportsService(const OUString& ServiceName) +{ + return cppu::supportsService(this, ServiceName); +} + +Sequence SAL_CALL NumberText_Impl::getSupportedServiceNames() +{ + return getSupportedServiceNames_Static(); +} + +Sequence NumberText_Impl::getSupportedServiceNames_Static() +{ + OUString aName(SERVICENAME); + return Sequence(&aName, 1); +} + +/** + * Function to create a new component instance; is needed by factory helper implementation. + * @param xMgr service manager to if the components needs other component instances + */ +Reference NumberText_Impl_create(Reference const&) +{ + return static_cast<::cppu::OWeakObject*>(new NumberText_Impl); +} + +//#### EXPORTED ### functions to allow for registration and creation of the UNO component +static const struct ::cppu::ImplementationEntry s_component_entries[] + = { { NumberText_Impl_create, getImplementationName_NumberText_Impl, + getSupportedServiceNames_NumberText_Impl, ::cppu::createSingleComponentFactory, nullptr, + 0 }, + { nullptr, nullptr, nullptr, nullptr, nullptr, 0 } }; + +extern "C" { + +SAL_DLLPUBLIC_EXPORT void* numbertext_component_getFactory(sal_Char const* implName, void* xMgr, + void* xRegistry) +{ + return ::cppu::component_getFactoryHelper(implName, xMgr, xRegistry, s_component_entries); +} +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit