From 467b4ad0437125d99cf3af6ad65a03470dda8772 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 6 Dec 2024 20:25:21 +0300 Subject: [PATCH] add gui.escape_markup --- doc/en/scripting/builtins/libgui.md | 11 +++++++++++ doc/ru/scripting/builtins/libgui.md | 11 +++++++++++ src/graphics/ui/markdown.cpp | 3 +-- src/graphics/ui/markdown.hpp | 21 +++++++++++++++++++++ src/logic/scripting/lua/libs/libgui.cpp | 13 ++++++++++++- 5 files changed, 56 insertions(+), 3 deletions(-) diff --git a/doc/en/scripting/builtins/libgui.md b/doc/en/scripting/builtins/libgui.md index eaaa589c..3132bce3 100644 --- a/doc/en/scripting/builtins/libgui.md +++ b/doc/en/scripting/builtins/libgui.md @@ -50,3 +50,14 @@ gui.clear_markup( ``` Removes markup from text. + +```lua +gui.escape_markup( + -- markup language ("md" - Markdown) + language: str, + -- text with markup + text: str +) -> str +``` + +Escapes markup in text. diff --git a/doc/ru/scripting/builtins/libgui.md b/doc/ru/scripting/builtins/libgui.md index b613bd23..11dfde03 100644 --- a/doc/ru/scripting/builtins/libgui.md +++ b/doc/ru/scripting/builtins/libgui.md @@ -47,3 +47,14 @@ gui.clear_markup( ``` Удаляет разметку из текста. + +```lua +gui.escape_markup( + -- язык разметки ("md" - Markdown) + language: str, + -- текст с разметкой + text: str +) -> str +``` + +Экранирует разметку в тексте. diff --git a/src/graphics/ui/markdown.cpp b/src/graphics/ui/markdown.cpp index c96a851f..ab328e66 100644 --- a/src/graphics/ui/markdown.cpp +++ b/src/graphics/ui/markdown.cpp @@ -1,7 +1,5 @@ #include "markdown.hpp" -#include - #include "graphics/core/Font.hpp" using namespace markdown; @@ -66,6 +64,7 @@ Result process_markdown( pos++; continue; } + pos--; } } else if (first == '*') { if (pos + 1 < source.size() && source[pos+1] == '*') { diff --git a/src/graphics/ui/markdown.hpp b/src/graphics/ui/markdown.hpp index 625dbe84..0f089d58 100644 --- a/src/graphics/ui/markdown.hpp +++ b/src/graphics/ui/markdown.hpp @@ -2,6 +2,7 @@ #include #include +#include struct FontStylesScheme; @@ -19,4 +20,24 @@ namespace markdown { Result process(std::string_view source, bool eraseMarkdown); Result process(std::wstring_view source, bool eraseMarkdown); + + template + inline std::basic_string escape(std::string_view source) { + std::basic_stringstream ss; + int pos = 0; + while (pos < source.size()) { + CharT first = source[pos]; + if (first == '\\' && pos + 1 < source.size()) { + CharT second = source[++pos]; + ss << first << second; + pos++; + continue; + } else if (first == '*' || first == '~' || first == '_') { + ss << '\\'; + } + ss << first; + pos++; + } + return ss.str(); + } } diff --git a/src/logic/scripting/lua/libs/libgui.cpp b/src/logic/scripting/lua/libs/libgui.cpp index ade19062..2a485be7 100644 --- a/src/logic/scripting/lua/libs/libgui.cpp +++ b/src/logic/scripting/lua/libs/libgui.cpp @@ -738,6 +738,15 @@ static int l_gui_clear_markup(lua::State* L) { return lua::pushstring(L, text); } +static int l_gui_escape_markup(lua::State* L) { + auto lang = lua::require_string(L, 1); + std::string text = lua::require_string(L, 2); + if (std::strcmp(lang, "md") == 0) { + text = std::move(markdown::escape(text)); + } + return lua::pushstring(L, text); +} + const luaL_Reg guilib[] = { {"get_viewport", lua::wrap}, {"getattr", lua::wrap}, @@ -746,5 +755,7 @@ const luaL_Reg guilib[] = { {"str", lua::wrap}, {"get_locales_info", lua::wrap}, {"clear_markup", lua::wrap}, + {"escape_markup", lua::wrap}, {"__reindex", lua::wrap}, - {NULL, NULL}}; + {NULL, NULL} +};