UNPKG

build-in-public-bot

Version:

AI-powered CLI bot for automating build-in-public tweets with code screenshots

163 lines 6.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ANSIParser = void 0; class ANSIParser { colorMap = new Map([ [30, '#000000'], [31, '#cd3131'], [32, '#0dbc79'], [33, '#e5e510'], [34, '#2472c8'], [35, '#bc3fbc'], [36, '#11a8cd'], [37, '#e5e5e5'], [90, '#666666'], [91, '#f14c4c'], [92, '#23d18b'], [93, '#f5f543'], [94, '#3b8eea'], [95, '#d670d6'], [96, '#29b8db'], [97, '#e5e5e5'], [40, '#000000'], [41, '#cd3131'], [42, '#0dbc79'], [43, '#e5e510'], [44, '#2472c8'], [45, '#bc3fbc'], [46, '#11a8cd'], [47, '#e5e5e5'], [100, '#666666'], [101, '#f14c4c'], [102, '#23d18b'], [103, '#f5f543'], [104, '#3b8eea'], [105, '#d670d6'], [106, '#29b8db'], [107, '#e5e5e5'] ]); parse(input) { const lines = input.split('\n'); return lines.map(line => this.parseLine(line)); } parseLine(line) { const segments = []; let currentStyle = {}; let currentText = ''; let i = 0; while (i < line.length) { if (line[i] === '\x1b' && line[i + 1] === '[') { if (currentText) { segments.push({ text: currentText, style: { ...currentStyle } }); currentText = ''; } const result = this.parseEscapeSequence(line, i); currentStyle = this.applyStyleCodes(currentStyle, result.codes); i = result.endIndex; } else { currentText += line[i]; i++; } } if (currentText) { segments.push({ text: currentText, style: { ...currentStyle } }); } const plainText = segments.map(s => s.text).join(''); return { segments, plainText }; } parseEscapeSequence(text, start) { let i = start + 2; let codeStr = ''; while (i < text.length) { const char = text[i]; if (char >= '0' && char <= '9') { codeStr += char; } else if (char === ';') { codeStr += ';'; } else if (char === 'm') { const codes = codeStr ? codeStr.split(';').map(Number) : [0]; return { codes, endIndex: i + 1 }; } else { return { codes: [], endIndex: i + 1 }; } i++; } return { codes: [], endIndex: text.length }; } applyStyleCodes(style, codes) { const newStyle = { ...style }; for (let i = 0; i < codes.length; i++) { const code = codes[i]; switch (code) { case 0: return {}; case 1: newStyle.bold = true; break; case 2: newStyle.dim = true; break; case 3: newStyle.italic = true; break; case 4: newStyle.underline = true; break; case 7: newStyle.inverse = true; break; case 9: newStyle.strikethrough = true; break; case 22: newStyle.bold = false; newStyle.dim = false; break; case 23: newStyle.italic = false; break; case 24: newStyle.underline = false; break; case 27: newStyle.inverse = false; break; case 29: newStyle.strikethrough = false; break; case 39: delete newStyle.foreground; break; case 49: delete newStyle.background; break; default: if (code >= 30 && code <= 37 || code >= 90 && code <= 97) { newStyle.foreground = this.colorMap.get(code) || '#ffffff'; } else if (code >= 40 && code <= 47 || code >= 100 && code <= 107) { newStyle.background = this.colorMap.get(code) || '#000000'; } else if (code === 38 && codes[i + 1] === 5) { newStyle.foreground = this.get256Color(codes[i + 2]); i += 2; } else if (code === 48 && codes[i + 1] === 5) { newStyle.background = this.get256Color(codes[i + 2]); i += 2; } else if (code === 38 && codes[i + 1] === 2) { newStyle.foreground = `rgb(${codes[i + 2]}, ${codes[i + 3]}, ${codes[i + 4]})`; i += 4; } else if (code === 48 && codes[i + 1] === 2) { newStyle.background = `rgb(${codes[i + 2]}, ${codes[i + 3]}, ${codes[i + 4]})`; i += 4; } } } return newStyle; } get256Color(code) { if (code < 16) { return this.colorMap.get(code < 8 ? code + 30 : code - 8 + 90) || '#ffffff'; } if (code < 232) { const n = code - 16; const r = Math.floor(n / 36); const g = Math.floor((n % 36) / 6); const b = n % 6; return `#${this.toHex(r * 51)}${this.toHex(g * 51)}${this.toHex(b * 51)}`; } const gray = 8 + (code - 232) * 10; return `#${this.toHex(gray)}${this.toHex(gray)}${this.toHex(gray)}`; } toHex(n) { return n.toString(16).padStart(2, '0'); } stripANSI(text) { return text.replace(/\x1b\[[0-9;]*m/g, ''); } } exports.ANSIParser = ANSIParser; //# sourceMappingURL=ansi-parser.js.map