parse static method

TerminalRenderFrame parse(
  1. String content
)

Parses rendered content into an ANSI-aware frame model.

Implementation

static TerminalRenderFrame parse(String content) {
  if (content.isEmpty) {
    return const TerminalRenderFrame(<TerminalRenderLine>[
      TerminalRenderLine(raw: '', statePrefix: ''),
    ]);
  }

  final lines = <TerminalRenderLine>[];
  final lineBuffer = StringBuffer();
  final styleState = uv_styled.StyleState(const UvStyle());
  final linkState = uv_styled.LinkState(const Link());

  UvStyle lineStartStyle = styleState.style;
  Link lineStartLink = linkState.link;

  void flushLine() {
    lines.add(
      TerminalRenderLine(
        raw: lineBuffer.toString(),
        statePrefix: _lineStatePrefix(lineStartStyle, lineStartLink),
      ),
    );
    lineBuffer.clear();
    lineStartStyle = styleState.style;
    lineStartLink = linkState.link;
  }

  var i = 0;
  while (i < content.length) {
    final code = content.codeUnitAt(i);

    if (code == 0x0A) {
      flushLine();
      i++;
      continue;
    }

    if (code == 0x1B) {
      final next = Ansi.consumeEscapeSequence(content, i);
      final sequence = content.substring(i, next);
      lineBuffer.write(sequence);
      _applyAnsiState(sequence, styleState, linkState);
      i = next;
      continue;
    }

    lineBuffer.writeCharCode(code);
    i++;
  }

  flushLine();
  return TerminalRenderFrame(List<TerminalRenderLine>.unmodifiable(lines));
}