build-in-public-bot
Version:
AI-powered CLI bot for automating build-in-public tweets with code screenshots
163 lines • 6.14 kB
JavaScript
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
;