75 lines
2.9 KiB
Python
75 lines
2.9 KiB
Python
"""
|
|
ANSI parser - this adds colour to text according to
|
|
special markup strings.
|
|
|
|
This is a IMC2 complacent version.
|
|
"""
|
|
|
|
import re
|
|
from src.utils.ansi import ANSIParser, ANSITable, parse_ansi
|
|
|
|
class IMCANSIParser(ANSIParser):
|
|
"""
|
|
This parser is per the IMC2 specification.
|
|
"""
|
|
def __init__(self):
|
|
self.ansi_map = [
|
|
# Random
|
|
(r'~Z', ANSITable.ansi["normal"]),
|
|
# Dark Grey
|
|
(r'~D', ANSITable.ansi["hilite"] + ANSITable.ansi["black"]),
|
|
(r'~z', ANSITable.ansi["hilite"] + ANSITable.ansi["black"]),
|
|
# Grey/reset
|
|
(r'~w', ANSITable.ansi["normal"]),
|
|
(r'~d', ANSITable.ansi["normal"]),
|
|
(r'~!', ANSITable.ansi["normal"]),
|
|
# Bold/hilite
|
|
(r'~L', ANSITable.ansi["hilite"]),
|
|
# White
|
|
(r'~W', ANSITable.ansi["normal"] + ANSITable.ansi["hilite"]),
|
|
# Dark Green
|
|
(r'~g', ANSITable.ansi["normal"] + ANSITable.ansi["green"]),
|
|
# Green
|
|
(r'~G', ANSITable.ansi["hilite"] + ANSITable.ansi["green"]),
|
|
# Dark magenta
|
|
(r'~p', ANSITable.ansi["normal"] + ANSITable.ansi["magenta"]),
|
|
(r'~m', ANSITable.ansi["normal"] + ANSITable.ansi["magenta"]),
|
|
# Magenta
|
|
(r'~M', ANSITable.ansi["hilite"] + ANSITable.ansi["magenta"]),
|
|
(r'~P', ANSITable.ansi["hilite"] + ANSITable.ansi["magenta"]),
|
|
# Black
|
|
(r'~x', ANSITable.ansi["normal"] + ANSITable.ansi["black"]),
|
|
# Cyan
|
|
(r'~c', ANSITable.ansi["normal"] + ANSITable.ansi["cyan"]),
|
|
# Dark Yellow (brown)
|
|
(r'~Y', ANSITable.ansi["hilite"] + ANSITable.ansi["yellow"]),
|
|
# Yellow
|
|
(r'~y', ANSITable.ansi["normal"] + ANSITable.ansi["yellow"]),
|
|
# Dark Blue
|
|
(r'~B', ANSITable.ansi["normal"] + ANSITable.ansi["blue"]),
|
|
# Blue
|
|
(r'~C', ANSITable.ansi["hilite"] + ANSITable.ansi["blue"]),
|
|
# Dark Red
|
|
(r'~r', ANSITable.ansi["normal"] + ANSITable.ansi["red"]),
|
|
# Red
|
|
(r'~R', ANSITable.ansi["normal"] + ANSITable.ansi["red"]),
|
|
# Dark Blue
|
|
(r'~b', ANSITable.ansi["normal"] + ANSITable.ansi["blue"]),
|
|
## Formatting
|
|
(r'\\r', ANSITable.ansi["normal"]),
|
|
(r'\\n', ANSITable.ansi["return"]),
|
|
]
|
|
# prepare regex matching
|
|
self.ansi_sub = [(re.compile(sub[0], re.DOTALL), sub[1])
|
|
for sub in self.ansi_map]
|
|
# prepare matching ansi codes overall
|
|
self.ansi_regex = re.compile("\033\[[0-9;]+m")
|
|
|
|
|
|
ANSI_PARSER = IMCANSIParser()
|
|
|
|
def parse_ansi(string, strip_ansi=False, parser=ANSI_PARSER):
|
|
"""
|
|
Shortcut to use the IMC2 ANSI parser.
|
|
"""
|
|
return parser.parse_ansi(string, strip_ansi=strip_ansi)
|