render method

void render(
  1. Iterable<TreeSitterHighlightEvent> highlighter,
  2. List<int> source,
  3. TreeSitterHighlightAttributeCallback attributeCallback
)

Appends a stream of native Tree-sitter highlight events to html.

source and event ranges use UTF-8 byte offsets. The callback writes the attributes between <span and >, exactly like upstream.

Implementation

void render(
  Iterable<TreeSitterHighlightEvent> highlighter,
  List<int> source,
  TreeSitterHighlightAttributeCallback attributeCallback,
) {
  final highlights = <TreeSitterHighlight>[];
  for (final event in highlighter) {
    switch (event) {
      case TreeSitterHighlightStart(:final highlight):
        highlights.add(highlight);
        _startHighlight(highlight, attributeCallback);
      case TreeSitterHighlightEnd():
        if (highlights.isNotEmpty) highlights.removeLast();
        _endHighlight();
      case TreeSitterHighlightSource(:final start, :final end):
        RangeError.checkValidRange(start, end, source.length, 'event');
        _addText(source.sublist(start, end), highlights, attributeCallback);
    }
  }
  if (_lastCarriageReturn case final offset?) {
    _lastCarriageReturn = null;
    _addCarriageReturn(offset, attributeCallback);
  }
  if (html.isEmpty || html.last != 0x0a) html.add(0x0a);
  if (lineOffsets.isNotEmpty && lineOffsets.last == html.length) {
    lineOffsets.removeLast();
  }
}