diff --git a/doc/en/scripting/builtins/libutf8.md b/doc/en/scripting/builtins/libutf8.md index e7801f97..db8b31c5 100644 --- a/doc/en/scripting/builtins/libutf8.md +++ b/doc/en/scripting/builtins/libutf8.md @@ -18,4 +18,10 @@ utf8.codepoint(chars: str) -> int -- Returns a substring from position startchar to endchar inclusive utf8.sub(text: str, startchar: int, [optional] endchar: int) -> str + +-- Converts a string to uppercase +utf8.upper(text: str) -> str + +-- Converts a string to lowercase +utf8.lower(text: str) -> str ``` diff --git a/doc/ru/scripting/builtins/libutf8.md b/doc/ru/scripting/builtins/libutf8.md index b29bb403..50d64e72 100644 --- a/doc/ru/scripting/builtins/libutf8.md +++ b/doc/ru/scripting/builtins/libutf8.md @@ -18,4 +18,10 @@ utf8.codepoint(chars: str) -> int -- Возвращает подстроку от позиции startchar до endchar включительно utf8.sub(text: str, startchar: int, [опционально] endchar: int) -> str + +-- Переводит строку в вверхний регистр +utf8.upper(text: str) -> str + +-- Переводит строку в нижний регистр +utf8.lower(text: str) -> str ``` diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index e38a39ef..9a955fff 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -159,6 +159,9 @@ function string.trim_left(s, char) return string.match(s, "^" .. char .. "*(.+)$") or s end +string.lower = utf8.lower +string.upper = utf8.upper + local meta = getmetatable("") function meta:__index(key) diff --git a/src/logic/scripting/lua/libs/libutf8.cpp b/src/logic/scripting/lua/libs/libutf8.cpp index 182f6295..3512624f 100644 --- a/src/logic/scripting/lua/libs/libutf8.cpp +++ b/src/logic/scripting/lua/libs/libutf8.cpp @@ -1,6 +1,7 @@ #include "api_lua.hpp" #include +#include #include "../lua_custom_types.hpp" #include "util/stringutil.hpp" @@ -63,11 +64,29 @@ static int l_sub(lua::State* L) { return lua::pushstring(L, util::u32str2str_utf8(string.substr(start, end))); } +static int l_upper(lua::State* L) { + auto string = util::str2u32str_utf8(lua::require_string(L, 1)); + for (auto& c : string) { + c = std::towupper(c); + } + return lua::pushstring(L, util::u32str2str_utf8(string)); +} + +static int l_lower(lua::State* L) { + auto string = util::str2u32str_utf8(lua::require_string(L, 1)); + for (auto& c : string) { + c = std::towlower(c); + } + return lua::pushstring(L, util::u32str2str_utf8(string)); +} + const luaL_Reg utf8lib[] = { {"tobytes", lua::wrap}, {"tostring", lua::wrap}, {"length", lua::wrap}, {"codepoint", lua::wrap}, {"sub", lua::wrap}, + {"upper", lua::wrap}, + {"lower", lua::wrap}, {NULL, NULL} };