summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2013-04-19 11:45:57 +0200
committerLászló Németh <nemeth@numbertext.org>2013-04-19 11:47:58 +0200
commitf1f7dfebb3d147471ed2aa6a5b50326688cb4007 (patch)
tree7a0aa51a48ca88791e57270568d82f7a04c54c72
parent98d594abd42c5aa33d6981f4dd19582c2d345705 (diff)
fdo#63711 Calc: fix Catalan and Hungarian hyphenation
Change-Id: I08962578e5d41637e78c91f5df45e518893c82e5
-rw-r--r--editeng/source/editeng/impedit3.cxx49
1 files changed, 28 insertions, 21 deletions
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 92bb45ab372b..da52915fa92b 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -1748,6 +1748,9 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine* pLine, Te
sal_Bool bHangingPunctuation = sal_False;
sal_Unicode cAlternateReplChar = 0;
sal_Unicode cAlternateExtraChar = 0;
+ sal_Bool bAltFullLeft = sal_False;
+ sal_Bool bAltFullRight = sal_False;
+ sal_uInt32 nAltDelChar = 0;
if ( ( nMaxBreakPos < ( nMax + pLine->GetStart() ) ) && ( pNode->GetChar( nMaxBreakPos ) == ' ' ) )
{
@@ -1852,29 +1855,38 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine* pLine, Te
}
else
{
- String aAlt( xHyphWord->getHyphenatedWord() );
-
- // We expect the two cases, which might exist now:
+ // TODO: handle all alternative hyphenations (see hyphen-1.2.8/tests/unicode.*)
+ OUString aAlt( xHyphWord->getHyphenatedWord() );
+ OUString aWord2(aWord);
+ OUString aAltLeft(aAlt.copy(0, _nWordLen));
+ OUString aAltRight(aAlt.copy(_nWordLen));
+ bAltFullLeft = aWord2.startsWith(aAltLeft);
+ bAltFullRight = aWord2.endsWith(aAltRight);
+ nAltDelChar = aWord2.getLength() - aAlt.getLength() + (1 - bAltFullLeft) + (1 - bAltFullRight);
+
+ // NOTE: improved for other cases, see fdo#63711
+
+ // We expect[ed] the two cases:
// 1) packen becomes pak-ken
// 2) Schiffahrt becomes Schiff-fahrt
// In case 1, a character has to be replaced
// in case 2 a character is added.
// The identification is complicated by long
// compound words because the Hyphenator separates
- // all position of the word.
+ // all position of the word. [This is not true for libhyphen.]
// "Schiffahrtsbrennesseln" -> "Schifffahrtsbrennnesseln"
// We can thus actually not directly connect the index of the
// AlternativeWord to aWord. The whole issue will be simplified
// by a function in the Hyphenator as soon as AMA builds this in...
sal_uInt16 nAltStart = _nWordLen - 1;
- sal_uInt16 nTxtStart = nAltStart - (aAlt.Len() - aWord.Len());
+ sal_uInt16 nTxtStart = nAltStart - (aAlt.getLength() - aWord.Len());
sal_uInt16 nTxtEnd = nTxtStart;
sal_uInt16 nAltEnd = nAltStart;
// The regions between the nStart and nEnd is the
// difference between alternative and original string.
- while( nTxtEnd < aWord.Len() && nAltEnd < aAlt.Len() &&
- aWord.GetChar(nTxtEnd) != aAlt.GetChar(nAltEnd) )
+ while( nTxtEnd < aWord.Len() && nAltEnd < aAlt.getLength() &&
+ aWord.GetChar(nTxtEnd) != aAlt[nAltEnd] )
{
++nTxtEnd;
++nAltEnd;
@@ -1882,7 +1894,7 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine* pLine, Te
// If a character is added, then we notice it now:
if( nAltEnd > nTxtEnd && nAltStart == nAltEnd &&
- aWord.GetChar( nTxtEnd ) == aAlt.GetChar(nAltEnd) )
+ aWord.GetChar( nTxtEnd ) == aAlt[nAltEnd] )
{
++nAltEnd;
++nTxtStart;
@@ -1892,13 +1904,13 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine* pLine, Te
DBG_ASSERT( ( nAltEnd - nAltStart ) == 1, "Alternate: Wrong assumption!" );
if ( nTxtEnd > nTxtStart )
- cAlternateReplChar = aAlt.GetChar( nAltStart );
+ cAlternateReplChar = aAlt[nAltStart];
else
- cAlternateExtraChar = aAlt.GetChar( nAltStart );
+ cAlternateExtraChar = aAlt[nAltStart];
bHyphenated = sal_True;
nBreakPos = nWordStart + nTxtStart;
- if ( cAlternateReplChar )
+ if ( cAlternateReplChar || aAlt.getLength() < aWord2.getLength() || !bAltFullRight) // also for "oma-tje", "re-eel"
nBreakPos++;
}
}
@@ -1946,21 +1958,16 @@ void ImpEditEngine::ImpBreakLine( ParaPortion* pParaPortion, EditLine* pLine, Te
TextPortion* pHyphPortion = new TextPortion( 0 );
pHyphPortion->GetKind() = PORTIONKIND_HYPHENATOR;
String aHyphText(OUString(CH_HYPH));
- if ( cAlternateReplChar )
+ if ( (cAlternateReplChar || cAlternateExtraChar) && bAltFullRight ) // alternation after the break doesn't supported
{
TextPortion* pPrev = pParaPortion->GetTextPortions()[nEndPortion];
DBG_ASSERT( pPrev && pPrev->GetLen(), "Hyphenate: Prev portion?!" );
- pPrev->SetLen( pPrev->GetLen() - 1 );
- pHyphPortion->SetLen( 1 );
- pHyphPortion->SetExtraValue( cAlternateReplChar );
+ pPrev->SetLen( pPrev->GetLen() - nAltDelChar );
+ pHyphPortion->SetLen( nAltDelChar );
+ if (cAlternateReplChar && !bAltFullLeft) pHyphPortion->SetExtraValue( cAlternateReplChar );
// Correct width of the portion above:
pPrev->GetSize().Width() =
- pLine->GetCharPosArray()[ nBreakPos-1 - pLine->GetStart() - 1 ];
- }
- else if ( cAlternateExtraChar )
- {
- pHyphPortion->SetExtraValue( cAlternateExtraChar );
- aHyphText.Insert( OUString(cAlternateExtraChar), 0 );
+ pLine->GetCharPosArray()[ nBreakPos-1 - pLine->GetStart() - nAltDelChar ];
}
// Determine the width of the Hyph-Portion: