import pprint
import re
import kutil

def unescape_ktesc(s):
    """Resolve KTESC escape markers back to original characters.
    Use this for argument values used programmatically (filenames, etc.)."""
    def replace(match):
        hex_chars = match.group(1)
        result = ''
        for i in range(0, len(hex_chars), 4):
            result += chr(int(hex_chars[i:i+4], 16))
        return result
    return re.sub(r'KTESC([0-9a-f]+)KTESC', replace, s)

class Klammer_base:
    def __init__(self, K):
        #args = {k:escape(v) for k, v in K.__dict__.items()
        args = {k:v for k, v in K.__dict__.items()
                if not k.startswith('__')}

        for key in args:
            setattr(self, key, args[key])

        #setattr(self, "_klammer_name", klammer_name)
        #pprint.pprint(self.__dict__)


    def html(self):
        #return '[{}: HTML]'.format(self.__class__.__name__)
        return None

    def tex(self):
        #return '[{}: LaTeX]'.format(self.__class__.__name__)
        return None

    def txt(self):
        #return '[{}: Plain text]'.format(self.__class__.__name__)
        return None

    def show(self, label=""):
        if label:
            print(label)
        pprint.pprint(self.__dict__)

    def __str__(self):
        result = None
        if self.K_target == 'html':
            result = self.html()
        elif self.K_target in {'tex', 'pdf'}:
            result = kutil.escape(self.tex())
        elif self.K_target == 'txt':
            result = self.txt()
        if result is None:
            #print(self.__dict__)
            raise Exception(
                f'Target "{self.K_target}" is undefined for klammer "@{self.K_klammer}"')
        return result
