'''
AON 2020
'''
import re
def oneRe(reStr, s, attr, ls, multiColor=False):
    '''
        s  ,          ls,
           (<0>, <1> ...<1528>...).
          .
    
    reStr - re
    s - 
    attr -  style/class/etc
    ls -   
    multiColor=False,     
    '''
    i = len(ls) 
    for block in set(re.findall(reStr, s)):
        toArr = block
        if not multiColor: 
            for prev in set(re.findall(r'<[\d]+>', block)): 
                iPrev = int(prev[1:-1], 10)                 
                toArr = toArr.replace(prev, ls[iPrev][1])   
        ls.append([f'<span {attr}>{toArr}</span>', toArr])  
        s = s.replace(block, f'<{i}>')              
        i += 1
    return s
def operColor(s, ls, color):
    '''
     .
      ,       ,  
    '''
    i = len(ls)
    for c in ['<=', '>=', '=<', '=>', '<', '>', '&&', '&',
              '===', '!==', '==', '!=', '+=', '-=', '++', '--', '||']:
        ls.append([f'<span {color}>{c}</span>',0])
        s = s.replace(c, f'<{i}>')
        i += 1
    for c in '!|=+-?:,.[](){}%*/':
        ls.append([f'<span {color}>{c}</span>',0])
        s = s.replace(c, f'<{i}>')
        i += 1
    return s
def jsToHtml(s):
    '''
      .
     ,        <span>.
    '''
    black = '''style="font-family: 'Courier New', monospace;
        background: #fff; 
        color: black;
        font-weight: bold;
        border: 1px solid #ddd;
        padding: 5px;
        text-align: left;
        white-space: pre;"'''
    comm = 'style="color: red;"'
    green = 'style="color: green; font-style: italic;"'
    blue = 'style="color: blue;"'
    red2 = 'style="color: #840;"'
    s = s.replace('&', '&').replace('<', &'<').replace('>', '>')   
    ls = []
    i = 0
    for mStr in set(re.findall(r'`[\s\S]+?`', s)): 
        newFstr = mStr
        for val in set(re.findall(r"\$\{[\s\S]+?\}", mStr)):
            ls.append([f'<span {darkRed}>{val}</span>', val])
            newFstr =newFstr.replace(val, f'<{i}>')
            i += 1
        s = s.replace(mStr, newFstr)
        
    s = oneRe(r'`[\s\S]+?`', s, green, ls, multiColor=True) 
    s = oneRe(r"'[\s\S]*?'", s, green, ls, multiColor=False) 
    s = oneRe(r'"[\s\S]*?"', s, green, ls, multiColor=False) 
    s = oneRe(r'/[\s\S].*?/g\b', s, green, ls, multiColor=False) 
    s = oneRe(r'/[\s\S].*?/\.', s, green, ls, multiColor=False) 
    s = oneRe(r'/\*[\s\S]+?\*/', s, comm, ls, multiColor=False) 
    s = oneRe(r'//[\s\S]*?\n', s, comm, ls, multiColor=False) 
    i = len(ls)
    
    for c in ['new', 'JSON', 'Promise', 'then', 'catch', 'let', 'const', 'var', 'true', 'false', 'class', 'from', 'import', 'set', 'list', 'for', 'in', 'if', 'else', 'return', 'null']:
        ls.append([f'<span {blue}>{c}</span>',0])
        s = re.sub (r'\b%s\b' % c, f'<{i}>', s)
        i += 1
    
    for c in ['window', 'doc', 'cmd', 'init','init2', 'recalc', 'hide', 'readOnly', 'validate']:
        ls.append([f'<span {darkRed}>{c}</span>',0])
        s = re.sub (r'\b%s\b' % c, f'<{i}>', s)
        i += 1
    s = operColor(s, ls, darkBlue) 
    for j in range(len(ls), 0, -1):  
        s = s.replace(f'<{j-1}>', ls[j-1][0])
    return f'<div {black}>{s}</div>'