// LanguageHighlighter.h - interface for line-based highlighters #pragma once #include #include #include #include "../Highlight.h" class Buffer; namespace kte { class LanguageHighlighter { public: virtual ~LanguageHighlighter() = default; // Produce highlight spans for a given buffer row. Implementations should append to out. virtual void HighlightLine(const Buffer &buf, int row, std::vector &out) const = 0; virtual bool Stateful() const { return false; } }; // Optional extension for stateful highlighters (e.g., multi-line comments/strings). // Engines may detect and use this via dynamic_cast without breaking stateless impls. class StatefulHighlighter : public LanguageHighlighter { public: struct LineState { bool in_block_comment{false}; bool in_raw_string{false}; // For raw strings, remember the delimiter between the opening R"delim( and closing )delim" std::string raw_delim; }; // Highlight one line given the previous line state; return the resulting state after this line. // Implementations should append spans for this line to out and compute the next state. virtual LineState HighlightLineStateful(const Buffer &buf, int row, const LineState &prev, std::vector &out) const = 0; bool Stateful() const override { return true; } }; } // namespace kte