KiCS-0.8.8: src/lib/Curry/Module/AnsiCodes.curry
------------------------------------------------------------------------------
--- Library for formatted output on terminals
---
--- Information on ANSI Codes can be found at
--- http://www.dee.ufcg.edu.br/~rrbrandt/tools/ansi.html
---
--- @author Sebastian Fischer
------------------------------------------------------------------------------
module AnsiCodes(
-- exported functions for cursor movement
cursorPos, cursorHome,
cursorUp, cursorDown, cursorFwd, cursorBack,
saveCursor, restoreCursor,
-- exported functions for graphics control
clear, eraseLine,
-- exported functions for formatted output
bold, underline, revColors, concealed,
black, red, green, yellow, blue, cyan, magenta, white,
bgBlack, bgRed, bgGreen, bgYellow, bgBlue, bgCyan, bgMagenta, bgWhite,
-- exported functions for string operations
ansiLength
) where
import Char
import List
-- escape character
esc = chr 27
--- The functions for cursor movement
cmd s = esc:"[" ++ s
--- move cursor to position
cursorPos r c = cmd (show r ++ ";" ++ show c ++ "H")
--- move cursor to home position
cursorHome = cmd "H"
moveCursor :: String -> String -> String
moveCursor s n = cmd (show n ++ s)
--- move cursor n lines up
cursorUp = moveCursor "A"
--- move cursor n lines down
cursorDown = moveCursor "B"
--- move cursor n columns forward
cursorFwd = moveCursor "C"
--- move cursor n columns backward
cursorBack = moveCursor "D"
--- save cursor position
saveCursor = cmd "s"
--- restore saved cursor position
restoreCursor = cmd "u"
--- The functions for controlling graphics
--- clear screen
clear = cmd "2J"
--- erase line
eraseLine = cmd "K"
mode n s = cmd (show n ++ "m" ++ s ++ if isSuffixOf end s then "" else end)
where
end = cmd "0m"
--isSuffixOf s l = [] /= findall (\p -> p ++ s =:= l)
isSuffixOf s = isPrefixOf (reverse s) . reverse
--- format text
bold = mode 1
underline = mode 4
revColors = mode 7
concealed = mode 8
black = mode 30
red = mode 31
green = mode 32
yellow = mode 33
blue = mode 34
magenta = mode 35
cyan = mode 36
white = mode 37
bgBlack = mode 40
bgRed = mode 41
bgGreen = mode 42
bgYellow = mode 43
bgBlue = mode 44
bgMagenta = mode 45
bgCyan = mode 46
bgWhite = mode 47
-- functions for string operations
ansiLength :: String -> Int
ansiLength s = aux s (length s)
where
aux [] n = n
aux (c:cs) n | c==esc && isDigit (cs!!2)
= aux (tail (tail (tail (tail cs)))) (n-5)
| c==esc = aux (tail (tail (tail cs))) (n-4)
| otherwise = aux cs n
------------------------------------------------------------------------------