TextMateLib 1.0
Modern C++ implementation of the TextMate syntax highlighting engine
Loading...
Searching...
No Matches
registry.h
1#ifndef TEXTMATELIB_REGISTRY_H
2#define TEXTMATELIB_REGISTRY_H
3
4#include "types.h"
5#include "theme.h"
6#include "rawGrammar.h"
7#include "onigLib.h"
8#include <string>
9#include <map>
10#include <memory>
11#include <functional>
12
13namespace tml {
14
15// Forward declarations
16class Grammar;
17class BalancedBracketSelectors;
18
19// IGrammarRepository interface
20class IGrammarRepository {
21public:
22 virtual ~IGrammarRepository() {}
23 virtual IRawGrammar* lookup(const ScopeName& scopeName) = 0;
24 virtual std::vector<ScopeName> injections(const ScopeName& scopeName) = 0;
25};
26
27// IThemeProvider interface
28class IThemeProvider {
29public:
30 virtual ~IThemeProvider() {}
31 virtual StyleAttributes* themeMatch(ScopeStack* scopePath) = 0;
32 virtual StyleAttributes* getDefaults() = 0;
33};
34
35// SyncRegistry class
36class SyncRegistry : public IGrammarRepository, public IThemeProvider {
37private:
38 std::map<ScopeName, Grammar*> _grammars;
39 std::map<ScopeName, IRawGrammar*> _rawGrammars;
40 std::map<ScopeName, std::vector<ScopeName>> _injectionGrammars;
41 Theme* _theme;
42 IOnigLib* _onigLib;
43
44public:
45 SyncRegistry(Theme* theme, IOnigLib* onigLib);
46 ~SyncRegistry();
47
48 void dispose();
49 void setTheme(Theme* theme);
50 std::vector<std::string> getColorMap();
51
52 // Add grammar to registry
53 void addGrammar(IRawGrammar* grammar, const std::vector<ScopeName>* injectionScopeNames = nullptr);
54
55 // IGrammarRepository implementation
56 IRawGrammar* lookup(const ScopeName& scopeName) override;
57 std::vector<ScopeName> injections(const ScopeName& scopeName) override;
58
59 // IThemeProvider implementation
60 StyleAttributes* themeMatch(ScopeStack* scopePath) override;
61 StyleAttributes* getDefaults() override;
62
63 // Get grammar for scope name
64 Grammar* grammarForScopeName(
65 const ScopeName& scopeName,
66 int initialLanguage,
67 const EmbeddedLanguagesMap* embeddedLanguages,
68 const TokenTypeMap* tokenTypes,
69 BalancedBracketSelectors* balancedBracketSelectors
70 );
71};
72
73// RegistryOptions structure
74struct RegistryOptions {
75 IOnigLib* onigLib;
76 IRawTheme* theme;
77 std::vector<std::string>* colorMap;
78 std::function<IRawGrammar*(const ScopeName&)> loadGrammar;
79 std::function<std::vector<ScopeName>(const ScopeName&)> getInjections;
80
81 RegistryOptions()
82 : onigLib(nullptr), theme(nullptr), colorMap(nullptr) {}
83};
84
85// IGrammarConfiguration structure
86struct IGrammarConfiguration {
87 EmbeddedLanguagesMap* embeddedLanguages;
88 TokenTypeMap* tokenTypes;
89 std::vector<std::string>* balancedBracketSelectors;
90 std::vector<std::string>* unbalancedBracketSelectors;
91
92 IGrammarConfiguration()
93 : embeddedLanguages(nullptr), tokenTypes(nullptr),
94 balancedBracketSelectors(nullptr), unbalancedBracketSelectors(nullptr) {}
95};
96
97// Registry class
98class Registry {
99private:
100 RegistryOptions _options;
101 SyncRegistry* _syncRegistry;
102 std::map<std::string, bool> _ensureGrammarCache;
103
104public:
105 explicit Registry(const RegistryOptions& options);
106 ~Registry();
107
108 void dispose();
109
110 // Change the theme
111 void setTheme(const IRawTheme* theme, const std::vector<std::string>* colorMap = nullptr);
112
113 // Get color map
114 std::vector<std::string> getColorMap();
115
116 // Load grammar with embedded languages
117 Grammar* loadGrammarWithEmbeddedLanguages(
118 const ScopeName& initialScopeName,
119 int initialLanguage,
120 const EmbeddedLanguagesMap& embeddedLanguages
121 );
122
123 // Load grammar with configuration
124 Grammar* loadGrammarWithConfiguration(
125 const ScopeName& initialScopeName,
126 int initialLanguage,
127 const IGrammarConfiguration& configuration
128 );
129
130 // Load grammar
131 Grammar* loadGrammar(const ScopeName& initialScopeName);
132
133 // Add grammar
134 Grammar* addGrammar(
135 IRawGrammar* rawGrammar,
136 const std::vector<std::string>& injections = std::vector<std::string>(),
137 int initialLanguage = 0,
138 const EmbeddedLanguagesMap* embeddedLanguages = nullptr
139 );
140
141private:
142 Grammar* _loadGrammar(
143 const ScopeName& initialScopeName,
144 int initialLanguage,
145 const EmbeddedLanguagesMap* embeddedLanguages,
146 const TokenTypeMap* tokenTypes,
147 BalancedBracketSelectors* balancedBracketSelectors
148 );
149
150 void _loadSingleGrammar(const ScopeName& scopeName);
151 void _doLoadSingleGrammar(const ScopeName& scopeName);
152
153 Grammar* _grammarForScopeName(
154 const ScopeName& scopeName,
155 int initialLanguage = 0,
156 const EmbeddedLanguagesMap* embeddedLanguages = nullptr,
157 const TokenTypeMap* tokenTypes = nullptr,
158 BalancedBracketSelectors* balancedBracketSelectors = nullptr
159 );
160};
161
162} // namespace tml
163
164#endif // TEXTMATELIB_REGISTRY_H
std::string ScopeName
Semantic name identifying a scope (e.g., "source.javascript", "comment.line")
Definition types.h:20
std::map< std::string, int > EmbeddedLanguagesMap
Map from embedded language name to token type ID.
Definition types.h:175
std::map< std::string, StandardTokenType > TokenTypeMap
Map from scope pattern to standard token type.
Definition types.h:179
Core type definitions and interfaces for TextMateLib.