UNPKG

@jawis/stdio-filter

Version:
148 lines (147 loc) 6.17 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeAnsiParser = void 0; const node_ansiparser_1 = __importDefault(require("node-ansiparser")); const _jab_1 = require("^jab"); /** * */ const makeAnsiParser = (callbacks) => { const rawCallbacks = { inst_p: (str) => { (0, _jab_1.assert)((0, _jab_1.isString)(str)); callbacks.onPrint(str); }, inst_x: function (flag) { // C0 or C1 control codes: https://en.wikipedia.org/wiki/C0_and_C1_control_codes (0, _jab_1.assert)((0, _jab_1.isString)(flag)); (0, _jab_1.assert)(flag.length === 1); // eslint-disable-next-line no-control-regex (0, _jab_1.assert)(flag.match(/^[\x00-\x1F\x80-\x9F]$/) !== null); switch (flag) { case "\x00": case "\t": callbacks.onPrint(flag); break; case "\r": callbacks.onAction2("erase-to-beginning"); break; case "\n": callbacks.onAction("down-beginning", 1); break; default: console.log("unknown control code", flag.charCodeAt(0)); break; } }, /** * * * @see https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_(Control_Sequence_Introducer)_sequences * * todo * - it seems the defaults are not quite right. */ inst_c: function (collected, params, flag) { (0, _jab_1.assert)(collected === "" || collected === "=" || collected === "?", "unknown", { collected }); // prettier-ignore switch (flag) { case "A": (0, _jab_1.assert)(params.length === 1); (0, _jab_1.assert)((0, _jab_1.isInt)(params[0])); callbacks.onAction("up", params[0] === 0 ? 1 : params[0]); break; case "B": (0, _jab_1.assert)(params.length === 1); (0, _jab_1.assert)((0, _jab_1.isInt)(params[0])); callbacks.onAction("down", params[0] === 0 ? 1 : params[0]); break; case "C": (0, _jab_1.assert)(params.length === 1); (0, _jab_1.assert)((0, _jab_1.isInt)(params[0])); callbacks.onAction("right", params[0] === 0 ? 1 : params[0]); break; case "D": (0, _jab_1.assert)(params.length === 1); (0, _jab_1.assert)((0, _jab_1.isInt)(params[0])); callbacks.onAction("left", params[0] === 0 ? 1 : params[0]); break; case "E": (0, _jab_1.assert)(params.length === 1); (0, _jab_1.assert)((0, _jab_1.isInt)(params[0])); callbacks.onAction("down-beginning", params[0] === 0 ? 1 : params[0]); break; case "F": (0, _jab_1.assert)(params.length === 1); (0, _jab_1.assert)((0, _jab_1.isInt)(params[0])); callbacks.onAction("up-beginning", params[0] === 0 ? 1 : params[0]); break; case "G": //default is 1. Zero from parser is not valid. (0, _jab_1.assert)(params.length === 1); (0, _jab_1.assert)((0, _jab_1.isInt)(params[0])); callbacks.setPosition(params[0] === 0 ? 1 : params[0]); break; case "H": { (0, _jab_1.assert)(params.length === 1 || params.length === 2); const x = params[0] || 1; //turns both zero and undefined into default: 1 const y = params[1] || 1; (0, _jab_1.assert)((0, _jab_1.isInt)(x)); (0, _jab_1.assert)((0, _jab_1.isInt)(y)); callbacks.setPosition(x, y); break; } case "J": throw new Error("clear display not supported"); case "K": //works (0, _jab_1.assert)(params.length === 1); switch (params[0]) { case 0: console.log("erase-to-end"); break; case 1: console.log("erase-to-beginning"); break; case 2: console.log("erase-line"); break; default: throw new Error("unknown param"); } break; case "m": { //params vary const p = params.join(";"); console.log("\x1b[" + p + "m"); break; } case "S": case "T": throw new Error("scroll not supported"); default: console.log("unknown csi", collected, params, flag); break; } }, inst_o: function (s) { console.log("unkonwn osc", s); }, inst_e: function (collected, flag) { console.log("unknown esc", collected, flag); }, inst_H: function (collected, params, flag) { console.log("dcs-Hook", collected, params, flag); }, inst_P: function (dcs) { console.log("dcs-Put", dcs); }, inst_U: function () { console.log("dcs-Unhook"); }, }; return new node_ansiparser_1.default(rawCallbacks); }; exports.makeAnsiParser = makeAnsiParser;