1#ifndef TEXTMATELIB_THEME_H
2#define TEXTMATELIB_THEME_H
15class ThemeTrieElement;
19struct IRawThemeSetting {
21 std::vector<std::string>* scope;
22 std::string scopeString;
25 std::string* fontStyle;
26 std::string* foreground;
27 std::string* background;
29 Settings() : fontStyle(nullptr), foreground(nullptr), background(nullptr) {}
37 IRawThemeSetting() : name(nullptr), scope(nullptr) {}
46 std::vector<IRawThemeSetting*> settings;
48 IRawTheme() : name(nullptr) {}
51 for (
auto* setting : settings) {
63 ScopeStack(ScopeStack* parent_,
const ScopeName& scopeName_);
66 static ScopeStack* push(ScopeStack* path,
const std::vector<ScopeName>& scopeNames);
67 static ScopeStack* from(
const std::vector<ScopeName>& segments);
69 ScopeStack* push(
const ScopeName& scopeName);
70 std::vector<ScopeName> getSegments()
const;
71 std::string toString()
const;
72 bool extends(
const ScopeStack* other)
const;
73 std::vector<ScopeName>* getExtensionIfDefined(
const ScopeStack* base)
const;
77class StyleAttributes {
83 StyleAttributes(
int fontStyle_,
int foregroundId_,
int backgroundId_);
87class ParsedThemeRule {
90 std::vector<ScopeName>* parentScopes;
93 std::string* foreground;
94 std::string* background;
97 std::vector<ScopeName>* parentScopes_,
100 const std::string* foreground_,
101 const std::string* background_);
106std::vector<ParsedThemeRule*> parseTheme(
const IRawTheme* source);
109std::string fontStyleToString(
int fontStyle);
116 std::vector<std::string> _id2color;
117 std::map<std::string, int> _color2id;
120 ColorMap(
const std::vector<std::string>* colorMap =
nullptr);
122 int getId(
const std::string* color);
123 std::vector<std::string> getColorMap()
const;
127class ThemeTrieElementRule {
130 std::vector<ScopeName> parentScopes;
135 ThemeTrieElementRule(
int scopeDepth_,
136 const std::vector<ScopeName>* parentScopes_,
141 ThemeTrieElementRule* clone()
const;
142 static std::vector<ThemeTrieElementRule*> cloneArr(
const std::vector<ThemeTrieElementRule*>& arr);
144 void acceptOverwrite(
int scopeDepth_,
int fontStyle_,
int foreground_,
int background_);
148class ThemeTrieElement {
150 ThemeTrieElementRule* _mainRule;
151 std::vector<ThemeTrieElementRule*> _rulesWithParentScopes;
152 std::map<std::string, ThemeTrieElement*> _children;
155 ThemeTrieElement(ThemeTrieElementRule* mainRule,
156 const std::vector<ThemeTrieElementRule*>& rulesWithParentScopes = std::vector<ThemeTrieElementRule*>());
159 std::vector<ThemeTrieElementRule*> match(
const ScopeName& scope);
161 void insert(
int scopeDepth,
162 const std::string& scope,
163 const std::vector<ScopeName>* parentScopes,
173 StyleAttributes* _defaults;
174 ThemeTrieElement* _root;
175 CachedFn<ScopeName, std::vector<ThemeTrieElementRule*>>* _cachedMatchRoot;
178 Theme(ColorMap* colorMap, StyleAttributes* defaults, ThemeTrieElement* root);
181 static Theme* createFromRawTheme(
const IRawTheme* source,
const std::vector<std::string>* colorMap =
nullptr);
182 static Theme* createFromParsedTheme(
const std::vector<ParsedThemeRule*>& source,
const std::vector<std::string>* colorMap =
nullptr);
184 std::vector<std::string> getColorMap()
const;
185 StyleAttributes* getDefaults()
const;
186 StyleAttributes* match(ScopeStack* scopePath);
191bool _scopePathMatchesParentScopes(ScopeStack* scopePath,
const std::vector<ScopeName>& parentScopes);
194Theme* resolveParsedThemeRules(std::vector<ParsedThemeRule*>& parsedThemeRules,
195 const std::vector<std::string>* colorMap);
212 StyleAttributes* defaults;
215 : theme(theme_), defaults(defaults_) {}
Helper class to manage theme resources and provide C API implementation.
std::string ScopeName
Semantic name identifying a scope (e.g., "source.javascript", "comment.line")
Core type definitions and interfaces for TextMateLib.