-
Notifications
You must be signed in to change notification settings - Fork 710
/
highlighter.hh
108 lines (84 loc) · 2.93 KB
/
highlighter.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef highlighter_hh_INCLUDED
#define highlighter_hh_INCLUDED
#include "coord.hh"
#include "completion.hh"
#include "range.hh"
#include "hash_map.hh"
#include "array_view.hh"
#include "string.hh"
#include "utils.hh"
#include "parameters_parser.hh"
#include <memory>
namespace Kakoune
{
class Context;
class DisplayBuffer;
using BufferRange = Range<BufferCoord>;
enum class HighlightPass
{
Wrap = 1 << 0,
Move = 1 << 1,
Colorize = 1 << 2,
All = Wrap | Move | Colorize,
};
constexpr bool with_bit_ops(Meta::Type<HighlightPass>) { return true; }
// A Highlighter is a function which mutates a DisplayBuffer in order to
// change the visual representation of a file. It could be changing text
// color, adding information text (line numbering for example) or replacing
// buffer content (folding for example)
struct Highlighter;
struct DisplaySetup
{
LineCount first_line;
LineCount line_count;
ColumnCount first_column;
ColumnCount widget_columns;
// Position of the cursor in the window
DisplayCoord cursor_pos;
// Offset of line and columns that must remain visible around cursor
DisplayCoord scroll_offset;
bool ensure_cursor_visible;
};
using HighlighterIdList = ConstArrayView<StringView>;
struct HighlightContext
{
const Context& context;
const DisplaySetup& setup;
HighlightPass pass;
HighlighterIdList disabled_ids;
};
struct Highlighter
{
Highlighter(HighlightPass passes) : m_passes{passes} {}
virtual ~Highlighter() = default;
void highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange range);
void compute_display_setup(HighlightContext context, DisplaySetup& setup) const;
virtual bool has_children() const;
virtual Highlighter& get_child(StringView path);
virtual void add_child(String name, std::unique_ptr<Highlighter>&& hl, bool override = false);
virtual void remove_child(StringView id);
virtual Completions complete_child(StringView path, ByteCount cursor_pos, bool group) const;
virtual void fill_unique_ids(Vector<StringView>& unique_ids) const;
HighlightPass passes() const { return m_passes; }
private:
virtual void do_highlight(HighlightContext context, DisplayBuffer& display_buffer, BufferRange range) = 0;
virtual void do_compute_display_setup(HighlightContext context, DisplaySetup& setup) const {}
const HighlightPass m_passes;
};
using HighlighterParameters = ConstArrayView<String>;
using HighlighterFactory = std::unique_ptr<Highlighter> (*)(HighlighterParameters params, Highlighter* parent);
struct HighlighterDesc
{
const char* docstring;
ParameterDesc params;
};
struct HighlighterFactoryAndDescription
{
HighlighterFactory factory;
const HighlighterDesc* description;
};
struct HighlighterRegistry : HashMap<String, HighlighterFactoryAndDescription, MemoryDomain::Highlight>,
Singleton<HighlighterRegistry>
{};
}
#endif // highlighter_hh_INCLUDED