#pragma once #include #include #include #include "Highlight.h" struct Buffer { const std::string &content; int64_t offset = 0; }; class LanguageTree : public std::enable_shared_from_this { public: LanguageTree() = default; void load(const std::string& content); const Pattern* resolvePattern(size_t path); const Grammar* resolveGrammar(size_t path); std::map keys() const { std::map keys; for (const auto& kv : m_languages) { if (kv.second.first.empty()) { continue; } keys.emplace(kv.first, kv.second.first); } return keys; } const Grammar* find(const std::string& key) const { const auto& value = m_languages.find(key); if (value != m_languages.end()) { return m_grammars[value->second.second].get(); } return nullptr; } private: void parseLanguages(Buffer &buffer); void parseGrammars(Buffer &buffer); void parsePatterns(Buffer &buffer); std::map> m_languages; std::vector> m_grammars; std::vector> m_patterns; };