From 03eb128536acb3d870b7010ae3cad3d2b707cf72 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Wed, 7 Dec 2016 20:07:32 +0000 Subject: [PATCH] Ensure content of expanded strings in modelinefmt is not interpreted as markup --- src/client.cc | 3 ++- src/command_manager.cc | 25 +++++++++++++++++++++---- src/command_manager.hh | 4 ++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/client.cc b/src/client.cc index af5ae20f..c2904199 100644 --- a/src/client.cc +++ b/src/client.cc @@ -116,7 +116,8 @@ DisplayLine Client::generate_mode_line() const { const String& modelinefmt = context().options()["modelinefmt"].get(); - modeline = parse_display_line(expand(modelinefmt, context())); + modeline = parse_display_line(expand(modelinefmt, context(), ShellContext{}, + [](String s) { return escape(s, '{', '\\'); })); } catch (runtime_error& err) { diff --git a/src/command_manager.cc b/src/command_manager.cc index 0738915c..d5307032 100644 --- a/src/command_manager.cc +++ b/src/command_manager.cc @@ -348,8 +348,10 @@ TokenList parse(StringView line) return result; } -String expand(StringView str, const Context& context, - const ShellContext& shell_context) +template +String expand_impl(StringView str, const Context& context, + const ShellContext& shell_context, + Postprocess postprocess) { Reader reader{str}; String res; @@ -370,8 +372,8 @@ String expand(StringView str, const Context& context, else if (c == '%') { res += reader.substr_from(beg); - Token token = parse_percent_token(reader); - res += expand_token(token, context, shell_context); + res += postprocess(expand_token(parse_percent_token(reader), + context, shell_context)); beg = (++reader).pos; } else @@ -381,6 +383,21 @@ String expand(StringView str, const Context& context, return res; } +String expand(StringView str, const Context& context, + const ShellContext& shell_context) +{ + return expand_impl(str, context, shell_context, + [](String s) { return std::move(s); }); +} + +String expand(StringView str, const Context& context, + const ShellContext& shell_context, + std::function postprocess) +{ + return expand_impl(str, context, shell_context, + [&](String s) { return postprocess(std::move(s)); }); +} + struct command_not_found : runtime_error { command_not_found(StringView command) diff --git a/src/command_manager.hh b/src/command_manager.hh index 563d5431..4a326613 100644 --- a/src/command_manager.hh +++ b/src/command_manager.hh @@ -133,6 +133,10 @@ private: String expand(StringView str, const Context& context, const ShellContext& shell_context = ShellContext{}); +String expand(StringView str, const Context& context, + const ShellContext& shell_context, + std::function postprocess); + } #endif // command_manager_hh_INCLUDED