xref: /freebsd/stand/lua/color.lua (revision 4f52dfbb8d6c4d446500c5b097e3806ec219fbd4)
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 = 0
46color.BRIGHT  = 1
47color.DIM     = 2
48
49function color.isEnabled()
50	local c = loader.getenv("loader_color")
51	if c ~= nil then
52		if c:lower() == "no" or c == "0" then
53			return false
54		end
55	end
56	return not core.isSerialBoot()
57end
58
59color.disabled = not color.isEnabled()
60
61function color.escapefg(color_value)
62	if color.disabled then
63		return color_value
64	end
65	return core.KEYSTR_CSI .. "3" .. color_value .. "m"
66end
67
68function color.resetfg()
69	if color.disabled then
70		return ''
71	end
72	return core.KEYSTR_CSI .. "39m"
73end
74
75function color.escapebg(color_value)
76	if color.disabled then
77		return color_value
78	end
79	return core.KEYSTR_CSI .. "4" .. color_value .. "m"
80end
81
82function color.resetbg()
83	if color.disabled then
84		return ''
85	end
86	return core.KEYSTR_CSI .. "49m"
87end
88
89function color.escape(fg_color, bg_color, attribute)
90	if color.disabled then
91		return ""
92	end
93	if attribute == nil then
94		attribute = ""
95	else
96		attribute = attribute .. ";"
97	end
98	return core.KEYSTR_CSI .. attribute ..
99	    "3" .. fg_color .. ";4" .. bg_color .. "m"
100end
101
102function color.default()
103	if color.disabled then
104		return ""
105	end
106	return color.escape(color.WHITE, color.BLACK, color.DEFAULT)
107end
108
109function color.highlight(str)
110	if color.disabled then
111		return str
112	end
113	-- We need to reset attributes as well as color scheme here, just in
114	-- case the terminal defaults don't match what we're expecting.
115	return core.KEYSTR_CSI .. "1m" .. str .. core.KEYSTR_CSI .. "22m"
116end
117
118return color
119