i18npool/source/breakiterator/breakiterator_unicode.cxx |   29 ++++++++++++++--
 1 file changed, 26 insertions(+), 3 deletions(-)

New commits:
commit 968f4d72a23bb28d097a7694d66f0b866b3b33f0
Author: László Németh <[email protected]>
Date:   Wed Sep 25 23:46:22 2013 +0200

    fdo#56392 fix hyphenation of words with punctuation
    
    Change-Id: I17e094fa93a7ba6a554f4bc2dfd353f718f1a500
    Reviewed-on: https://gerrit.libreoffice.org/6040
    Reviewed-by: Németh László <[email protected]>
    Tested-by: Németh László <[email protected]>

diff --git a/i18npool/source/breakiterator/breakiterator_unicode.cxx 
b/i18npool/source/breakiterator/breakiterator_unicode.cxx
index 0e64343..4c08a5f 100644
--- a/i18npool/source/breakiterator/breakiterator_unicode.cxx
+++ b/i18npool/source/breakiterator/breakiterator_unicode.cxx
@@ -373,12 +373,28 @@ LineBreakResults SAL_CALL 
BreakIterator_Unicode::getLineBreak(
             lbr.breakIndex = nStartPos;
             lbr.breakType = BreakType::WORDBOUNDARY;
         } else if (hOptions.rHyphenator.is()) { //Hyphenation break
-            Boundary wBoundary = getWordBoundary( Text, nStartPos, rLocale,
-                    WordType::DICTIONARY_WORD, false);
+            sal_Int32 boundary_with_punctuation = (line.aBreakIterator->next() 
!= BreakIterator::DONE) ? line.aBreakIterator->current() : 0;
+            line.aBreakIterator->preceding(nStartPos + 1); // reset to check 
correct hyphenation of "word-word"
+
+            sal_Int32 nStartPosWordEnd = nStartPos;
+            while (line.aBreakIterator->current() < nStartPosWordEnd && 
u_ispunct((sal_uInt32)Text[nStartPosWordEnd])) // starting punctuation
+                nStartPosWordEnd --;
+
+            Boundary wBoundary = getWordBoundary( Text, nStartPosWordEnd, 
rLocale,
+                WordType::DICTIONARY_WORD, false);
+
+            nStartPosWordEnd = wBoundary.endPos + 1;
+            while (nStartPosWordEnd < Text.getLength() && 
(u_ispunct((sal_uInt32)Text[nStartPosWordEnd]))) // ending punctuation
+                nStartPosWordEnd ++;
+            nStartPosWordEnd = nStartPosWordEnd - wBoundary.endPos - 1;
+            if (hOptions.hyphenIndex - wBoundary.startPos < nStartPosWordEnd) 
nStartPosWordEnd = hOptions.hyphenIndex - wBoundary.startPos;
+#define SPACE 0x0020
+            while (boundary_with_punctuation > wBoundary.endPos && 
Text[--boundary_with_punctuation] == SPACE);
+            if (boundary_with_punctuation != 0) boundary_with_punctuation += 1 
- wBoundary.endPos;
             uno::Reference< linguistic2::XHyphenatedWord > aHyphenatedWord;
             aHyphenatedWord = 
hOptions.rHyphenator->hyphenate(Text.copy(wBoundary.startPos,
                         wBoundary.endPos - wBoundary.startPos), rLocale,
-                    (sal_Int16) (hOptions.hyphenIndex - wBoundary.startPos), 
hOptions.aHyphenationOptions);
+                    (sal_Int16) (hOptions.hyphenIndex - wBoundary.startPos - 
nStartPosWordEnd), hOptions.aHyphenationOptions);
             if (aHyphenatedWord.is()) {
                 lbr.rHyphenatedWord = aHyphenatedWord;
                 if(wBoundary.startPos + aHyphenatedWord->getHyphenationPos() + 
1 < nMinBreakPos )
@@ -386,6 +402,13 @@ LineBreakResults SAL_CALL 
BreakIterator_Unicode::getLineBreak(
                 else
                     lbr.breakIndex = wBoundary.startPos; 
//aHyphenatedWord->getHyphenationPos();
                 lbr.breakType = BreakType::HYPHENATION;
+
+                // check not optimal hyphenation of "word-word" (word with 
hyphens)
+                if (lbr.breakIndex > -1 && wBoundary.startPos + 
aHyphenatedWord->getHyphenationPos() < line.aBreakIterator->current()) {
+                    lbr.breakIndex = line.aBreakIterator->current();
+                    lbr.breakType = BreakType::WORDBOUNDARY;
+                }
+
             } else {
                 lbr.breakIndex = line.aBreakIterator->preceding(nStartPos);
                 lbr.breakType = BreakType::WORDBOUNDARY;;
_______________________________________________
Libreoffice-commits mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to