2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
9 -- luacheck: ignore 213/i
12 local t_concat
, t_insert
= table.concat
, table.insert
;
13 local char
, format = string.char
, string.format;
14 local tonumber = tonumber;
15 local ipairs
= ipairs
;
16 local io_write
= io
.write;
17 local m_floor
= math
.floor;
19 local setmetatable
= setmetatable
;
23 if os
.getenv("WINDIR") then
24 windows
= require
"util.windows";
26 local orig_color
= windows
and windows
.get_consolecolor
and windows
.get_consolecolor();
32 reset
= 0; bright
= 1, dim
= 2, underscore
= 4, blink
= 5, reverse
= 7, hidden
= 8;
33 black
= 30; red
= 31; green
= 32; yellow
= 33; blue
= 34; magenta
= 35; cyan
= 36; white
= 37;
34 ["black background"] = 40; ["red background"] = 41; ["green background"] = 42; ["yellow background"] = 43;
35 ["blue background"] = 44; ["magenta background"] = 45; ["cyan background"] = 46; ["white background"] = 47;
36 bold
= 1, dark
= 2, underline
= 4, underlined
= 4, normal
= 0;
40 ["0"] = orig_color
, -- reset
42 ["1;33"] = 2+4+8, -- bold yellow
43 ["1;31"] = 4+8 -- bold red
47 [1] = "font-weight: bold", [2] = "opacity: 0.5", [4] = "text-decoration: underline", [8] = "visibility: hidden",
48 [30] = "color:black", [31] = "color:red", [32]="color:green", [33]="color:#FFD700",
49 [34] = "color:blue", [35] = "color: magenta", [36] = "color:cyan", [37] = "color: white",
50 [40] = "background-color:black", [41] = "background-color:red", [42]="background-color:green",
51 [43]="background-color:yellow", [44] = "background-color:blue", [45] = "background-color: magenta",
52 [46] = "background-color:cyan", [47] = "background-color: white";
55 local fmt_string
= char(0x1B).."[%sm%s"..char(0x1B).."[0m";
56 local function getstring(style
, text
)
58 return format(fmt_string
, style
, text
);
64 local function gray(n
)
65 return m_floor(n
*3/32)+0xe8;
67 local function color(r
,g
,b
)
68 if r
== g
and g
== b
then
74 return 0x10 + ( r
* 36 ) + ( g
* 6 ) + ( b
);
76 local function hex2rgb(hex
)
77 local r
= tonumber(hex
:sub(1,2),16);
78 local g
= tonumber(hex
:sub(3,4),16);
79 local b
= tonumber(hex
:sub(5,6),16);
83 setmetatable(stylemap
, { __index
= function(_
, style
)
84 if type(style
) == "string" and style
:find("%x%x%x%x%x%x") == 1 then
85 local g
= style
:sub(7) == " background" and "48;5;" or "38;5;";
86 return g
.. color(hex2rgb(style
));
91 red
= "ff0000"; fuchsia
= "ff00ff"; green
= "008000"; white
= "ffffff";
92 lime
= "00ff00"; yellow
= "ffff00"; purple
= "800080"; blue
= "0000ff";
93 aqua
= "00ffff"; olive
= "808000"; black
= "000000"; navy
= "000080";
94 teal
= "008080"; silver
= "c0c0c0"; maroon
= "800000"; gray
= "808080";
96 for colorname
, rgb
in pairs(csscolors
) do
97 stylemap
[colorname
] = stylemap
[colorname
] or stylemap
[rgb
];
98 colorname
, rgb
= colorname
.. " background", rgb
.. " background"
99 stylemap
[colorname
] = stylemap
[colorname
] or stylemap
[rgb
];
102 local function getstyle(...)
103 local styles
, result
= { ... }, {};
104 for i
, style
in ipairs(styles
) do
105 style
= stylemap
[style
];
107 t_insert(result
, style
);
110 return t_concat(result
, ";");
114 local function setstyle(style
)
115 style
= style
or "0";
116 if style
~= last
then
117 io_write("\27["..style
.."m");
123 function setstyle(style
)
124 style
= style
or "0";
125 if style
~= last
then
126 windows
.set_consolecolor(winstylemap
[style
] or orig_color
);
130 if not orig_color
then
131 function setstyle() end
135 local function ansi2css(ansi_codes
)
136 if ansi_codes
== "0" then return "</span>"; end
138 for code
in ansi_codes
:gmatch("[^;]+") do
139 t_insert(css
, cssmap
[tonumber(code
)]);
141 return "</span><span style='"..t_concat(css
, ";").."'>";
144 local function tohtml(input
)
145 return input
:gsub("\027%[(.-)m", ansi2css
);
149 getstring
= getstring
;