xref: /freebsd/stand/lua/color.lua (revision 036d2e814bf0f5d88ffb4b24c159320894541757)
1--
2-- SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3--
4-- Copyright (c) 2015 Pedro Souza <pedrosouza@freebsd.org>
5-- All rights reserved.
6--
7-- Redistribution and use in source and binary forms, with or without
8-- modification, are permitted provided that the following conditions
9-- are met:
10-- 1. Redistributions of source code must retain the above copyright
11--    notice, this list of conditions and the following disclaimer.
12-- 2. Redistributions in binary form must reproduce the above copyright
13--    notice, this list of conditions and the following disclaimer in the
14--    documentation and/or other materials provided with the distribution.
15--
16-- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18-- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19-- ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20-- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21-- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22-- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23-- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24-- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25-- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26-- SUCH DAMAGE.
27--
28-- $FreeBSD$
29--
30
31local core = require("core")
32
33local color = {}
34
35-- Module exports
36color.BLACK   = 0
37color.RED     = 1
38color.GREEN   = 2
39color.YELLOW  = 3
40color.BLUE    = 4
41color.MAGENTA = 5
42color.CYAN    = 6
43color.WHITE   = 7
44
45color.DEFAULT = 9
46color.BRIGHT  = 1
47color.DIM     = 2
48
49function color.isEnabled()
50	local c = loader.getenv("loader_color")
51	if c ~= nil then
52		return c:lower() ~= "no" and c ~= "0"
53	end
54	return not core.isSerialBoot()
55end
56
57color.disabled = not color.isEnabled()
58
59function color.escapefg(color_value)
60	if color.disabled then
61		return color_value
62	end
63	return core.KEYSTR_CSI .. "3" .. color_value .. "m"
64end
65
66function color.resetfg()
67	if color.disabled then
68		return ''
69	end
70	return color.escapefg(color.DEFAULT)
71end
72
73function color.escapebg(color_value)
74	if color.disabled then
75		return color_value
76	end
77	return core.KEYSTR_CSI .. "4" .. color_value .. "m"
78end
79
80function color.resetbg()
81	if color.disabled then
82		return ''
83	end
84	return color.escapebg(color.DEFAULT)
85end
86
87function color.escape(fg_color, bg_color, attribute)
88	if color.disabled then
89		return ""
90	end
91	if attribute == nil then
92		attribute = ""
93	else
94		attribute = attribute .. ";"
95	end
96	return core.KEYSTR_CSI .. attribute ..
97	    "3" .. fg_color .. ";4" .. bg_color .. "m"
98end
99
100function color.default()
101	if color.disabled then
102		return ""
103	end
104	return color.escape(color.DEFAULT, color.DEFAULT)
105end
106
107function color.highlight(str)
108	if color.disabled then
109		return str
110	end
111	-- We need to reset attributes as well as color scheme here, just in
112	-- case the terminal defaults don't match what we're expecting.
113	return core.KEYSTR_CSI .. "1m" .. str .. core.KEYSTR_CSI .. "22m"
114end
115
116return color
117