]> git.lyx.org Git - lyx.git/commitdiff
Handle properly unicode paragraph/line break
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 7 Nov 2016 09:14:39 +0000 (10:14 +0100)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 10 Nov 2016 08:37:36 +0000 (09:37 +0100)
They are shown on screen by arrow or pilcrow symbol and cause a line break.

They are still not handled in LaTeX output, though.

src/Paragraph.cpp
src/TextMetrics.cpp

index 8afa475a74295e91e3a973221cea8578f561991e..05c10b5fa64f9ef8fbf3ef246a68a74c1952e2f7 100644 (file)
@@ -3147,6 +3147,11 @@ bool Paragraph::isHfill(pos_type pos) const
 
 bool Paragraph::isNewline(pos_type pos) const
 {
+       // U+2028 LINE SEPARATOR
+       // U+2029 PARAGRAPH SEPARATOR
+       char_type const c = d->text_[pos];
+       if (c == 0x2028 || c == 0x2029)
+               return true;
        Inset const * inset = getInset(pos);
        return inset && inset->lyxCode() == NEWLINE_CODE;
 }
index 8f7ac821e8777339e2babbd73cd44805f2968963..17ee2e410afe56b0c3325953cef3a82cb1d251ef 100644 (file)
@@ -864,7 +864,23 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
                } else if (c == '\t')
                        row.addSpace(i, theFontMetrics(*fi).width(from_ascii("    ")),
                                     *fi, par.lookupChange(i));
-               else {
+               else if (c == 0x2028 || c == 0x2029) {
+                       /**
+                        * U+2028 LINE SEPARATOR
+                        * U+2029 PARAGRAPH SEPARATOR
+
+                        * These are special unicode characters that break
+                        * lines/pragraphs. Not handling them lead to trouble wrt
+                        * Qt QTextLayout formatting. We add a visible character
+                        * on screen so that the user can see that something is
+                        * happening.
+                       */
+                       row.finalizeLast();
+                       // ⤶ U+2936 ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS
+                       // ¶ U+00B6 PILCROW SIGN
+                       char_type const screen_char = (c == 0x2028) ? 0x2936 : 0x00B6;
+                       row.add(i, screen_char, *fi, par.lookupChange(i));
+               } else {
                        // FIXME: please someone fix the Hebrew/Arabic parenthesis mess!
                        // see also Paragraph::getUChar.
                        if (fi->language()->lang() == "hebrew") {
@@ -925,6 +941,7 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
                BufferParams const & bparams
                        = text_->inset().buffer().params();
                f.setLanguage(par.getParLanguage(bparams));
+               // ¶ U+00B6 PILCROW SIGN
                row.addVirtual(end, docstring(1, char_type(0x00B6)), f, Change());
        }