Add basic region highlighter
This commit is contained in:
parent
e348c35b25
commit
8b2f340238
|
@ -418,6 +418,65 @@ HighlighterAndId reference_factory(HighlighterParameters params)
|
||||||
{ DefinedHighlighters::instance().get_group(name, '/')(window, display_buffer); });
|
{ DefinedHighlighters::instance().get_group(name, '/')(window, display_buffer); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct RegionHighlighter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RegionHighlighter(String begin, String end, String ignore_prefix,
|
||||||
|
ColorPair colors)
|
||||||
|
: m_begin(std::move(begin)),
|
||||||
|
m_end(std::move(end)),
|
||||||
|
m_ignore_prefix(std::move(ignore_prefix)),
|
||||||
|
m_colors(colors)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void operator()(const Window& window, DisplayBuffer& display_buffer)
|
||||||
|
{
|
||||||
|
auto& buffer = window.buffer();
|
||||||
|
auto end = buffer.end();
|
||||||
|
auto reg_beg = std::search(buffer.begin(), end,
|
||||||
|
m_begin.begin(), m_begin.end());
|
||||||
|
while (reg_beg != end)
|
||||||
|
{
|
||||||
|
auto reg_end = reg_beg + m_begin.length();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
reg_end = std::search(reg_end, end, m_end.begin(), m_end.end());
|
||||||
|
if (reg_end != end)
|
||||||
|
reg_end += m_end.length();
|
||||||
|
}
|
||||||
|
while (reg_end != end and not m_ignore_prefix.empty() and
|
||||||
|
std::equal(m_ignore_prefix.begin(), m_ignore_prefix.end(),
|
||||||
|
reg_end - m_end.length() - m_ignore_prefix.length()));
|
||||||
|
|
||||||
|
highlight_range(display_buffer, reg_beg.coord(), reg_end.coord(), true,
|
||||||
|
[this](DisplayAtom& atom) { atom.colors = m_colors; });
|
||||||
|
if (reg_end == end)
|
||||||
|
break;
|
||||||
|
reg_beg = std::search(reg_end, end, m_begin.begin(), m_begin.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
String m_begin;
|
||||||
|
String m_end;
|
||||||
|
String m_ignore_prefix;
|
||||||
|
ColorPair m_colors;
|
||||||
|
};
|
||||||
|
|
||||||
|
HighlighterAndId region_factory(HighlighterParameters params)
|
||||||
|
{
|
||||||
|
if (params.size() != 3 and params.size() != 4)
|
||||||
|
throw runtime_error("wrong parameter count");
|
||||||
|
|
||||||
|
const String& begin = params[0];
|
||||||
|
const String& end = params[1];
|
||||||
|
const String& ignore_prefix = params.size() == 4 ? params[2] : "";
|
||||||
|
const ColorPair colors = get_color(params.back());
|
||||||
|
|
||||||
|
return HighlighterAndId("region("+begin+","+end+","+ignore_prefix+")",
|
||||||
|
RegionHighlighter{begin, end, ignore_prefix, colors});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void register_highlighters()
|
void register_highlighters()
|
||||||
{
|
{
|
||||||
HighlighterRegistry& registry = HighlighterRegistry::instance();
|
HighlighterRegistry& registry = HighlighterRegistry::instance();
|
||||||
|
@ -429,6 +488,7 @@ void register_highlighters()
|
||||||
registry.register_func("group", highlighter_group_factory);
|
registry.register_func("group", highlighter_group_factory);
|
||||||
registry.register_func("flag_lines", flag_lines_factory);
|
registry.register_func("flag_lines", flag_lines_factory);
|
||||||
registry.register_func("ref", reference_factory);
|
registry.register_func("ref", reference_factory);
|
||||||
|
registry.register_func("region", region_factory);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user