Loading cli/node.ts +37 −10 Original line number Diff line number Diff line Loading @@ -98,8 +98,8 @@ export const command = new Command() buffer = images[0].buffer; } const image = await Jimp.read(buffer); const trueColorSupport = checkTerminalTrueColorSupport(); layout = getAsciiArt(image, DEFAULT_IMAGE_WIDTH, trueColorSupport) const colorSupport = checkTerminalColorSupport(); layout = getAsciiArt(image, DEFAULT_IMAGE_WIDTH, colorSupport) .split("\n").map((line) => ` ${line} `); defaultWidth = 41; } else { Loading Loading @@ -258,16 +258,41 @@ export const Jimp = createJimp({ plugins: defaultPlugins, }); function checkTerminalTrueColorSupport() { function checkTerminalColorSupport(): "truecolor" | "256color" | "none" { const colorTerm = Deno.env.get("COLORTERM"); const term = Deno.env.get("TERM"); // Check for true color (24-bit) support if ( colorTerm == null || !(colorTerm.includes("24bit") || colorTerm.includes("truecolor")) colorTerm != null && (colorTerm.includes("24bit") || colorTerm.includes("truecolor")) ) { return false; return "truecolor"; } return true; // Check for xterm 256-color support if ( term != null && (term.includes("256color") || term.includes("xterm") || term === "screen" || term === "tmux") ) { return "256color"; } // Check if colors are explicitly disabled const noColor = Deno.env.get("NO_COLOR"); if (noColor != null && noColor !== "") { return "none"; } // Fallback: assume basic color support if TERM is set if (term != null && term !== "dumb") { return "256color"; } return "none"; } const DEFAULT_IMAGE_WIDTH = 38; Loading Loading @@ -326,7 +351,7 @@ export function rgbTo256Color(r: number, g: number, b: number): number { export function getAsciiArt( image: Awaited<ReturnType<typeof Jimp.read>>, width = DEFAULT_IMAGE_WIDTH, trueColorSupport: boolean, colorSupport: "truecolor" | "256color" | "none", ): string { const ratio = image.width / image.height; const height = Math.round( Loading @@ -348,11 +373,13 @@ export function getAsciiArt( ); const char = ASCII_CHARS[charIndex]; if (trueColorSupport) { if (colorSupport === "truecolor") { art += colors.rgb24(char, color); } else { } else if (colorSupport === "256color") { const colorIndex = rgbTo256Color(color.r, color.g, color.b); art += colors.rgb8(char, colorIndex); } else { art += char; } } if (y < height - 1) art += "\n"; Loading Loading
cli/node.ts +37 −10 Original line number Diff line number Diff line Loading @@ -98,8 +98,8 @@ export const command = new Command() buffer = images[0].buffer; } const image = await Jimp.read(buffer); const trueColorSupport = checkTerminalTrueColorSupport(); layout = getAsciiArt(image, DEFAULT_IMAGE_WIDTH, trueColorSupport) const colorSupport = checkTerminalColorSupport(); layout = getAsciiArt(image, DEFAULT_IMAGE_WIDTH, colorSupport) .split("\n").map((line) => ` ${line} `); defaultWidth = 41; } else { Loading Loading @@ -258,16 +258,41 @@ export const Jimp = createJimp({ plugins: defaultPlugins, }); function checkTerminalTrueColorSupport() { function checkTerminalColorSupport(): "truecolor" | "256color" | "none" { const colorTerm = Deno.env.get("COLORTERM"); const term = Deno.env.get("TERM"); // Check for true color (24-bit) support if ( colorTerm == null || !(colorTerm.includes("24bit") || colorTerm.includes("truecolor")) colorTerm != null && (colorTerm.includes("24bit") || colorTerm.includes("truecolor")) ) { return false; return "truecolor"; } return true; // Check for xterm 256-color support if ( term != null && (term.includes("256color") || term.includes("xterm") || term === "screen" || term === "tmux") ) { return "256color"; } // Check if colors are explicitly disabled const noColor = Deno.env.get("NO_COLOR"); if (noColor != null && noColor !== "") { return "none"; } // Fallback: assume basic color support if TERM is set if (term != null && term !== "dumb") { return "256color"; } return "none"; } const DEFAULT_IMAGE_WIDTH = 38; Loading Loading @@ -326,7 +351,7 @@ export function rgbTo256Color(r: number, g: number, b: number): number { export function getAsciiArt( image: Awaited<ReturnType<typeof Jimp.read>>, width = DEFAULT_IMAGE_WIDTH, trueColorSupport: boolean, colorSupport: "truecolor" | "256color" | "none", ): string { const ratio = image.width / image.height; const height = Math.round( Loading @@ -348,11 +373,13 @@ export function getAsciiArt( ); const char = ASCII_CHARS[charIndex]; if (trueColorSupport) { if (colorSupport === "truecolor") { art += colors.rgb24(char, color); } else { } else if (colorSupport === "256color") { const colorIndex = rgbTo256Color(color.r, color.g, color.b); art += colors.rgb8(char, colorIndex); } else { art += char; } } if (y < height - 1) art += "\n"; Loading