[Libreoffice-commits] core.git: i18npool/source

László Németh nemeth at numbertext.org
Thu Sep 26 01:34:01 PDT 2013


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

New commits:
commit 968f4d72a23bb28d097a7694d66f0b866b3b33f0
Author: László Németh <nemeth at numbertext.org>
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ó <nemeth at numbertext.org>
    Tested-by: Németh László <nemeth at numbertext.org>

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;;


More information about the Libreoffice-commits mailing list