| 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; |