import std/streams import std/strutils import std/unicode import types/cell import utils/strwidth type StreamRenderer* = ref object ansiparser: AnsiCodeParser format: Format af: bool stream: Stream newline: bool w: int j: int # byte in line proc newStreamRenderer*(): StreamRenderer = return StreamRenderer(ansiparser: AnsiCodeParser(state: PARSE_DONE)) proc rewind*(renderer: StreamRenderer) = renderer.format = Format() renderer.ansiparser.state = PARSE_DONE proc addFormat(grid: var FlexibleGrid, renderer: StreamRenderer) = if renderer.af: renderer.af = false if renderer.j == grid[^1].str.len: grid[^1].addFormat(renderer.w, renderer.format) proc processBackspace(grid: var FlexibleGrid, renderer: StreamRenderer, r: Rune): bool = let pj = renderer.j var cr: Rune fastRuneAt(grid[^1].str, renderer.j, cr) if r == Rune('_') or cr == Rune('_') or r == cr: let flag = if r == cr: FLAG_BOLD else: FLAG_UNDERLINE if r != cr and cr == Rune('_'): # original is _, we must replace :( # like less, we assume no double _ for double width characters. grid[^1].str.delete(pj..