55 lines
1.1 KiB
Nim
55 lines
1.1 KiB
Nim
import std/[strutils, tables]
|
|
|
|
let bbReset* = "\e[0m"
|
|
|
|
const
|
|
bbStyles = {
|
|
"bold": "1",
|
|
"b": "1",
|
|
"faint": "2",
|
|
"italic": "3",
|
|
"i": "3",
|
|
"underline": "4",
|
|
"u": "4",
|
|
"blink": "5",
|
|
"reverse": "7",
|
|
"conceal": "8",
|
|
"strike": "9",
|
|
}.toTable
|
|
|
|
bbColors = {
|
|
"black": "0",
|
|
"red": "1",
|
|
"green": "2",
|
|
"yellow": "3",
|
|
"blue": "4",
|
|
"magenta": "5",
|
|
"cyan": "6",
|
|
"white": "7",
|
|
}.toTable
|
|
|
|
proc toAnsiCode*(s: string): string =
|
|
var
|
|
codes: seq[string]
|
|
styles: seq[string]
|
|
bgStyle: string
|
|
if " on " in s or s.startswith("on"):
|
|
let fgBgSplit = s.rsplit("on", maxsplit = 1)
|
|
styles = fgBgSplit[0].toLowerAscii().splitWhitespace()
|
|
bgStyle = fgBgSplit[1].strip().toLowerAscii()
|
|
else:
|
|
styles = s.splitWhitespace()
|
|
for style in styles:
|
|
if style in bbStyles:
|
|
codes.add bbStyles[style]
|
|
elif style in bbColors:
|
|
codes.add "3" & bbColors[style]
|
|
if bgStyle in bbColors:
|
|
codes.add "4" & bbColors[bgStyle]
|
|
|
|
if codes.len > 0:
|
|
result.add "\e["
|
|
result.add codes.join ";"
|
|
result.add "m"
|
|
|