diff --git a/src/main/java/TerminalImageViewer.java b/src/main/java/TerminalImageViewer.java index f2b1574..ba5d57a 100644 --- a/src/main/java/TerminalImageViewer.java +++ b/src/main/java/TerminalImageViewer.java @@ -20,6 +20,7 @@ public class TerminalImageViewer { static boolean grayscale = false; static int mode = Ansi.MODE_24BIT; + static boolean html = false; /** @@ -52,6 +53,8 @@ public class TerminalImageViewer { mode = (mode & ~Ansi.MODE_24BIT) | Ansi.MODE_256; } else if (option.equals("-grayscale")) { grayscale = true; + } else if (option.equals("-html")) { + html = true; } else if (option.equals("-stdin")) { stdin = true; } @@ -159,6 +162,8 @@ public class TerminalImageViewer { System.out.print(imageData.dump(mode)); } + + /** * ANSI control code helpers */ @@ -245,7 +250,7 @@ public class TerminalImageViewer { * Assumed bitmaps of the supported characters */ static int[] BITMAPS = new int[] { - 0x00000000, ' ', + 0x00000000, '\u00a0', // Block graphics @@ -477,6 +482,9 @@ public class TerminalImageViewer { this.data = new byte[width * height * 4]; } + public String hex6(int r, int g, int b) { + return Integer.toHexString((1 << 24) | ((r & 255) << 16) | ((g & 255) << 8) | (b & 255)).substring(1); + } /** * Convert the image to an Ansi control character string setting the colors */ @@ -486,24 +494,44 @@ public class TerminalImageViewer { for (int y = 0; y < height - 7; y += 8) { int pos = y * width * 4; - String lastFg = ""; - String lastBg = ""; - for (int x = 0; x < width - 3; x += 4) { - blockChar.load(data, pos, width * 4); - String fg = Ansi.color(Ansi.FG|mode, blockChar.fgColor[0], blockChar.fgColor[1], blockChar.fgColor[2]); - String bg = Ansi.color(Ansi.BG|mode, blockChar.bgColor[0], blockChar.bgColor[1], blockChar.bgColor[2]); - if (!fg.equals(lastFg)) { - sb.append(fg); - lastFg = fg; + if (html) { + String last = ""; + for (int x = 0; x < width - 3; x += 4) { + blockChar.load(data, pos, width * 4); + String fg = hex6(blockChar.fgColor[0], blockChar.fgColor[1], blockChar.fgColor[2]); + String bg = hex6(blockChar.bgColor[0], blockChar.bgColor[1], blockChar.bgColor[2]); + String style = "background-color:#" + bg + ";color:#" + fg; + if (!style.equals(last)) { + if (!last.isEmpty()) { + sb.append(""); + } + sb.append(""); + last = style; + } + sb.append("&#" + ((int) blockChar.character) + ";"); + pos += 16; } - if (!bg.equals(lastBg)) { - sb.append(bg); - lastBg = bg; + sb.append("
\n"); + } else { + String lastFg = ""; + String lastBg = ""; + for (int x = 0; x < width - 3; x += 4) { + blockChar.load(data, pos, width * 4); + String fg = Ansi.color(Ansi.FG | mode, blockChar.fgColor[0], blockChar.fgColor[1], blockChar.fgColor[2]); + String bg = Ansi.color(Ansi.BG | mode, blockChar.bgColor[0], blockChar.bgColor[1], blockChar.bgColor[2]); + if (!fg.equals(lastFg)) { + sb.append(fg); + lastFg = fg; + } + if (!bg.equals(lastBg)) { + sb.append(bg); + lastBg = bg; + } + sb.append(blockChar.character); + pos += 16; } - sb.append(blockChar.character); - pos += 16; + sb.append(Ansi.RESET).append("\n"); } - sb.append(Ansi.RESET).append("\n"); } return sb.toString(); }