added color code escaping

This commit is contained in:
GHOST11111100
2025-01-15 21:22:13 +03:00
parent 6ca8dc18cf
commit a93af583d1
+44 -26
View File
@@ -1,4 +1,5 @@
#include "markdown.hpp" #include "markdown.hpp"
#include "coders/commons.hpp" #include "coders/commons.hpp"
#include "graphics/core/Font.hpp" #include "graphics/core/Font.hpp"
@@ -23,14 +24,14 @@ static inline void emit_md(
template <typename CharT> template <typename CharT>
static glm::vec4 parse_color(const std::basic_string_view<CharT>& color_code) { static glm::vec4 parse_color(const std::basic_string_view<CharT>& color_code) {
if (color_code.size() != 8 || color_code[0] != '#') { 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) { auto hex_to_float = [](char high, char low) {
int high_val = hexchar2int(high); int high_val = hexchar2int(high);
int low_val = hexchar2int(low); int low_val = hexchar2int(low);
if (high_val == -1 || low_val == -1) { 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; return (high_val * 16 + low_val) / 255.0f;
}; };
@@ -44,7 +45,9 @@ static glm::vec4 parse_color(const std::basic_string_view<CharT>& color_code) {
} }
template <typename CharT> template <typename CharT>
static inline void apply_color(const std::basic_string_view<CharT>& color_code, FontStylesScheme& styles) { static inline void apply_color(
const std::basic_string_view<CharT>& color_code, FontStylesScheme& styles
) {
FontStyle style = styles.palette.back(); FontStyle style = styles.palette.back();
style.color = parse_color(color_code); style.color = parse_color(color_code);
styles.palette.push_back(style); styles.palette.push_back(style);
@@ -73,7 +76,7 @@ Result<CharT> process_markdown(
std::basic_stringstream<CharT> ss; std::basic_stringstream<CharT> ss;
FontStylesScheme styles { FontStylesScheme styles {
// markdown default // 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; FontStyle style;
@@ -81,18 +84,6 @@ Result<CharT> process_markdown(
while (pos < source.size()) { while (pos < source.size()) {
CharT first = source[pos]; CharT first = source[pos];
if (first == '[' && pos + 9 < source.size() && source[pos + 1] == '#' && source[pos + 8] == ']') {
std::basic_string_view<CharT> 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 (first == '\\') {
if (pos + 1 < source.size()) { if (pos + 1 < source.size()) {
CharT second = source[++pos]; CharT second = source[++pos];
@@ -106,14 +97,39 @@ Result<CharT> process_markdown(
emit(second, styles, ss); emit(second, styles, ss);
pos++; pos++;
continue; 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--; pos--;
} }
} else if (first == '[' && pos + 9 < source.size() &&
source[pos + 1] == '#' && source[pos + 8] == ']') {
std::basic_string_view<CharT> 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 == '*') { } else if (first == '*') {
if (pos + 1 < source.size() && source[pos+1] == '*') { if (pos + 1 < source.size() && source[pos + 1] == '*') {
pos++; pos++;
if (!eraseMarkdown) if (!eraseMarkdown) emit_md(first, styles, ss);
emit_md(first, styles, ss);
style.bold = !style.bold; style.bold = !style.bold;
restyle(first, style, styles, ss, pos, eraseMarkdown); restyle(first, style, styles, ss, pos, eraseMarkdown);
continue; continue;
@@ -121,17 +137,17 @@ Result<CharT> process_markdown(
style.italic = !style.italic; style.italic = !style.italic;
restyle(first, style, styles, ss, pos, eraseMarkdown); restyle(first, style, styles, ss, pos, eraseMarkdown);
continue; continue;
} else if (first == '_' && pos + 1 < source.size() && source[pos+1] == '_') { } else if (first == '_' && pos + 1 < source.size() &&
source[pos + 1] == '_') {
pos++; pos++;
if (!eraseMarkdown) if (!eraseMarkdown) emit_md(first, styles, ss);
emit_md(first, styles, ss);
style.underline = !style.underline; style.underline = !style.underline;
restyle(first, style, styles, ss, pos, eraseMarkdown); restyle(first, style, styles, ss, pos, eraseMarkdown);
continue; continue;
} else if (first == '~' && pos + 1 < source.size() && source[pos+1] == '~') { } else if (first == '~' && pos + 1 < source.size() &&
source[pos + 1] == '~') {
pos++; pos++;
if (!eraseMarkdown) if (!eraseMarkdown) emit_md(first, styles, ss);
emit_md(first, styles, ss);
style.strikethrough = !style.strikethrough; style.strikethrough = !style.strikethrough;
restyle(first, style, styles, ss, pos, eraseMarkdown); restyle(first, style, styles, ss, pos, eraseMarkdown);
continue; continue;
@@ -149,6 +165,8 @@ Result<char> markdown::process(std::string_view source, bool eraseMarkdown) {
return process_markdown(source, eraseMarkdown); return process_markdown(source, eraseMarkdown);
} }
Result<wchar_t> markdown::process(std::wstring_view source, bool eraseMarkdown) { Result<wchar_t> markdown::process(
std::wstring_view source, bool eraseMarkdown
) {
return process_markdown(source, eraseMarkdown); return process_markdown(source, eraseMarkdown);
} }