summaryrefslogtreecommitdiff
path: root/editeng/source/misc/svxacorr.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source/misc/svxacorr.cxx')
-rw-r--r--editeng/source/misc/svxacorr.cxx144
1 files changed, 97 insertions, 47 deletions
diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index 4427c1fef69e..fb8bd2ad689b 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -33,6 +33,7 @@
#include <com/sun/star/io/XStream.hpp>
+#include <com/sun/star/lang/Locale.hpp>
#include <tools/urlobj.hxx>
#include <tools/table.hxx>
#include <i18npool/mslangid.hxx>
@@ -76,6 +77,8 @@
#include <xmloff/xmltoken.hxx>
#include <vcl/help.hxx>
+#define CHAR_HARDBLANK ((sal_Unicode)0x00A0)
+
using namespace ::com::sun::star::ucb;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star;
@@ -312,7 +315,13 @@ sal_Bool SvxAutoCorrect::IsAutoCorrectChar( sal_Unicode cChar )
cChar == ' ' || cChar == '\'' || cChar == '\"' ||
cChar == '*' || cChar == '_' ||
cChar == '.' || cChar == ',' || cChar == ';' ||
- cChar == ':' || cChar == '?' || cChar == '!';
+ cChar == ':' || cChar == '?' || cChar == '!' || cChar == '/';
+}
+
+sal_Bool SvxAutoCorrect::NeedsHardspaceAutocorr( sal_Unicode cChar )
+{
+ return cChar == ';' || cChar == ':' || cChar == '?' || cChar == '!' ||
+ cChar == '/' /*case for the urls exception*/;
}
/* -----------------19.11.98 10:15-------------------
@@ -323,9 +332,9 @@ long SvxAutoCorrect::GetDefaultFlags()
long nRet = Autocorrect
| CptlSttSntnc
| CptlSttWrd
- | ChgFractionSymbol
| ChgOrdinalNumber
| ChgToEnEmDash
+ | AddNonBrkSpace
| ChgWeightUnderl
| SetINetAttr
| ChgQuotes
@@ -362,9 +371,6 @@ SvxAutoCorrect::SvxAutoCorrect( const String& rShareAutocorrFile,
{
nFlags = SvxAutoCorrect::GetDefaultFlags();
- c1Div2 = ByteString::ConvertToUnicode( '\xBD', RTL_TEXTENCODING_MS_1252 );
- c1Div4 = ByteString::ConvertToUnicode( '\xBC', RTL_TEXTENCODING_MS_1252 );
- c3Div4 = ByteString::ConvertToUnicode( '\xBE', RTL_TEXTENCODING_MS_1252 );
cEmDash = ByteString::ConvertToUnicode( '\x97', RTL_TEXTENCODING_MS_1252 );
cEnDash = ByteString::ConvertToUnicode( '\x96', RTL_TEXTENCODING_MS_1252 );
}
@@ -382,7 +388,6 @@ SvxAutoCorrect::SvxAutoCorrect( const SvxAutoCorrect& rCpy )
nFlags( rCpy.nFlags & ~(ChgWordLstLoad|CplSttLstLoad|WrdSttLstLoad)),
cStartDQuote( rCpy.cStartDQuote ), cEndDQuote( rCpy.cEndDQuote ),
cStartSQuote( rCpy.cStartSQuote ), cEndSQuote( rCpy.cEndSQuote ),
- c1Div2( rCpy.c1Div2 ), c1Div4( rCpy.c1Div4 ), c3Div4( rCpy.c3Div4 ),
cEmDash( rCpy.cEmDash ), cEnDash( rCpy.cEnDash )
{
}
@@ -466,40 +471,6 @@ BOOL SvxAutoCorrect::FnCptlSttWrd( SvxAutoCorrDoc& rDoc, const String& rTxt,
}
-BOOL SvxAutoCorrect::FnChgFractionSymbol(
- SvxAutoCorrDoc& rDoc, const String& rTxt,
- xub_StrLen nSttPos, xub_StrLen nEndPos )
-{
- sal_Unicode cChar = 0;
-
- for( ; nSttPos < nEndPos; ++nSttPos )
- if( !lcl_IsInAsciiArr( sImplSttSkipChars, rTxt.GetChar( nSttPos ) ))
- break;
- for( ; nSttPos < nEndPos; --nEndPos )
- if( !lcl_IsInAsciiArr( sImplEndSkipChars, rTxt.GetChar( nEndPos - 1 ) ))
- break;
-
- // 1/2, 1/4, ... ersetzen durch das entsprechende Zeichen vom Font
- if( 3 == nEndPos - nSttPos && '/' == rTxt.GetChar( nSttPos+1 ))
- {
- switch( ( rTxt.GetChar( nSttPos )) * 256 + rTxt.GetChar( nEndPos-1 ))
- {
- case '1' * 256 + '2': cChar = c1Div2; break;
- case '1' * 256 + '4': cChar = c1Div4; break;
- case '3' * 256 + '4': cChar = c3Div4; break;
- }
-
- if( cChar )
- {
- // also austauschen:
- rDoc.Delete( nSttPos+1, nEndPos );
- rDoc.Replace( nSttPos, cChar );
- }
- }
- return 0 != cChar;
-}
-
-
BOOL SvxAutoCorrect::FnChgOrdinalNumber(
SvxAutoCorrDoc& rDoc, const String& rTxt,
xub_StrLen nSttPos, xub_StrLen nEndPos,
@@ -671,6 +642,80 @@ BOOL SvxAutoCorrect::FnChgToEnEmDash(
return bRet;
}
+BOOL SvxAutoCorrect::FnAddNonBrkSpace(
+ SvxAutoCorrDoc& rDoc, const String& rTxt,
+ xub_StrLen, xub_StrLen nEndPos,
+ LanguageType eLang )
+{
+ bool bRet = false;
+
+ CharClass& rCC = GetCharClass( eLang );
+ const lang::Locale rLocale = rCC.getLocale( );
+
+ if ( rLocale.Language == OUString::createFromAscii( "fr" ) )
+ {
+ bool bFrCA = rLocale.Country == OUString::createFromAscii( "CA" );
+ OUString allChars = OUString::createFromAscii( ":;!?" );
+ OUString chars( allChars );
+ if ( bFrCA )
+ chars = OUString::createFromAscii( ":" );
+
+ sal_Unicode cChar = rTxt.GetChar( nEndPos );
+ bool bHasSpace = chars.indexOf( sal_Unicode( cChar ) ) != -1;
+ bool bIsSpecial = allChars.indexOf( sal_Unicode( cChar ) ) != -1;
+ if ( bIsSpecial )
+ {
+ // Get the last word delimiter position
+ xub_StrLen nSttWdPos = nEndPos;
+ while( nSttWdPos && !IsWordDelim( rTxt.GetChar( --nSttWdPos )))
+ ;
+
+ // Check the presence of "://" in the word
+ xub_StrLen nStrPos = rTxt.Search( String::CreateFromAscii( "://" ), nSttWdPos + 1 );
+ if ( STRING_NOTFOUND == nStrPos )
+ {
+ // Check the previous char
+ sal_Unicode cPrevChar = rTxt.GetChar( nEndPos - 1 );
+ if ( ( chars.indexOf( sal_Unicode( cPrevChar ) ) == -1 ) && cPrevChar != '\t' )
+ {
+ // Remove any previous normal space
+ xub_StrLen nPos = nEndPos - 1;
+ while ( cPrevChar == ' ' || cPrevChar == CHAR_HARDBLANK )
+ {
+ if ( nPos == 0 ) break;
+ nPos--;
+ cPrevChar = rTxt.GetChar( nPos );
+ }
+
+ if ( nPos != 0 )
+ {
+ nPos++;
+ if ( nEndPos - nPos > 0 )
+ rDoc.Delete( nPos, nEndPos );
+
+ // Add the non-breaking space at the end pos
+ if ( bHasSpace )
+ rDoc.Insert( nPos, CHAR_HARDBLANK );
+ bRet = true;
+ }
+ }
+ }
+ }
+ else if ( cChar == '/' )
+ {
+ // Remove the hardspace right before to avoid formatting URLs
+ sal_Unicode cPrevChar = rTxt.GetChar( nEndPos - 1 );
+ sal_Unicode cMaybeSpaceChar = rTxt.GetChar( nEndPos - 2 );
+ if ( cPrevChar == ':' && cMaybeSpaceChar == CHAR_HARDBLANK )
+ {
+ rDoc.Delete( nEndPos - 2, nEndPos - 1 );
+ bRet = true;
+ }
+ }
+ }
+
+ return bRet;
+}
BOOL SvxAutoCorrect::FnSetINetAttr( SvxAutoCorrDoc& rDoc, const String& rTxt,
xub_StrLen nSttPos, xub_StrLen nEndPos,
@@ -1152,10 +1197,10 @@ ULONG SvxAutoCorrect::AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
{
//JP 10.02.97: doppelte Spaces verhindern
if( nInsPos && ' ' == cChar &&
- IsAutoCorrFlag( IngnoreDoubleSpace ) &&
+ IsAutoCorrFlag( IgnoreDoubleSpace ) &&
' ' == rTxt.GetChar( nInsPos - 1 ) )
{
- nRet = IngnoreDoubleSpace;
+ nRet = IgnoreDoubleSpace;
break;
}
@@ -1183,6 +1228,13 @@ ULONG SvxAutoCorrect::AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
rDoc.Insert( nInsPos, cChar );
else
rDoc.Replace( nInsPos, cChar );
+
+ // Hardspaces autocorrection
+ if ( NeedsHardspaceAutocorr( cChar ) && IsAutoCorrFlag( AddNonBrkSpace ) &&
+ FnAddNonBrkSpace( rDoc, rTxt, 0, nInsPos, rDoc.GetLanguage( nInsPos, FALSE ) ) )
+ {
+ nRet = AddNonBrkSpace;
+ }
}
if( !nInsPos )
@@ -1277,9 +1329,7 @@ ULONG SvxAutoCorrect::AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
}
}
- if( ( IsAutoCorrFlag( nRet = ChgFractionSymbol ) &&
- FnChgFractionSymbol( rDoc, rTxt, nCapLttrPos, nInsPos ) ) ||
- ( IsAutoCorrFlag( nRet = ChgOrdinalNumber ) &&
+ if( ( IsAutoCorrFlag( nRet = ChgOrdinalNumber ) &&
FnChgOrdinalNumber( rDoc, rTxt, nCapLttrPos, nInsPos, eLang ) ) ||
( IsAutoCorrFlag( nRet = SetINetAttr ) &&
( ' ' == cChar || '\t' == cChar || 0x0a == cChar || !cChar ) &&
@@ -1325,9 +1375,9 @@ ULONG SvxAutoCorrect::AutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
if( nRet & ChgQuotes) nHelpId = 16;
else if( nRet & ChgSglQuotes) nHelpId = 17;
else if( nRet & SetINetAttr) nHelpId = 18;
- else if( nRet & IngnoreDoubleSpace) nHelpId = 19;
+ else if( nRet & IgnoreDoubleSpace) nHelpId = 19;
else if( nRet & ChgWeightUnderl) nHelpId = 20;
- else if( nRet & ChgFractionSymbol ) nHelpId = 21;
+ else if( nRet & AddNonBrkSpace) nHelpId = 21;
else if( nRet & ChgOrdinalNumber) nHelpId = 22;
}