From a93af583d19b9fd640ef287b90fabd0eaa7d0fe4 Mon Sep 17 00:00:00 2001 From: GHOST11111100 Date: Wed, 15 Jan 2025 21:22:13 +0300 Subject: [PATCH] added color code escaping --- src/graphics/ui/markdown.cpp | 70 ++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/src/graphics/ui/markdown.cpp b/src/graphics/ui/markdown.cpp index bbbc298a..8616facd 100644 --- a/src/graphics/ui/markdown.cpp +++ b/src/graphics/ui/markdown.cpp @@ -1,4 +1,5 @@ #include "markdown.hpp" + #include "coders/commons.hpp" #include "graphics/core/Font.hpp" @@ -23,14 +24,14 @@ static inline void emit_md( template static glm::vec4 parse_color(const std::basic_string_view& color_code) { if (color_code.size() != 8 || color_code[0] != '#') { - return glm::vec4(1, 1, 1, 1); // default to white + return glm::vec4(1, 1, 1, 1); // default to white } auto hex_to_float = [](char high, char low) { int high_val = hexchar2int(high); int low_val = hexchar2int(low); if (high_val == -1 || low_val == -1) { - return 1.0f; // default to max value on error + return 1.0f; // default to max value on error } return (high_val * 16 + low_val) / 255.0f; }; @@ -44,7 +45,9 @@ static glm::vec4 parse_color(const std::basic_string_view& color_code) { } template -static inline void apply_color(const std::basic_string_view& color_code, FontStylesScheme& styles) { +static inline void apply_color( + const std::basic_string_view& color_code, FontStylesScheme& styles +) { FontStyle style = styles.palette.back(); style.color = parse_color(color_code); styles.palette.push_back(style); @@ -73,7 +76,7 @@ Result process_markdown( std::basic_stringstream ss; FontStylesScheme styles { // markdown default - {{false, false, false, false, glm::vec4(1,1,1,0.5f)}, {}}, + {{false, false, false, false, glm::vec4(1, 1, 1, 0.5f)}, {}}, {} }; FontStyle style; @@ -81,18 +84,6 @@ Result process_markdown( while (pos < source.size()) { CharT first = source[pos]; - if (first == '[' && pos + 9 < source.size() && source[pos + 1] == '#' && source[pos + 8] == ']') { - std::basic_string_view color_code = source.substr(pos + 1, 8); - apply_color(color_code, styles); - if (!eraseMarkdown) { - for (int i = 0; i < 9; ++i) { - emit_md(source[pos + i], styles, ss); - } - } - pos += 9; // Skip past the color code - continue; - } - if (first == '\\') { if (pos + 1 < source.size()) { CharT second = source[++pos]; @@ -106,14 +97,39 @@ Result process_markdown( emit(second, styles, ss); pos++; continue; + case '[': + if (pos + 9 < source.size() && source[pos + 1] == '#' && + source[pos + 8] == ']') { + if (!eraseMarkdown) { + emit_md(source[pos - 1], styles, ss); + } + for (int i = 0; i < 10; ++i) { + + emit(source[pos + i], styles, ss); + } + + pos += 10; + continue; + } } pos--; } + } else if (first == '[' && pos + 9 < source.size() && + source[pos + 1] == '#' && source[pos + 8] == ']') { + std::basic_string_view color_code = + source.substr(pos + 1, 8); + apply_color(color_code, styles); + if (!eraseMarkdown) { + for (int i = 0; i < 9; ++i) { + emit_md(source[pos + i], styles, ss); + } + } + pos += 9; // Skip past the color code + continue; } 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); + if (!eraseMarkdown) emit_md(first, styles, ss); style.bold = !style.bold; restyle(first, style, styles, ss, pos, eraseMarkdown); continue; @@ -121,17 +137,17 @@ Result process_markdown( style.italic = !style.italic; 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); + if (!eraseMarkdown) emit_md(first, styles, ss); style.underline = !style.underline; 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); + if (!eraseMarkdown) emit_md(first, styles, ss); style.strikethrough = !style.strikethrough; restyle(first, style, styles, ss, pos, eraseMarkdown); continue; @@ -149,6 +165,8 @@ Result markdown::process(std::string_view source, bool eraseMarkdown) { return process_markdown(source, eraseMarkdown); } -Result markdown::process(std::wstring_view source, bool eraseMarkdown) { +Result markdown::process( + std::wstring_view source, bool eraseMarkdown +) { return process_markdown(source, eraseMarkdown); }