a19eba4
From f276ca939deb3ee19d171b8541cd18baa4eec3d1 Mon Sep 17 00:00:00 2001
a19eba4
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
a19eba4
Date: Fri, 1 Jul 2016 14:38:54 +0100
a19eba4
Subject: [PATCH] don't autocapitalize words that follow a field mark
a19eba4
a19eba4
Change-Id: Ia8efa88aaf47edba9a590c858d0ea30d7bfe2977
a19eba4
---
a19eba4
 editeng/qa/unit/core-test.cxx    | 22 ++++++++++++++++++++++
a19eba4
 editeng/source/misc/svxacorr.cxx | 18 ++++++++++++------
a19eba4
 2 files changed, 34 insertions(+), 6 deletions(-)
a19eba4
a19eba4
diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx
a19eba4
index d303805..14f06fe 100644
a19eba4
--- a/editeng/qa/unit/core-test.cxx
a19eba4
+++ b/editeng/qa/unit/core-test.cxx
a19eba4
@@ -340,6 +340,28 @@ void Test::testAutocorrect()
a19eba4
 
a19eba4
         CPPUNIT_ASSERT_EQUAL(sExpected, aFoo.getResult());
a19eba4
     }
a19eba4
+
a19eba4
+    {
a19eba4
+        OUString sInput("Test. test");
a19eba4
+        sal_Unicode cNextChar(' ');
a19eba4
+        OUString sExpected("Test. Test ");
a19eba4
+
a19eba4
+        TestAutoCorrDoc aFoo(sInput, LANGUAGE_ENGLISH_US);
a19eba4
+        aAutoCorrect.DoAutoCorrect(aFoo, sInput, sInput.getLength(), cNextChar, true);
a19eba4
+
a19eba4
+        CPPUNIT_ASSERT_MESSAGE("autocorrect", aFoo.getResult() == sExpected);
a19eba4
+    }
a19eba4
+
a19eba4
+    {
a19eba4
+        OUString sInput("Test. \x01 test");
a19eba4
+        sal_Unicode cNextChar(' ');
a19eba4
+        OUString sExpected("Test. \x01 test ");
a19eba4
+
a19eba4
+        TestAutoCorrDoc aFoo(sInput, LANGUAGE_ENGLISH_US);
a19eba4
+        aAutoCorrect.DoAutoCorrect(aFoo, sInput, sInput.getLength(), cNextChar, true);
a19eba4
+
a19eba4
+        CPPUNIT_ASSERT_MESSAGE("autocorrect", aFoo.getResult() == sExpected);
a19eba4
+    }
a19eba4
 }
a19eba4
 
a19eba4
 namespace {
a19eba4
diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
a19eba4
index d736d94..11e56ef 100644
a19eba4
--- a/editeng/source/misc/svxacorr.cxx
a19eba4
+++ b/editeng/source/misc/svxacorr.cxx
a19eba4
@@ -102,6 +102,12 @@ static inline bool IsWordDelim( const sal_Unicode c )
a19eba4
             cNonBreakingSpace == c || 0x2011 == c || 0x1 == c;
a19eba4
 }
a19eba4
 
a19eba4
+static inline bool IsAutoCapitalizeWordDelim( const sal_Unicode c )
a19eba4
+{
a19eba4
+    return ' ' == c || '\t' == c || 0x0a == c ||
a19eba4
+            cNonBreakingSpace == c || 0x2011 == c;
a19eba4
+}
a19eba4
+
a19eba4
 static inline bool IsLowerLetter( sal_Int32 nCharType )
a19eba4
 {
a19eba4
     return CharClass::isLetterType( nCharType ) &&
a19eba4
@@ -855,9 +861,9 @@ bool SvxAutoCorrect::FnCapitalStartSentence( SvxAutoCorrDoc& rDoc,
a19eba4
 
a19eba4
     if( !bAtStart ) // Still no beginning of a paragraph?
a19eba4
     {
a19eba4
-        if ( IsWordDelim( *pStr ) )
a19eba4
+        if (IsAutoCapitalizeWordDelim(*pStr))
a19eba4
         {
a19eba4
-            while( ! ( bAtStart = (pStart == pStr--) ) && IsWordDelim( *pStr ) )
a19eba4
+            while (!(bAtStart = (pStart == pStr--)) && IsAutoCapitalizeWordDelim(*pStr))
a19eba4
                 ;
a19eba4
         }
a19eba4
         // Asian full stop, full width full stop, full width exclamation mark
a19eba4
@@ -888,7 +894,7 @@ bool SvxAutoCorrect::FnCapitalStartSentence( SvxAutoCorrDoc& rDoc,
a19eba4
 
a19eba4
         do {            // overwrite all blanks
a19eba4
             --pStr;
a19eba4
-            if( !IsWordDelim( *pStr ))
a19eba4
+            if (!IsAutoCapitalizeWordDelim(*pStr))
a19eba4
                 break;
a19eba4
         } while( ! ( bAtStart = (pStart == pStr) ) );
a19eba4
 
a19eba4
@@ -983,7 +989,7 @@ bool SvxAutoCorrect::FnCapitalStartSentence( SvxAutoCorrDoc& rDoc,
a19eba4
                 else
a19eba4
                     bAlphaFnd = true;
a19eba4
             }
a19eba4
-            else if( bAlphaFnd || IsWordDelim( *pTmpStr ) )
a19eba4
+            else if (bAlphaFnd || IsAutoCapitalizeWordDelim(*pTmpStr))
a19eba4
                 break;
a19eba4
 
a19eba4
             if( pTmpStr == pStart )
a19eba4
@@ -999,7 +1005,7 @@ bool SvxAutoCorrect::FnCapitalStartSentence( SvxAutoCorrDoc& rDoc,
a19eba4
     bool bNumericOnly = '0' <= *(pStr+1) && *(pStr+1) <= '9';
a19eba4
 
a19eba4
     // Search for the beginning of the word
a19eba4
-    while( !IsWordDelim( *pStr ))
a19eba4
+    while (!IsAutoCapitalizeWordDelim(*pStr))
a19eba4
     {
a19eba4
         if( bNumericOnly && rCC.isLetter( aText, pStr - pStart ) )
a19eba4
             bNumericOnly = false;
a19eba4
@@ -1013,7 +1019,7 @@ bool SvxAutoCorrect::FnCapitalStartSentence( SvxAutoCorrDoc& rDoc,
a19eba4
     if( bNumericOnly )      // consists of only numbers, then not
a19eba4
         return false;
a19eba4
 
a19eba4
-    if( IsWordDelim( *pStr ))
a19eba4
+    if (IsAutoCapitalizeWordDelim(*pStr))
a19eba4
         ++pStr;
a19eba4
 
a19eba4
     OUString sWord;
a19eba4
-- 
a19eba4
2.7.4
a19eba4