diff options
-rw-r--r-- | editeng/source/misc/svxacorr.cxx | 55 | ||||
-rw-r--r-- | include/editeng/svxacorr.hxx | 10 |
2 files changed, 33 insertions, 32 deletions
diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx index 71f6efc2e33f..ebc0ec810a60 100644 --- a/editeng/source/misc/svxacorr.cxx +++ b/editeng/source/misc/svxacorr.cxx @@ -1192,9 +1192,8 @@ sal_Unicode SvxAutoCorrect::GetQuote( sal_Unicode cInsChar, bool bSttQuote, void SvxAutoCorrect::InsertQuote( SvxAutoCorrDoc& rDoc, sal_Int32 nInsPos, sal_Unicode cInsChar, bool bSttQuote, - bool bIns, bool b_iApostrophe ) const + bool bIns, LanguageType eLang, ACQuotes eType ) const { - const LanguageType eLang = GetDocLanguage( rDoc, nInsPos ); sal_Unicode cRet = GetQuote( cInsChar, bSttQuote, eLang ); OUString sChg( cInsChar ); @@ -1205,36 +1204,21 @@ void SvxAutoCorrect::InsertQuote( SvxAutoCorrDoc& rDoc, sal_Int32 nInsPos, sChg = OUString(cRet); - if( '\"' == cInsChar ) + if( eType == ACQuotes::NonBreakingSpace ) { - if (primary(eLang) == primary(LANGUAGE_FRENCH) && eLang != LANGUAGE_FRENCH_SWISS) + OUString s( cNonBreakingSpace ); // UNICODE code for no break space + if( rDoc.Insert( bSttQuote ? nInsPos+1 : nInsPos, s )) { - OUString s( cNonBreakingSpace ); // UNICODE code for no break space - if( rDoc.Insert( bSttQuote ? nInsPos+1 : nInsPos, s )) - { - if( !bSttQuote ) - ++nInsPos; - } + if( !bSttQuote ) + ++nInsPos; } } rDoc.Replace( nInsPos, sChg ); - // i' -> I' in English (last step for the undo) - if( b_iApostrophe && eLang.anyOf( - LANGUAGE_ENGLISH, - LANGUAGE_ENGLISH_US, - LANGUAGE_ENGLISH_UK, - LANGUAGE_ENGLISH_AUS, - LANGUAGE_ENGLISH_CAN, - LANGUAGE_ENGLISH_NZ, - LANGUAGE_ENGLISH_EIRE, - LANGUAGE_ENGLISH_SAFRICA, - LANGUAGE_ENGLISH_JAMAICA, - LANGUAGE_ENGLISH_CARIBBEAN)) - { + // i' -> I' in English (last step for the Undo) + if( eType == ACQuotes::CapitalizeIAm ) rDoc.Replace( nInsPos-1, "I" ); - } } OUString SvxAutoCorrect::GetQuote( SvxAutoCorrDoc const & rDoc, sal_Int32 nInsPos, @@ -1285,7 +1269,8 @@ void SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt, { sal_Unicode cPrev; bool bSttQuote = !nInsPos; - bool b_iApostrophe = false; + ACQuotes eType = ACQuotes::NONE; + const LanguageType eLang = GetDocLanguage( rDoc, nInsPos ); if (!bSttQuote) { cPrev = rTxt[ nInsPos-1 ]; @@ -1295,17 +1280,25 @@ void SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt, ( cEnDash == cPrev ); // tdf#38394 use opening quotation mark << in French l'<<word>> if ( !bSingle && !bSttQuote && cPrev == cApostrophe && + primary(eLang) == primary(LANGUAGE_FRENCH) && (nInsPos == 2 || (nInsPos > 2 && IsWordDelim( rTxt[ nInsPos-3 ] ))) ) { - const LanguageType eLang = GetDocLanguage( rDoc, nInsPos ); - if ( primary(eLang) == primary(LANGUAGE_FRENCH) ) - bSttQuote = true; + bSttQuote = true; } // tdf#108423 for capitalization of English i'm - b_iApostrophe = bSingle && ( cPrev == 'i' ) && - (( nInsPos == 1 ) || IsWordDelim( rTxt[ nInsPos-2 ] )); + else if ( bSingle && ( cPrev == 'i' ) && + primary(eLang) == primary(LANGUAGE_ENGLISH) && + ( nInsPos == 1 || IsWordDelim( rTxt[ nInsPos-2 ] ) ) ) + { + eType = ACQuotes::CapitalizeIAm; + } } - InsertQuote( rDoc, nInsPos, cChar, bSttQuote, bInsert, b_iApostrophe ); + + if ( eType == ACQuotes::NONE && !bSingle && + ( primary(eLang) == primary(LANGUAGE_FRENCH) && eLang != LANGUAGE_FRENCH_SWISS ) ) + eType = ACQuotes::NonBreakingSpace; + + InsertQuote( rDoc, nInsPos, cChar, bSttQuote, bInsert, eLang, eType ); break; } diff --git a/include/editeng/svxacorr.hxx b/include/editeng/svxacorr.hxx index df6a3214792b..708c25adb52a 100644 --- a/include/editeng/svxacorr.hxx +++ b/include/editeng/svxacorr.hxx @@ -80,6 +80,13 @@ namespace o3tl { template<> struct typed_flags<ACFlags> : is_typed_flags<ACFlags, 0xe0003fff> {}; } +enum class ACQuotes +{ + NONE, + NonBreakingSpace, + CapitalizeIAm, +}; + // TODO: handle code points > U+FFFF and check users of this class // only a mapping class @@ -324,7 +331,8 @@ public: OUString GetQuote( SvxAutoCorrDoc const & rDoc, sal_Int32 nInsPos, sal_Unicode cInsChar, bool bSttQuote ); void InsertQuote( SvxAutoCorrDoc& rDoc, sal_Int32 nInsPos, - sal_Unicode cInsChar, bool bSttQuote, bool bIns, bool b_iApostrophe ) const; + sal_Unicode cInsChar, bool bSttQuote, bool bIns, + LanguageType eLang, ACQuotes eType ) const; // Query/Set the name of the AutoCorrect file // the default is "autocorr.dat" |