summaryrefslogtreecommitdiff
path: root/xmake/core/ui/curses.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2017-12-07 22:46:25 +0800
committerruki <[email protected]>2017-12-08 14:10:23 +0800
commitcb44535305f596bd757ffb58e5ae3cde6d3589fa (patch)
tree343f0ff9287b90204a6a000e0af1a7a1ed6c640b /xmake/core/ui/curses.lua
parentabe87994168053e4f420a8b7ab286c65b546eaae (diff)
improve log and add color attrs for curses
Diffstat (limited to 'xmake/core/ui/curses.lua')
-rw-r--r--xmake/core/ui/curses.lua181
1 files changed, 181 insertions, 0 deletions
diff --git a/xmake/core/ui/curses.lua b/xmake/core/ui/curses.lua
new file mode 100644
index 000000000..dc3ea0d06
--- /dev/null
+++ b/xmake/core/ui/curses.lua
@@ -0,0 +1,181 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements. See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership. The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015 - 2017, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file curses.lua
+--
+
+--[[ Console User Interface (cui) ]-----------------------------------------
+Author: Tiago Dionizio ([email protected])
+$Id: core.lua 18 2007-06-21 20:43:52Z tngd $
+--------------------------------------------------------------------------]]
+
+-- define module: curses
+local curses = curses or {}
+
+-- load modules
+local os = require("base/os")
+local log = require("ui/log")
+
+-- get color from the given name
+function curses.color(name)
+ if name == 'black' then return curses.COLOR_BLACK
+ elseif name == 'red' then return curses.COLOR_RED
+ elseif name == 'green' then return curses.COLOR_GREEN
+ elseif name == 'yellow' then return curses.COLOR_YELLOW
+ elseif name == 'blue' then return curses.COLOR_BLUE
+ elseif name == 'magenta' then return curses.COLOR_MAGENTA
+ elseif name == 'cyan' then return curses.COLOR_CYAN
+ elseif name == 'white' then return curses.COLOR_WHITE
+ else return curses.COLOR_BLACK
+ end
+end
+
+-- get attr from the given name
+function curses.attr(name)
+ if name == 'normal' then return curses.A_NORMAL
+ elseif name == 'standout' then return curses.A_STANDOUT
+ elseif name == 'underline' then return curses.A_UNDERLINE
+ elseif name == 'reverse' then return curses.A_REVERSE
+ elseif name == 'blink' then return curses.A_BLINK
+ elseif name == 'dim' then return curses.A_DIM
+ elseif name == 'bold' then return curses.A_BOLD
+ elseif name == 'protect' then return curses.A_PROTECT
+ elseif name == 'invis' then return curses.A_INVIS
+ elseif name == 'alt' then return curses.A_ALTCHARSET
+ else return curses.A_NORMAL
+ end
+end
+
+-- get acs character from the given name
+function curses.acs(name)
+ if char == 'block' then return curses.ACS_BLOCK
+ elseif char == 'board' then return curses.ACS_BOARD
+ elseif char == 'btee' then return curses.ACS_BTEE
+ elseif char == 'bullet' then return curses.ACS_BULLET
+ elseif char == 'ckboard' then return curses.ACS_CKBOARD
+ elseif char == 'darrow' then return curses.ACS_DARROW
+ elseif char == 'degree' then return curses.ACS_DEGREE
+ elseif char == 'diamond' then return curses.ACS_DIAMOND
+ elseif char == 'gequal' then return curses.ACS_GEQUAL
+ elseif char == 'hline' then return curses.ACS_HLINE
+ elseif char == 'lantern' then return curses.ACS_LANTERN
+ elseif char == 'larrow' then return curses.ACS_LARROW
+ elseif char == 'lequal' then return curses.ACS_LEQUAL
+ elseif char == 'llcorner' then return curses.ACS_LLCORNER
+ elseif char == 'lrcorner' then return curses.ACS_LRCORNER
+ elseif char == 'ltee' then return curses.ACS_LTEE
+ elseif char == 'nequal' then return curses.ACS_NEQUAL
+ elseif char == 'pi' then return curses.ACS_PI
+ elseif char == 'plminus' then return curses.ACS_PLMINUS
+ elseif char == 'plus' then return curses.ACS_PLUS
+ elseif char == 'rarrow' then return curses.ACS_RARROW
+ elseif char == 'rtee' then return curses.ACS_RTEE
+ elseif char == 's1' then return curses.ACS_S1
+ elseif char == 's3' then return curses.ACS_S3
+ elseif char == 's7' then return curses.ACS_S7
+ elseif char == 's9' then return curses.ACS_S9
+ elseif char == 'sterling' then return curses.ACS_STERLING
+ elseif char == 'ttee' then return curses.ACS_TTEE
+ elseif char == 'uarrow' then return curses.ACS_UARROW
+ elseif char == 'ulcorner' then return curses.ACS_ULCORNER
+ elseif char == 'urcorner' then return curses.ACS_URCORNER
+ elseif char == 'vline' then return curses.ACS_VLINE
+ elseif type(char) == 'string' and #char == 1 then
+ return char
+ else
+ return ' '
+ end
+end
+
+-- calculate attr from the attributes list
+--
+-- local attr = curses.calc_attr("yellow")
+-- local attr = curses.calc_attr{ curses.color_pair("yellow", "green"), 'bold' }
+--
+function curses.calc_attr(attrs)
+
+ -- curses.calc_attr(curses.A_BOLD)
+ local atype = type(attrs)
+ if atype == 'number' then
+ return attrs
+ -- curses.calc_attr("bold")
+ elseif atype == 'string' then
+ return curses.attr(attrs)
+ -- curses.calc_attr{ curses.color_pair("yellow", "green"), 'bold' }
+ elseif atype == 'table' then
+ local v = 0
+ local set = {}
+ for _, a in pairs(attrs) do --TODO ipairs?
+ if not set[a] and a then
+ set[a] = true
+ if type(a) == 'number' then
+ v = v + a
+ else
+ v = v + curses.attr(a)
+ end
+ end
+ end
+ return v
+ else
+ return 0
+ end
+end
+
+-- get attr from the color pair
+function curses.color_pair(fg, bg)
+
+ -- get foreground and backround color
+ fg = curses.color(fg)
+ bg = curses.color(bg)
+
+ -- attempt to get color from the cache first
+ local key = fg .. ':' .. bg
+ local colors = curses._COLORS or {}
+ if colors[key] then
+ return colors[key]
+ end
+
+ -- no colors?
+ if not curses.has_colors() then
+ return 0
+ end
+
+ -- update the colors count
+ curses._NCOLORS = (curses._NCOLORS or 0) + 1
+
+ -- init the color pair
+ if not curses.init_pair(curses._NCOLORS, fg, bg) then
+ os.raise("failed to initialize color pair (%d, %s, %s)", curses._NCOLORS, fg, bg)
+ end
+
+ -- get the color attr
+ local attr = curses.color_pair(curses._NCOLORS)
+
+ -- save to cache
+ colors[key] = attr
+ curses._COLORS = colors
+
+ -- ok
+ return attr
+end
+
+-- return module: curses
+return curses