diff --git a/src/graphics/ui/markdown.cpp b/src/graphics/ui/markdown.cpp index dd8613b5..8a1b13bf 100644 --- a/src/graphics/ui/markdown.cpp +++ b/src/graphics/ui/markdown.cpp @@ -56,7 +56,22 @@ static inline void apply_color(const std::basic_string_view& color_code, styles.palette.push_back(style); } -// TODO: Refactor md code processing +template +static inline void restyle( + CharT c, + FontStyle& style, + FontStylesScheme& styles, + std::basic_stringstream& ss, + int& pos, + bool eraseMarkdown +) { + styles.palette.push_back(style); + if (!eraseMarkdown) { + emit_md(c, styles, ss); + } + pos++; +} + template Result process_markdown( std::basic_string_view source, bool eraseMarkdown @@ -101,33 +116,32 @@ Result process_markdown( pos--; } } else if (first == '*') { - if (pos + 1 < source.size() && source[pos + 1] == '*') { + if (pos + 1 < source.size() && source[pos+1] == '*') { pos++; if (!eraseMarkdown) emit_md(first, styles, ss); style.bold = !style.bold; - styles.palette.push_back(style); + restyle(first, style, styles, ss, pos, eraseMarkdown); continue; } style.italic = !style.italic; - styles.palette.push_back(style); + restyle(first, style, styles, ss, pos, eraseMarkdown); continue; - } else if (first == '_' && pos + 1 < source.size() && source[pos + 1] == '_') { + } else if (first == '_' && pos + 1 < source.size() && source[pos+1] == '_') { pos++; if (!eraseMarkdown) emit_md(first, styles, ss); style.underline = !style.underline; - styles.palette.push_back(style); + restyle(first, style, styles, ss, pos, eraseMarkdown); continue; - } else if (first == '~' && pos + 1 < source.size() && source[pos + 1] == '~') { + } else if (first == '~' && pos + 1 < source.size() && source[pos+1] == '~') { pos++; if (!eraseMarkdown) emit_md(first, styles, ss); style.strikethrough = !style.strikethrough; - styles.palette.push_back(style); + restyle(first, style, styles, ss, pos, eraseMarkdown); continue; } - if (first == '\n') { styles.palette.push_back(styles.palette.at(1)); }