commit 26c2811cc474f7e3be953f73bf6e9d79f14022cd
Author: Jean-Marc Lasgouttes <[email protected]>
Date:   Tue May 14 22:44:29 2019 +0200

    Some Asian langagues allow to wrap text at any position
    
    This is hardcoded for now for simplicity and to allow backporting to
    2.3.
    
    The behavior is unchanged for all languages but Chinese, Japanese or
    Korean.
    
    Fixes part of bug #10299.
---
 src/Row.cpp |   23 +++++++++++++++++++++--
 1 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/Row.cpp b/src/Row.cpp
index 697e526..63b7195 100644
--- a/src/Row.cpp
+++ b/src/Row.cpp
@@ -19,6 +19,7 @@
 #include "Row.h"
 
 #include "DocIterator.h"
+#include "Language.h"
 
 #include "frontends/FontMetrics.h"
 
@@ -479,7 +480,25 @@ bool Row::shortenIfNeeded(pos_type const keep, int const 
w, int const next_width
                // make a copy of the element to work on it.
                Element brk = *cit_brk;
                wid_brk -= brk.dim.wid;
-               if (brk.countSeparators() == 0 || brk.pos < keep)
+               /*
+                * Some Asian languages split lines anywhere (no notion of
+                * word). It seems that QTextLayout is not aware of this fact.
+                * See for reference:
+                *    
https://en.wikipedia.org/wiki/Line_breaking_rules_in_East_Asian_languages
+                *
+                * FIXME: Something shall be done about characters which are
+                * not allowed at the beginning or end of line.
+                *
+                * FIXME: hardcoding languages is bad. Put this information in
+                * `languages' file.
+               */
+               string const lang = brk.font.language()->lang();
+               bool force = lang == "chinese-simplified"
+                            || lang == "chinese-traditional"
+                            || lang == "japanese"
+                            || lang == "korean";
+               // FIXME: is it important to check for separators?
+               if ((!force && brk.countSeparators() == 0) || brk.pos < keep)
                        continue;
                /* We have found a suitable separable element. This is the 
common case.
                 * Try to break it cleanly (at word boundary) at a length that 
is both
@@ -487,7 +506,7 @@ bool Row::shortenIfNeeded(pos_type const keep, int const w, 
int const next_width
                 * - shorter than the natural width of the element, in order to 
enforce
                 *   break-up.
                 */
-               if (brk.breakAt(min(w - wid_brk, brk.dim.wid - 2), false)) {
+               if (brk.breakAt(min(w - wid_brk, brk.dim.wid - 2), force)) {
                        /* if this element originally did not cause a row 
overflow
                         * in itself, and the remainder of the row would still 
be
                         * too large after breaking, then we will have issues in

Reply via email to