'''
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>'