"""
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)

"""
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)

ANSI parser - this adds colour to text according to
 special markup strings.
 
 This is a IMC2 complacent version. This parser is per the IMC2 specification. # Random # Black # Dark Grey # Grey # White # Dark Green # Green # Dark magenta # Magenta # Cyan # Dark Yellow (brown) # Yellow # Dark Blue # Blue # Dark Red # Red ## Formatting # Bold/hilite # reset # prepare regex matching # prepare matching ansi codes overall Shortcut to use the IMC2 ANSI parser.