installTableHandlers method

void installTableHandlers()

Implementation

void installTableHandlers() {
  register(["hline"], (_, __, ___) => HLineNode());

  register(["cline"], (cmd, ctx, stream) {
    final arg = ctx.parseArgument() ?? TextNode("\\cline");

    final rangeStr = switch (arg) {
      TextNode() => arg.content,
      GroupNode() => ParseUtils.extractText(arg.childrenNodes),
      _ => "",
    };

    final parts = rangeStr.split("-");
    final startColStr = parts.isNotEmpty ? parts[0].trim() : "";
    final startCol = int.tryParse(startColStr) ?? 1;

    final endColStr = parts.length > 1 ? parts[1].trim() : "";
    final endCol = int.tryParse(endColStr) ?? startCol;

    return CLineNode(startCol, endCol);
  });

  register(["multicolumn"], (cmd, ctx, stream) {
    // First argument: column count
    final numArg = ctx.parseArgument() ?? TextNode("\\multicolumn");
    final numStr = switch (numArg) {
      TextNode() => numArg.content,
      GroupNode() => ParseUtils.extractText(numArg.childrenNodes),
      _ => "1",
    };
    final columnCount = int.tryParse(numStr.trim()) ?? 1;

    // Second argument: alignment
    final alignArg = ctx.parseArgument() ?? TextNode("\\multicolumn");
    final alignment = switch (alignArg) {
      TextNode() => alignArg.content,
      GroupNode() => ParseUtils.extractText(alignArg.childrenNodes),
      _ => "c",
    };

    // Third argument: content
    final contentArg = ctx.parseArgument();
    if (contentArg == null) return TextNode("\\multicolumn");
    final content = contentArg is GroupNode
        ? contentArg.childrenNodes
        : [contentArg];

    return MulticolumnNode(columnCount, alignment, content);
  });
}