@taml/encoder
Version:
Convert ANSI escape sequences to TAML (Terminal ANSI Markup Language) tags
183 lines • 13.4 kB
JavaScript
// RGB values for the 16 standard colors
const STANDARD_COLORS = {
black: { r: 0, g: 0, b: 0 },
red: { r: 128, g: 0, b: 0 },
green: { r: 0, g: 128, b: 0 },
yellow: { r: 128, g: 128, b: 0 },
blue: { r: 0, g: 0, b: 128 },
magenta: { r: 128, g: 0, b: 128 },
cyan: { r: 0, g: 128, b: 128 },
white: { r: 192, g: 192, b: 192 },
brightBlack: { r: 128, g: 128, b: 128 },
brightRed: { r: 255, g: 0, b: 0 },
brightGreen: { r: 0, g: 255, b: 0 },
brightYellow: { r: 255, g: 255, b: 0 },
brightBlue: { r: 0, g: 0, b: 255 },
brightMagenta: { r: 255, g: 0, b: 255 },
brightCyan: { r: 0, g: 255, b: 255 },
brightWhite: { r: 255, g: 255, b: 255 },
};
/**
* Convert a 256-color index to RGB values
*/
function convert256ToRGB(colorIndex) {
if (colorIndex < 0 || colorIndex > 255) {
throw new Error(`Invalid color index: ${colorIndex}. Must be between 0-255.`);
}
// Standard colors (0-15)
if (colorIndex < 16) {
const standardColorNames = [
"black",
"red",
"green",
"yellow",
"blue",
"magenta",
"cyan",
"white",
"brightBlack",
"brightRed",
"brightGreen",
"brightYellow",
"brightBlue",
"brightMagenta",
"brightCyan",
"brightWhite",
];
const colorName = standardColorNames[colorIndex];
if (!colorName) {
throw new Error(`Invalid standard color index: ${colorIndex}`);
}
return STANDARD_COLORS[colorName];
}
// 216-color cube (16-231)
if (colorIndex >= 16 && colorIndex <= 231) {
const index = colorIndex - 16;
const r = Math.floor(index / 36);
const g = Math.floor((index % 36) / 6);
const b = index % 6;
const toRGB = (value) => (value === 0 ? 0 : 55 + value * 40);
return {
r: toRGB(r),
g: toRGB(g),
b: toRGB(b),
};
}
// Grayscale colors (232-255)
if (colorIndex >= 232 && colorIndex <= 255) {
const gray = 8 + (colorIndex - 232) * 10;
return { r: gray, g: gray, b: gray };
}
throw new Error(`Unexpected color index: ${colorIndex}`);
}
/**
* Calculate Euclidean distance between two RGB colors
*/
function calculateColorDistance(color1, color2) {
const rDiff = color1.r - color2.r;
const gDiff = color1.g - color2.g;
const bDiff = color1.b - color2.b;
return Math.sqrt(rDiff * rDiff + gDiff * gDiff + bDiff * bDiff);
}
/**
* Find the nearest standard color to the given RGB values
*/
function findNearestStandardColor(rgb) {
let nearestColor = "white";
let minDistance = Number.POSITIVE_INFINITY;
for (const [colorName, colorRGB] of Object.entries(STANDARD_COLORS)) {
const distance = calculateColorDistance(rgb, colorRGB);
if (distance < minDistance) {
minDistance = distance;
nearestColor = colorName;
}
}
return nearestColor;
}
/**
* Convert a 256-color index to the nearest standard color
*/
export function convert256ToStandardColor(colorIndex) {
const rgb = convert256ToRGB(colorIndex);
return findNearestStandardColor(rgb);
}
/**
* Convert RGB values to the nearest standard color
*/
export function convertRGBToStandardColor(r, g, b) {
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
throw new Error(`Invalid RGB values: (${r}, ${g}, ${b}). Values must be between 0-255.`);
}
return findNearestStandardColor({ r, g, b });
}
/**
* Convert basic ANSI color code (30-37, 90-97) to standard color name
*/
export function convertBasicAnsiToStandardColor(ansiCode) {
const colorMap = {
30: "black",
31: "red",
32: "green",
33: "yellow",
34: "blue",
35: "magenta",
36: "cyan",
37: "white",
90: "brightBlack",
91: "brightRed",
92: "brightGreen",
93: "brightYellow",
94: "brightBlue",
95: "brightMagenta",
96: "brightCyan",
97: "brightWhite",
};
const color = colorMap[ansiCode];
if (!color) {
throw new Error(`Invalid ANSI color code: ${ansiCode}`);
}
return color;
}
/**
* Convert basic ANSI background color code (40-47, 100-107) to background color name
*/
export function convertBasicAnsiToBackgroundColor(ansiCode) {
const colorMap = {
40: "bgBlack",
41: "bgRed",
42: "bgGreen",
43: "bgYellow",
44: "bgBlue",
45: "bgMagenta",
46: "bgCyan",
47: "bgWhite",
100: "bgBrightBlack",
101: "bgBrightRed",
102: "bgBrightGreen",
103: "bgBrightYellow",
104: "bgBrightBlue",
105: "bgBrightMagenta",
106: "bgBrightCyan",
107: "bgBrightWhite",
};
const color = colorMap[ansiCode];
if (!color) {
throw new Error(`Invalid ANSI background color code: ${ansiCode}`);
}
return color;
}
/**
* Convert 256-color index to background color name
*/
export function convert256ToBackgroundColor(colorIndex) {
const standardColor = convert256ToStandardColor(colorIndex);
return `bg${standardColor.charAt(0).toUpperCase()}${standardColor.slice(1)}`;
}
/**
* Convert RGB values to background color name
*/
export function convertRGBToBackgroundColor(r, g, b) {
const standardColor = convertRGBToStandardColor(r, g, b);
return `bg${standardColor.charAt(0).toUpperCase()}${standardColor.slice(1)}`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItY29udmVydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY29sb3ItY29udmVydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLHdDQUF3QztBQUN4QyxNQUFNLGVBQWUsR0FBb0M7SUFDdkQsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDM0IsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDN0IsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDaEMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDakMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDOUIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDakMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFDdkMsU0FBUyxFQUFFLEVB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