From f276aa34f548785644f7c8aa44656e99afd687b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucio=20Andr=C3=A9s=20Illanes=20Albornoz?= Date: Tue, 27 Aug 2019 08:45:39 +0200 Subject: [PATCH] assets/js/clipboard.js:import_ansi(): correctly support sequence of comma-separated SGR parameters. assets/js/clipboard.js:import_ansi(): support {bold,faint,reset} SGR parameters. assets/js/color.js: adds ansi_[bf]g_bold_import[]. --- assets/js/clipboard.js | 49 +++++++++++++++++------------------- assets/js/color.js | 56 +++++++++++++++++++++++++++++++++++------- 2 files changed, 69 insertions(+), 36 deletions(-) diff --git a/assets/js/clipboard.js b/assets/js/clipboard.js index 0d8aa1e..6e42ea1 100644 --- a/assets/js/clipboard.js +++ b/assets/js/clipboard.js @@ -93,40 +93,35 @@ var clipboard = (function () { var lines_out = [] var w = 0, h = 0 for (var y = 0; y < lines_in.length; y++) { - var bg = 1, fg = 15 + var bg = 1, bold = false, fg = 15 var cells = [], line = lines_in[y] if (line.length === 0) { continue } else { for (var x = 0; x < line.length; x++) { - var m = line.substring(x).match(/^\x1b\[(\d{1,3});(\d{1,3})m/); + var m = line.substring(x).match(/^\x1b\[((?:\d{1,3};?)+)m/) if (m !== null) { - if (ansi_bg_import[parseInt(m[1])] !== undefined) { - bg = ansi_bg_import[parseInt(m[1])]; - } - if (ansi_fg_import[parseInt(m[1])] !== undefined) { - fg = ansi_fg_import[parseInt(m[1])]; - } - if (ansi_bg_import[parseInt(m[2])] !== undefined) { - bg = ansi_bg_import[parseInt(m[2])]; - } - if (ansi_fg_import[parseInt(m[2])] !== undefined) { - fg = ansi_fg_import[parseInt(m[2])]; - } - x += (m[0].length - 1) + m[1].split(";").forEach(function(c){ + c = parseInt(c); + if (c == 0) { + bg = 1; bold = false; fg = 15; + } else if (c == 1) { + bold = true; + } else if (c == 2) { + bold = false; + } else if (bold && (ansi_bg_bold_import[c] !== undefined)) { + bg = ansi_bg_bold_import[c]; + } else if (!bold && (ansi_bg_import[c] !== undefined)) { + bg = ansi_bg_import[c]; + } else if (bold && (ansi_fg_bold_import[c] !== undefined)) { + fg = ansi_fg_bold_import[c]; + } else if (!bold && (ansi_fg_import[c] !== undefined)) { + fg = ansi_fg_import[c]; + } + }); + x += (m[0].length - 1); } else { - var m = line.substring(x).match(/^\x1b\[(\d{1,3})m/); - if (m !== null) { - if (ansi_bg_import[parseInt(m[1])] !== undefined) { - bg = ansi_bg_import[parseInt(m[1])]; - } - if (ansi_fg_import[parseInt(m[1])] !== undefined) { - fg = ansi_fg_import[parseInt(m[1])]; - } - x += (m[0].length - 1) - } else { - cells.push({bg: bg, fg: fg, value: line[x]}) - } + cells.push({bg: bg, fg: fg, value: line[x]}) } } if (cells.length > 0) { diff --git a/assets/js/color.js b/assets/js/color.js index fa4301f..2d14828 100644 --- a/assets/js/color.js +++ b/assets/js/color.js @@ -70,7 +70,7 @@ Object.keys(css_lookup).forEach(function(color){ var ansi_fg = [ 97, // Bright White 30, // Black - 94, // Light Blue + 94, // Blue 32, // Green 91, // Red 31, // Light Red @@ -80,7 +80,7 @@ var ansi_fg = [ 92, // Light Green 36, // Cyan 96, // Light Cyan - 34, // Blue + 34, // Light Blue 95, // Light Pink 90, // Grey 37, // Light Grey @@ -89,7 +89,7 @@ var ansi_fg = [ var ansi_fg_import = { 97: 0, // Bright White 30: 1, // Black - 94: 2, // Light Blue + 94: 2, // Blue 32: 3, // Green 91: 4, // Red 31: 5, // Light Red @@ -99,16 +99,35 @@ var ansi_fg_import = { 92: 9, // Light Green 36: 10, // Cyan 96: 11, // Light Cyan - 34: 12, // Blue - 95: 13, // Light Pink + 34: 12, // Light Blue + 95: 13, // Light Pink 90: 14, // Grey 37: 15, // Light Grey } +var ansi_fg_bold_import = { + 97: 0, // Bright White + 30: 14, // Grey + 94: 12, // Light Blue + 32: 9, // Light Green + 91: 4, // Light Red + 31: 4, // Light Red + 35: 13, // Light Pink + 33: 8, // Light Yellow + 93: 8, // Light Yellow + 92: 9, // Light Green + 36: 11, // Light Cyan + 96: 11, // Light Cyan + 34: 12, // Light Blue + 95: 13, // Light Pink + 90: 14, // Grey + 37: 0, // Bright White +} + var ansi_bg = [ 107, // Bright White 40, // Black - 104, // Light Blue + 104, // Blue 42, // Green 101, // Red 41, // Light Red @@ -118,16 +137,35 @@ var ansi_bg = [ 102, // Light Green 46, // Cyan 106, // Light Cyan - 44, // Blue + 44, // Light Blue 105, // Light Pink 100, // Grey 47, // Light Grey ] +var ansi_bg_bold_import = { + 107: 0, // Bright White + 40: 14, // Black + 104: 12, // Light Blue + 42: 9, // Light Green + 101: 4, // Light Red + 41: 4, // Light Red + 45: 13, // Light Pink + 43: 8, // Light Yellow + 103: 8, // Light Yellow + 102: 9, // Light Green + 46: 11, // Light Cyan + 106: 11, // Light Cyan + 44: 12, // Light Blue + 105: 13, // Light Pink + 100: 14, // Grey + 47: 0, // Bright White +} + var ansi_bg_import = { 107: 0, // Bright White 40: 1, // Black - 104: 2, // Light Blue + 104: 2, // Blue 42: 3, // Green 101: 4, // Red 41: 5, // Light Red @@ -137,7 +175,7 @@ var ansi_bg_import = { 102: 9, // Light Green 46: 10, // Cyan 106: 11, // Light Cyan - 44: 12, // Blue + 44: 12, // Light Blue 105: 13, // Light Pink 100: 14, // Grey 47: 15, // Light Grey