OSDN Git Service

Enhance auto hyphenation.
authorShimeng (Simon) Wang <swang@google.com>
Fri, 29 Oct 2010 00:14:27 +0000 (17:14 -0700)
committerShimeng (Simon) Wang <swang@google.com>
Fri, 29 Oct 2010 17:40:05 +0000 (10:40 -0700)
1. Bypass leading white spaces, since webkit does pass them down.
2. Return better hyphenation point, since previously it's more
aggressive and causes display issue in Google books.

issue: 2672163
Change-Id: I8ae47f7c553f533f752d6f7c697cf2fffd421e5b

WebCore/platform/text/android/HyphenationAndroid.cpp

index e8ba5ef..cff0a66 100644 (file)
@@ -75,6 +75,7 @@ size_t lastHyphenLocation(const UChar* characters, size_t length, size_t beforeI
         return 0;
 
     char word[maxWordLen];
+    int wordLength = 0;
     for (size_t i = 0; i < length; ++i) {
         const UChar ch = characters[i];
         // Only English for now.
@@ -82,17 +83,24 @@ size_t lastHyphenLocation(const UChar* characters, size_t length, size_t beforeI
         // detection or rely on the langAttr in the html element.  Though
         // seems right now the langAttr is not used or quite implemented in
         // webkit.
-        if (!isASCIIAlpha(ch))
+        if (!isASCIIAlpha(ch)) {
+            // Bypass leading spaces.
+            if (isASCIISpace(ch) && !wordLength)
+              continue;
             return 0;
-        word[i] = ch;
+        }
+        word[wordLength++] = ch;
     }
+    if (wordLength < minWordLen)
+        return 0;
 
     static const int extraBuffer = 5;
+    const int leadingSpacesCount = length - wordLength;
     char hyphens[maxWordLen + extraBuffer];
-    if (!hnj_hyphen_hyphenate(dict, word, length, hyphens)) {
-        for (size_t i = beforeIndex - 1; i > 0; --i) {
+    if (!hnj_hyphen_hyphenate(dict, word, wordLength, hyphens)) {
+        for (size_t i = beforeIndex - 2 - leadingSpacesCount; i > 0; --i) {
             if (hyphens[i] & 1)
-                return i + 1;
+                return i + 1 + leadingSpacesCount;
         }
     }