From 9a5c0b8ba8595b9084ad8dc27884b0cbc691459c Mon Sep 17 00:00:00 2001 From: "Felix (xq) Queißner" Date: Fri, 19 Jun 2020 01:02:25 +0200 Subject: Fixes bug in text highlighter, should not break Unicode anymore. --- src/geminirenderer.cpp | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'src/geminirenderer.cpp') diff --git a/src/geminirenderer.cpp b/src/geminirenderer.cpp index 9e7dcd6..fd628e5 100644 --- a/src/geminirenderer.cpp +++ b/src/geminirenderer.cpp @@ -267,39 +267,57 @@ std::unique_ptr GeminiRenderer::render( QTextCharFormat fmt = standard; + QByteArray buffer; + + auto flush = [&]() { + if(buffer.size() > 0) { + cursor.insertText(QString::fromUtf8(buffer), fmt); + buffer.resize(0); + } + }; + for(int i = 0; i < line.length(); i += 1) { char c = line.at(i); if(c == ' ') { + flush(); fmt = standard; - cursor.insertText(" "); + buffer.append(' '); rendering_bold = false; rendering_underlined = false; } else if(c == '*') { - if(rendering_bold) - cursor.insertText("*", fmt); + if(rendering_bold) { + buffer.append('*'); + } + flush(); rendering_bold = not rendering_bold; auto f = fmt.font(); f.setBold(rendering_bold); fmt.setFont(f); - if(rendering_bold) - cursor.insertText("*", fmt); + if(rendering_bold) { + buffer.append('*'); + } } else if(c == '_') { - if(rendering_underlined) - cursor.insertText(" ", fmt); + if(rendering_underlined) { + buffer.append(' '); + } + flush(); rendering_underlined = not rendering_underlined; auto f = fmt.font(); fmt.setUnderlineStyle(rendering_underlined ? QTextCharFormat::SingleUnderline : QTextCharFormat::NoUnderline); - if(rendering_underlined) - cursor.insertText(" ", fmt); + if(rendering_underlined) { + buffer.append(' '); + } } else { - cursor.insertText(QString::fromUtf8(&c, 1), fmt); + buffer.append(c); } } + flush(); + cursor.insertText("\n", standard); } else { -- cgit v1.2.3