incubator-ooo-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ima...@apache.org
Subject svn commit: r1241345 - /incubator/ooo/trunk/main/sw/source/core/txtnode/txtedt.cxx
Date Tue, 07 Feb 2012 04:07:58 GMT
Author: imacat
Date: Tue Feb  7 04:07:58 2012
New Revision: 1241345

URL: http://svn.apache.org/viewvc?rev=1241345&view=rev
Log:
Fixed the Asian language work count.


Modified:
    incubator/ooo/trunk/main/sw/source/core/txtnode/txtedt.cxx

Modified: incubator/ooo/trunk/main/sw/source/core/txtnode/txtedt.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/sw/source/core/txtnode/txtedt.cxx?rev=1241345&r1=1241344&r2=1241345&view=diff
==============================================================================
--- incubator/ooo/trunk/main/sw/source/core/txtnode/txtedt.cxx (original)
+++ incubator/ooo/trunk/main/sw/source/core/txtnode/txtedt.cxx Tue Feb  7 04:07:58 2012
@@ -1915,24 +1915,59 @@ void SwTxtNode::CountWords( SwDocStat& r
 
                 const sal_uInt32 nExpandBegin = ModelToViewHelper::ConvertToViewPosition(
pConversionMap, nStt );
                 const sal_uInt32 nExpandEnd   = ModelToViewHelper::ConvertToViewPosition(
pConversionMap, nEnd );
+                aExpandText = aExpandText.copy( nExpandBegin, nExpandEnd - nExpandBegin );
 
                 const bool bCount = aExpandText.getLength() > 0;
 
                 // count words in 'regular' text:
                 if( bCount && pBreakIt->GetBreakIter().is() )
                 {
-                    const String aScannerText( aExpandText );
-                    SwScanner aScanner( *this, aScannerText, 0, pConversionMap,
-                                        i18n::WordType::WORD_COUNT,
-                                        (xub_StrLen)nExpandBegin, (xub_StrLen)nExpandEnd
);
-
-                    const rtl::OUString aBreakWord( CH_TXTATR_BREAKWORD );
-
-                    while ( aScanner.NextWord() )
+                    // split into different script languages
+                    sal_Int32 nScriptBegin = 0;
+                    while ( nScriptBegin < aExpandText.getLength() )
                     {
-                        if ( aScanner.GetLen() > 1 ||
-                             CH_TXTATR_BREAKWORD != aExpandText.match(aBreakWord, aScanner.GetBegin()
) )
-                            ++nTmpWords;
+                        const sal_Int16 nCurrScript = pBreakIt->GetBreakIter()->getScriptType(
aExpandText, nScriptBegin );
+                        const sal_Int32 nScriptEnd = pBreakIt->GetBreakIter()->endOfScript(
aExpandText, nScriptBegin, nCurrScript );
+                        rtl::OUString aScriptText = aExpandText.copy( nScriptBegin, nScriptEnd
- nScriptBegin );
+                        
+                        // Asian languages count words as characters
+                        if ( nCurrScript == ::com::sun::star::i18n::ScriptType::ASIAN )
+                        {
+                            // substract white spaces
+                            sal_Int32 nSpaceCount = 0;
+                            sal_Int32 nSpacePos = 0;
+                            
+                            // substract normal white spaces
+                            nSpacePos = -1;
+                            while ( ( nSpacePos = aScriptText.indexOf( ' ', nSpacePos + 1
) ) != -1 )
+                            {
+                                nSpaceCount++;
+                            }
+                            // substract Asian full-width white spaces
+                            nSpacePos = -1;
+                            while ( ( nSpacePos = aScriptText.indexOf( 12288, nSpacePos +
1 ) ) != -1 )
+                            {
+                                nSpaceCount++;
+                            }
+                            nTmpWords += nScriptEnd - nScriptBegin - nSpaceCount;
+                        }
+                        else
+                        {
+                            const String aScannerText( aScriptText );
+                            SwScanner aScanner( *this, aScannerText, 0, pConversionMap,
+                                                i18n::WordType::WORD_COUNT,
+                                                (xub_StrLen)0, (xub_StrLen)aScriptText.getLength()
);
+
+                            const rtl::OUString aBreakWord( CH_TXTATR_BREAKWORD );
+
+                            while ( aScanner.NextWord() )
+                            {
+                                if ( aScanner.GetLen() > 1 ||
+                                     CH_TXTATR_BREAKWORD != aScriptText.match(aBreakWord,
aScanner.GetBegin() ) )
+                                    ++nTmpWords;
+                            }
+                        }
+                        nScriptBegin = nScriptEnd;
                     }
                 }
 



Mime
View raw message