diff --git a/source/utility.cpp b/source/utility.cpp index 9dcff49..e89e248 100644 --- a/source/utility.cpp +++ b/source/utility.cpp @@ -18,3 +18,65 @@ */ #include "utility.hpp" +#include +#include "plugin.hpp" + +// OBS +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4201) +#endif +#include +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +const char* obs_module_recursive_text(const char* to_translate, size_t depth) +{ + static std::unordered_map translate_map; + + if (depth == 0) { + return obs_module_text(to_translate); + } + + std::string key = to_translate; + auto value = translate_map.find(std::string(key)); + if (value != translate_map.end()) { + return value->second.c_str(); + } else { + std::string orig = obs_module_text(to_translate); + std::stringstream out; + + { + size_t seq_start, seq_end = 0; + bool seq_got = false; + + for (size_t pos = 0; pos <= orig.length(); pos++) { + std::string chr = orig.substr(pos, 2); + if (chr == "\\@") { + if (seq_got) { + out << obs_module_recursive_text(orig.substr(seq_start, pos - seq_start).c_str(), (depth - 1)); + seq_end = pos + 2; + } else { + out << orig.substr(seq_end, pos - seq_end); + seq_start = pos + 2; + } + seq_got = !seq_got; + pos += 1; + } + } + if (seq_end != orig.length()) { + out << orig.substr(seq_end, orig.length() - seq_end); + } + + translate_map.insert({key, out.str()}); + } + + auto value = translate_map.find(key); + if (value != translate_map.end()) { + return value->second.c_str(); + } else { + throw std::runtime_error("Insert into map failed."); + } + } +} diff --git a/source/utility.hpp b/source/utility.hpp index d1ac517..289d584 100644 --- a/source/utility.hpp +++ b/source/utility.hpp @@ -19,6 +19,10 @@ #pragma once #include +#include +#include + +const char* obs_module_recursive_text(const char* to_translate, size_t depth = std::numeric_limits::max()); template struct enable_bitmask_operators {