From 6dfbab31245df074df4d1664321e2ff434f3ca6a Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 7 Nov 2016 10:14:39 +0100 Subject: [PATCH] Handle properly unicode paragraph/line break 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 | 5 +++++ src/TextMetrics.cpp | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 8afa475a74..05c10b5fa6 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -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; } diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 8f7ac821e8..17ee2e410a 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -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()); } -- 2.39.5