util/termcolours.lua

1
-- Prosody IM
2
-- Copyright (C) 2008-2010 Matthew Wild
3
-- Copyright (C) 2008-2010 Waqas Hussain
4
-- 
5
-- This project is MIT/X11 licensed. Please see the
6
-- COPYING file in the source package for more information.
7
--
8
 
9
 
10
local t_concat, t_insert = table.concat, table.insert;
11
local char, format = string.char, string.format;
12
local ipairs = ipairs;
13
local io_write = io.write;
14
 
15
local windows;
16
if os.getenv("WINDIR") then
17
	windows = require "util.windows";
18
end
19
local orig_color = windows and windows.get_consolecolor and windows.get_consolecolor();
20
 
21
module "termcolours"
22
 
23
local stylemap = {
24
			reset = 0; bright = 1, dim = 2, underscore = 4, blink = 5, reverse = 7, hidden = 8;
25
			black = 30; red = 31; green = 32; yellow = 33; blue = 34; magenta = 35; cyan = 36; white = 37;
26
			["black background"] = 40; ["red background"] = 41; ["green background"] = 42; ["yellow background"] = 43; ["blue background"] = 44; ["magenta background"] = 45; ["cyan background"] = 46; ["white background"] = 47;
27
			bold = 1, dark = 2, underline = 4, underlined = 4, normal = 0;
28
		}
29
 
30
local winstylemap = {
31
	["0"] = orig_color, -- reset
32
	["1"] = 7+8, -- bold
33
	["1;33"] = 2+4+8, -- bold yellow
34
	["1;31"] = 4+8 -- bold red
35
}
36
 
37
local fmt_string = char(0x1B).."[%sm%s"..char(0x1B).."[0m";
38
function getstring(style, text)
39
	if style then
40
		return format(fmt_string, style, text);
41
	else
42
		return text;
43
	end
44
end
45
 
46
function getstyle(...)
47
	local styles, result = { ... }, {};
48
	for i, style in ipairs(styles) do
49
		style = stylemap[style];
50
		if style then
51
			t_insert(result, style);
52
		end
53
	end
54
	return t_concat(result, ";");
55
end
56
 
57
local last = "0";
58
function setstyle(style)
59
	style = style or "0";
60
	if style ~= last then
61
		io_write("\27["..style.."m");
62
		last = style;
63
	end
64
end
65
 
66
if windows then
67
	function setstyle(style)
68
		style = style or "0";
69
		if style ~= last then
70
			windows.set_consolecolor(winstylemap[style] or orig_color);
71
			last = style;
72
		end
73
	end
74
	if not orig_color then
75
		function setstyle(style) end
76
	end
77
end
78
 
79
return _M;