[Libreoffice-commits] core.git: sw/source

Mark Hung marklh9 at gmail.com
Sat Oct 15 21:12:52 UTC 2016


 sw/source/core/inc/scriptinfo.hxx |    1 +
 sw/source/core/text/porlay.cxx    |   21 +++++++++++++++++++++
 sw/source/core/text/portxt.cxx    |    2 +-
 3 files changed, 23 insertions(+), 1 deletion(-)

New commits:
commit dcef76b34aa1dca8389b3c068dc3d82a11d2c382
Author: Mark Hung <marklh9 at gmail.com>
Date:   Sun Oct 9 15:03:18 2016 +0800

    tdf#43740 Count CJK characters to distribute spaces.
    
    lcl_AddSpace determine the amount of space to distribute
    to a portion based on its text length. Counting the number
    of CJK characters prevent including codepoints that are not
    visible, such as surrogate pairs or Unicode variance
    selectors, by mistake.
    
    Change-Id: Ia20a7f76ea1ea3c1f4638db865721eaa26a8c82c
    Reviewed-on: https://gerrit.libreoffice.org/29616
    Reviewed-by: Khaled Hosny <khaledhosny at eglug.org>
    Tested-by: Khaled Hosny <khaledhosny at eglug.org>

diff --git a/sw/source/core/inc/scriptinfo.hxx b/sw/source/core/inc/scriptinfo.hxx
index e0ee73c..962a87f 100644
--- a/sw/source/core/inc/scriptinfo.hxx
+++ b/sw/source/core/inc/scriptinfo.hxx
@@ -352,6 +352,7 @@ public:
                                   sal_Int32 nLen, sal_Int32 nNumberOfBlanks = 0,
                                   long nSpaceAdd = 0 );
 
+    static sal_Int32 CountCJKCharacters( const OUString &rText, sal_Int32 nPos, sal_Int32 nEnd, LanguageType aLang);
     static SwScriptInfo* GetScriptInfo( const SwTextNode& rNode,
                                         bool bAllowInvalid = false );
 
diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx
index 9dd9c95..0df03c6 100644
--- a/sw/source/core/text/porlay.cxx
+++ b/sw/source/core/text/porlay.cxx
@@ -30,6 +30,7 @@
 #include <breakit.hxx>
 #include <unicode/uchar.h>
 #include <com/sun/star/i18n/ScriptType.hpp>
+#include <com/sun/star/i18n/CharacterIteratorMode.hpp>
 #include <com/sun/star/i18n/CTLScriptType.hpp>
 #include <com/sun/star/i18n/WordType.hpp>
 #include <paratr.hxx>
@@ -2142,4 +2143,24 @@ void SwScriptInfo::CalcHiddenRanges( const SwTextNode& rNode, MultiSelection& rH
     rNode.SetHiddenCharAttribute( bNewHiddenCharsHidePara, bNewContainsHiddenChars );
 }
 
+sal_Int32 SwScriptInfo::CountCJKCharacters( const OUString &rText, sal_Int32 nPos, sal_Int32 nEnd, LanguageType aLang)
+{
+    sal_Int32 nCount = 0;
+    if ( nEnd > nPos && g_pBreakIt->GetBreakIter().is() )
+    {
+        sal_Int32 nDone = 0;
+        const lang::Locale &rLocale = g_pBreakIt->GetLocale( aLang );
+        while ( nPos < nEnd )
+        {
+            nPos = g_pBreakIt->GetBreakIter()->nextCharacters( rText, nPos,
+                    rLocale,
+                    i18n::CharacterIteratorMode::SKIPCELL, 1, nDone );
+            nCount++;
+        }
+    }
+    else
+        nCount = nEnd - nPos ;
+
+    return nCount;
+}
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx
index e12955c..2c200c0 100644
--- a/sw/source/core/text/portxt.cxx
+++ b/sw/source/core/text/portxt.cxx
@@ -99,7 +99,7 @@ static sal_Int32 lcl_AddSpace( const SwTextSizeInfo &rInf, const OUString* pStr,
                            pPor->IsPostItsPortion() ) )
                 pPor = pPor->GetPortion();
 
-            nCnt += nEnd - nPos;
+            nCnt += SwScriptInfo::CountCJKCharacters( *pStr, nPos, nEnd, aLang );
 
             if ( !pPor || pPor->IsHolePortion() || pPor->InFixMargGrp() ||
                   pPor->IsBreakPortion() )


More information about the Libreoffice-commits mailing list