Do not allow / in highlighter names as it is used for hierachies

/ are replaced with <slash> in the highlighter names.
Fixes #553
This commit is contained in:
Maxime Coste 2016-02-13 12:59:27 +00:00
parent 318f1ae781
commit 8bd3395d4d
3 changed files with 22 additions and 0 deletions

View File

@ -14,6 +14,8 @@ void HighlighterGroup::highlight(const Context& context, HighlightFlags flags,
void HighlighterGroup::add_child(HighlighterAndId&& hl) void HighlighterGroup::add_child(HighlighterAndId&& hl)
{ {
hl.first = replace(hl.first, "/", "<slash>");
if (m_highlighters.contains(hl.first)) if (m_highlighters.contains(hl.first))
throw runtime_error(format("duplicate id: '{}'", hl.first)); throw runtime_error(format("duplicate id: '{}'", hl.first));

View File

@ -241,6 +241,22 @@ String indent(StringView str, StringView indent)
return res; return res;
} }
String replace(StringView str, StringView substr, StringView replacement)
{
String res;
for (auto it = str.begin(); it != str.end(); )
{
auto match = std::search(it, str.end(), substr.begin(), substr.end());
res += StringView{it, match};
if (match == str.end())
break;
res += replacement;
it = match + (int)substr.length();
}
return res;
}
Optional<int> str_to_int_ifp(StringView str) Optional<int> str_to_int_ifp(StringView str)
{ {
unsigned int res = 0; unsigned int res = 0;
@ -503,6 +519,8 @@ UnitTest test_string{[]()
kak_assert(str_to_int(to_string(INT_MIN)) == INT_MIN); kak_assert(str_to_int(to_string(INT_MIN)) == INT_MIN);
kak_assert(str_to_int("00") == 0); kak_assert(str_to_int("00") == 0);
kak_assert(str_to_int("-0") == 0); kak_assert(str_to_int("-0") == 0);
kak_assert(replace("tchou/tcha/tchi", "/", "!!") == "tchou!!tcha!!tchi");
}}; }};
} }

View File

@ -280,6 +280,8 @@ String unescape(StringView str, StringView characters, char escape);
String indent(StringView str, StringView indent = " "); String indent(StringView str, StringView indent = " ");
String replace(StringView str, StringView substr, StringView replacement);
template<typename Container> template<typename Container>
String join(const Container& container, char joiner, bool esc_joiner = true) String join(const Container& container, char joiner, bool esc_joiner = true)
{ {