60 lines
2.2 KiB
Python
60 lines
2.2 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 import ansi
|
|
|
|
|
|
class IMCANSIParser(ansi.ANSIParser):
|
|
"""
|
|
This parser is per the IMC2 specification.
|
|
"""
|
|
def __init__(self):
|
|
normal = ansi.ANSI_NORMAL
|
|
hilite = ansi.ANSI_HILITE
|
|
self.ansi_map = [
|
|
(r'~Z', normal), # Random
|
|
(r'~x', normal + ansi.ANSI_BLACK), # Black
|
|
(r'~D', hilite + ansi.ANSI_BLACK), # Dark Grey
|
|
(r'~z', hilite + ansi.ANSI_BLACK),
|
|
(r'~w', normal + ansi.ANSI_WHITE), # Grey
|
|
(r'~W', hilite + ansi.ANSI_WHITE), # White
|
|
(r'~g', normal + ansi.ANSI_GREEN), # Dark Green
|
|
(r'~G', hilite + ansi.ANSI_GREEN), # Green
|
|
(r'~p', normal + ansi.ANSI_MAGENTA), # Dark magenta
|
|
(r'~m', normal + ansi.ANSI_MAGENTA),
|
|
(r'~M', hilite + ansi.ANSI_MAGENTA), # Magenta
|
|
(r'~P', hilite + ansi.ANSI_MAGENTA),
|
|
(r'~c', normal + ansi.ANSI_CYAN), # Cyan
|
|
(r'~y', normal + ansi.ANSI_YELLOW), # Dark Yellow (brown)
|
|
(r'~Y', hilite + ansi.ANSI_YELLOW), # Yellow
|
|
(r'~b', normal + ansi.ANSI_BLUE), # Dark Blue
|
|
(r'~B', hilite + ansi.ANSI_BLUE), # Blue
|
|
(r'~C', hilite + ansi.ANSI_BLUE),
|
|
(r'~r', normal + ansi.ANSI_RED), # Dark Red
|
|
(r'~R', hilite + ansi.ANSI_RED), # Red
|
|
|
|
## Formatting
|
|
(r'~L', hilite), # Bold/hilite
|
|
(r'~!', normal), # reset
|
|
(r'\\r', normal),
|
|
(r'\\n', ansi.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)
|