HTML рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд░рдВрдЧ рдЧреНрд░рдВрдереЛрдВ

рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдкрд╛рда рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЖрдк рдпрд╣рд╛рдБ рд╣реИрдмрд░ рдкрд░ рдкрд╛рда рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдиреЛрдЯрдкреИрдб ++ рдпрд╛ рдПрдЯрдо рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдПрдХ рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдпрд╣ 1 рдкрд╛рда рд╣реИред рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд╛рда рд╣реИрдВ, рддреЛ рдореИрдВ html рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкрд╛рда рдЯреБрдХрдбрд╝реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрдЬрдЧрд░ рдкрд░, рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ (рдкреНрд░рддрд┐ рд░рдВрдЧ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ)ред



рдпрджрд┐ рдЖрдк рдкрд╛рдпрдерди рдФрд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИрдВред рдХреИрдЯреЛрдо рдХреЗ рддрд╣рдд рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдгред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рдВрдЧ рдХреЛрдб рд╕реНрд░реЛрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкрд╛рда рдорд╛рд░реНрдХрдЕрдк


рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

def jsToHtml(s):

рдЗрдирдкреБрдЯ рдкрд░, рд╕реНрд░реЛрдд рдкрд╛рда html рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╣рдо рд╡реИрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдмреНрд▓реЙрдХ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдЕрдзрд┐рдХ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред

comm = 'style="color: red;"' #   
blue = 'style="color: blue;"' # 
...

рдорд╛рд░реНрдХрдЕрдкред

рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдмрдЪрд╛рдирд╛ рд╣реИ 'рдФрд░', '<', '>'

s = s.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')

'&' рдЕрдХреНрд╖рд░ рд╕рдВрдпреЛрдЬрди '& lt;', '& gt; рдФрд░ рдЕрдиреНрдп '& ...';

рдЕрдХреНрд╖рд░ '<' рдФрд░ '>' рдЗрд╕рд▓рд┐рдП рдмрдЪ рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рд░реЛрдз рди рд╣реЛред

рдЖрдк рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдврд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, utf-8 рдореЗрдВ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдорд╛рд░реНрдХрдЕрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо:

  • рд╣рдо рдПрдХ рдкреБрди: рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрд╛рда рдЕрдВрд╢реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред
  • рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдХрд╛рдЯрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдорд╛рд░реНрдХрдЕрдк рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдВрд╢ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдЯреБрдХрдбрд╝реЗ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ (рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдореВрд▓ рдкрд╛рда рдХреЛ рдмрдЪрд╛рдПрдВ: рдпрд╣ рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛)ред
  • рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░, рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдЯрдм рдбрд╛рд▓реЗрдВред
  • рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд░ рд░рдВрдЧ рдХреЗ рд▓рд┐рдПред
  • рдЬрдм рд╕рдм рдХреБрдЫ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд░рдгреА рд╕реЗ рд░рдВрдЧреАрди рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯрдмреНрд╕ рдХреЛ рдмрджрд▓реЗрдВред

рдареВрдВрда рдЕрдиреЛрдЦрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рда рдореЗрдВ рдПрдХ рднреА рд╡рд░реНрдг '<' рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА рдПрдХ '>'ред

рдареВрдВрда рдмрдирд╛рдирд╛:

f'<{i}>'

рдЬрд╣рд╛рдБ рдореИрдВ рдареВрдВрда рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдкрд╛рда рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕реА рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рдЕрдЧрд░ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЕрдВрджрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдареВрдВрда рд╣реИ рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрд░реЛрдд рдкрд╛рда рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рдереАрдВ:

`  :   /*     */ `
/* , `     ` */

рд╡рд┐рдХрд▓реНрдк 2:

  1. рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░рдирд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рджреЛрд╣рд░рд╛ рд░рдВрдЧ рд╣реЛрдЧрд╛ред
  2. рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдЯрдмреНрд╕ рдЦреЛрдЬреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ (рдЕрдЪрд┐рд╣реНрдирд┐рдд) рдЯреЗрдХреНрд╕реНрдЯ рд╕реЗ рдмрджрд▓реЗрдВред

рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рд╕рдм рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдХреЛрдб рдХреА 10 рд▓рд╛рдЗрдиреЗрдВ, рдЯрд┐рдкреНрдкрдгреА рдХреА 10 рд▓рд╛рдЗрдиреЗрдВ):

def oneRe(reStr, s, attr, ls, multiColor=False):
    '''
        s  ,          ls,
           (<0>, <1> ...<1528>...).
          .
    
    reStr - re
    s - 
    attr -  style/class/etc
    ls -   
    multiColor=False,     
    '''
    for block in set(re.findall(reStr, s)):
        toArr = block
        if not multiColor: #  multiColor==False,   
            for prev in set(re.findall(r'<[\d]+>', block)): #  : <0> ... <21>
                iPrev = int(prev[1:-1], 10)                #     
                toArr = toArr.replace(prev, ls[iPrev][1])  #   '<0> qwe <21>'  (<0>,<21>)  . 
        ls.append([f'<span {attr}>{toArr}</span>', toArr]) #     ls 2 :     
        s = s.replace(block, f'<{len(ls)-1}>')
    return s

рдпрд╣ рдПрдХ рдбреЗрдореЛ рд╣реИ: рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдорд╛рд░реНрдХрдЕрдк рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрдЪ рдЧрдП рд╡рд░реНрдг (\ ', \ ") рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн: рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐:

s = s.replace(/A + B/g, 'A - B');

рдиреЛрдЯрдкреИрдб ++ рдФрд░ рдПрдЯрдо рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рдВрдЧ рд╣реИрдВред

рдЕрдм рдЬрдмрдХрд┐ рд╡рди-рд░реА рд╣реИ , рд░рдВрдЧ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдмрд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдПрдкреЛрд╕реНрдЯреНрд░реЛрдл рдФрд░ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд░реЗрдЦрд╛рдУрдВ рдХреЛ рд░рдВрдЧрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

s = oneRe(r"'[\s\S]*?'", s, green, ls, multiColor=False) #    ''   ls
s = oneRe(r'"[\s\S]*?"', s, green, ls, multiColor=False) #    ""   ls

рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд░рдВрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдорд▓реНрдЯреА-рд▓рд╛рдЗрдиреНрд╕ рдореЗрдВ рдХрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП js рдЪрд╛рд╣рд┐рдП
`    ${A + B}  ${A - B}`


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) #    ``   ls

рдкрд╣рд▓реЗ рд╣рдо рдмрд╣реБ-

рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдвреВрдБрдврддреЗ рд╣реИрдВ : re.findall (r`` [\ s \ S] +? '', s) рдмреИрдХрдХреНрд╡рд╛рдЯрд░ рд╡рд░реНрдгреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рда рдХреЗ рдмреНрд▓реЙрдХ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рдпрд╛ рддреЛ рд╕реНрдкреЗрд╕ рдпрд╛ рдиреЙрди-рд╕реНрдкреЗрд╕ ([\ _ s] рдпрд╛рдиреА рдХреБрдЫ рднреА рд╣реЛрддрд╛ рд╣реИ)ред

рдмреНрд▓реЙрдХ рд▓рдВрдмрд╛рдИ 1 рдпрд╛ рдЕрдзрд┐рдХ (+)ред

рдмрд┐рдирд╛ рд▓рд╛рд▓рдЪ ("?" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ "` "рдХреЛрдИ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рд╣реИ)ред

рдкрд╛рдП рдЧрдП рдмреНрд▓реЙрдХ ( mStr рд╡реИрд░рд┐рдПрдмрд▓ ) рдХреЛ newFstr рд╡реИрд░рд┐рдПрдмрд▓ рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ ред
рд╣рдо рднрд╛рд╡ $ {...} рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ рд╕рдмрдмреНрд▓реЙрдХ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВред

re.findall (r "\ $ \ {{\ _ s \ S] *? \}", mStr) рдРрд╕реЗ рдЙрдк-рдЦрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рд╣рдо рдорд╛рд░реНрд╕ рдХреЛ ls рдПрд░реЗ рдореЗрдВ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдм-рдмреНрд▓реЙрдХ рдХреЛ рдирдП рдлреЙрд░реЗрд╕реНрдЯ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕реНрдЯрдм рд╕реЗ рд░рд┐рдкреНрд▓реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ ред
рдЬрдм рд╕рдм-рдмреНрд▓реЙрдХ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ s рдореЗрдВ рдмрджрд▓реЗрдВрдирдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдмреНрд▓реЙрдХ рдореВрд▓реНрдпред

рд╕реЗрдЯ рд╕рддрд╣реА рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдлрд╛рдЗрдВрдбрд▓ рдХрдИ рд╕рдорд╛рди рдмреНрд▓реЙрдХ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд╕рдорд╛рди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕реНрдЯрдмреНрд╕ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╕рдорд╛рди рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдЕрдм рд╕реНрд░реЛрдд рдкрд╛рда рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕реЗрдЯ рд╕реЗ рджреЛрд╣рд░рд╛рд╡ рджреВрд░ рд╣реЛрддрд╛ рд╣реИред

JsToHtml.py рдлрд╝рд╛рдЗрд▓
# -*- coding: utf-8 -*- 
'''
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: #  multiColor==False,   
            for prev in set(re.findall(r'<[\d]+>', block)): #  : <0> ... <21>
                iPrev = int(prev[1:-1], 10)                 #     
                toArr = toArr.replace(prev, ls[iPrev][1])   #   '<0> qwe <21>'  (<0>,<21>)  . 
        ls.append([f'<span {attr}>{toArr}</span>', toArr])  #     ls 2 :     
        s = s.replace(block, f'<{i}>')              #       
        i += 1
    return s

# *** *** ***

def operColor(s, ls, color):
    '''
     .
      ,       ,  
    '''
    i = len(ls)
    for c in ['&lt;=', '&gt;=', '=&lt;', '=&gt;', '&lt;', '&gt;', '&amp;&amp;', '&amp;',
              '===', '!==', '==', '!=', '+=', '-=', '++', '--', '||']:
        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('&', '&amp;').replace('<', &'&lt;').replace('>', '&gt;')   #   '&', '<', '>'

    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) #    ``   ls
    s = oneRe(r"'[\s\S]*?'", s, green, ls, multiColor=False) #    ''   ls
    s = oneRe(r'"[\s\S]*?"', s, green, ls, multiColor=False) #    ""   ls
    s = oneRe(r'/[\s\S].*?/g\b', s, green, ls, multiColor=False) #    re-   ls
    s = oneRe(r'/[\s\S].*?/\.', s, green, ls, multiColor=False) #    re-   ls
    s = oneRe(r'/\*[\s\S]+?\*/', s, comm, ls, multiColor=False) #    /*  */   ls (  - )
    s = oneRe(r'//[\s\S]*?\n', s, comm, ls, multiColor=False) #    //    ls (  - )

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

# *** *** ***


рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдПрдЪ.рдЯреА.рдПрдо.рдПрд▓.


HTML рдХреЛ React рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ htmltoreact.com рдкрд░ рдХрдиреНрд╡рд░реНрдЯ рдХрд░реЗрдВ ред GitHub рдХрд╛ рд▓рд┐рдВрдХ рднреА рд╣реИред

рдпрд╣ рдореБрдЭреЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдореИрдВ рдЗрд╕ рдЪрдорддреНрдХрд╛рд░ рдХреЛ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХреИрд╕реЗ рдЦреАрдВрдЪреВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд▓рд┐рдЦрд╛ред

Lxml рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (pip install lxml рдпрд╛ pip3 install lxml)ред

рд╣рдо рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:

from xml.dom.minidom import parseString
from lxml import html, etree

HTML рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ xhtml рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯ рдХрд░реЗрдВред рдпрд╣ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдЯреИрдЧ рдмрдВрдж рд╣реИрдВред

doc = html.fromstring(htmlText)
ht = etree.tostring(doc, encoding='utf-8').decode()

рдорд┐рдиреА рдШрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреНрд░реА рд╣рд╛рдЙрд╕ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдПрдХреНрд╕рдПрдЪрдЯреАрдПрдордПрд▓ рдкрд╛рд░рд╕реАрдоред

dom = parseString(ht)

рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкреБрди: рдиреЛрдбреНрд╕ рдкрд░ рдХреВрджрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

ParseString рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдбреЛрдо рдЯреНрд░реА рдПрдХ рдбреИрдб рдиреЛрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдЪреНрдЪреЗ рдиреЛрдбреНрд╕ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрдЪреНрдЪреЗ рд╣реИрдВ, рдЖрджрд┐ред

рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ:

  • рдиреЛрдбрдиреЗрдо - рдиреЛрдб рдирд╛рдо, рд╕реНрдЯреНрд░рд┐рдВрдЧ
  • childNodes - рдмрдЪреНрдЪреЗ рдиреЛрдбреНрд╕, рд╕реВрдЪреА
  • рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ- рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ, рд╢рдмреНрджрдХреЛрд╢
  • #Text рдирд╛рдордХ рдиреЛрдб рдореЗрдВ рдиреЛрдбрд╡реИрд▓реНрдпреВ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рд╣реЛрддрд╛ рд╣реИ

рдЙрджрд╛рд╣рд░рдг:

<div class="A" style="color: red;">Red of course,<br> </div>

рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
{ 'nodeName':'div',
  'attributes': {'style': 'color: red;', 'class': 'A'},
  'childNodes': [
    {'nodeName':'#text', 'nodeValue': 'Red of course,'},
    {'nodeName':'br'},
    {'nodeName':'#text', 'nodeValue': ''},
  ],
}

рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдбреЛрдо рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рд╡рд╣рд╛рдБ рдПрдХ рдкреНрд░рд┐рдВрдЯ рд╣реИ), рдЬрдм рд░рд┐рдПрдХреНрдЯ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдХреНрд▓рд╛рд╕ рдХреЛ рдХреНрд▓рд╛рд╕рдиреЗрдо рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ред

рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдбреНрд╕ рдореЗрдВ, '{', '}', '<', '>' рдмрдЪ рдЬрд╛рддреЗ рд╣реИрдВред

HtmlToReact.py рдлрд╝рд╛рдЗрд▓
# -*- coding: utf-8 -*- 
# -*- coding: utf-8 -*- 

from xml.dom.minidom import parseString
from lxml import html, etree

# *** *** ***

_react = ''

def htmlToReact(buf):
    '''
    buf - html-
     ReactJS- 
    '''
    global _react
    _react = ''

    try:
        r = re.search('<[\\s\\S]+>', buf)
        if r:
            doc = html.fromstring(r.group(0))
            ht = etree.tostring(doc, encoding='utf-8').decode()
            xHtmlToReact(parseString(ht).childNodes[0], '')
            return _react
        else:
            return '<empty/>'
    except Exception as ex:
        s = f'htmlToReact: \n{ex}'
        print(s)
        return s

# *** *** ***

def sU(a, c):
    '''
    xlink:show   ->  xlinkShow
    font-weight  ->  fontWeight
    '''
    l, _, r = a.partition(c)
    return ( (l + r[0].upper() + r[1:]) if r else a).strip()

# *** *** ***

def xHtmlToReact(n, shift='\n    '):
    '''
       -
      ,        upperCase
       global  _react
    '''
    global _react

    if n.nodeName.lower() in ['head', 'script']:
        return
    
    _react += shift + '<' + n.nodeName.lower()
    if n.attributes:
        for k, v in n.attributes.items():
            if k == 'style':
                style = ''
                for s in v.split(';'):
                    if s.strip():
                        l, _, r = s.partition(':')
                        style += f'''{sU(l, '-')}: "{r.strip()}", '''
                if style:
                    _react += ' style={{' + style + '}}'
            elif k == 'class':
                _react += f' className="{v}"'
            else:
                kk = k.replace('xlink:href', 'href') # deprcated
                _react += f''' {sU( sU(kk, ':'), '-' )}="{v}"'''
        
    _react += '>'
    if n.childNodes:
        for child in n.childNodes:
            if  child.nodeName == '#text':
                tx = child.nodeValue
                for x in ['{', '}', '<', '>']:
                    tx = tx.replace(x, '{"' + x + '"_{_')
                tx = tx.replace('_{_', '}')
                if tx[-1] == ' ':
                    tx = tx[:-1] + '\xa0'
                _react += tx.replace('\n', '<br/>')
            else:
                xHtmlToReact(child)
                
    _react += f'{shift}</{n.nodeName.lower()}>'

# *** *** ***



рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБред

рдкреАрдПрд╕ рдСрди рд╣реЛрдмреЗ рдиреЗ рдкрд╛рдпрдерди рдХреЛрдб (рдФрд░ рд╢рд╛рдпрдж рдЕрдиреНрдп) рдХрд╛ рд░рдВрдЧ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЕрдЬрдЧрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ & amp; , рдпрд╣ & рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд╡реАрдХ рдХрд┐рдпрд╛ред рдпрджрд┐ рд╣реЗрдмреНрд░рд╛ рдЧрд▓рддреА рд╕реБрдзрд╛рд░рддрд╛ рд╣реИ, рддреЛ рдореЗрд░реЗ рдЧреНрд░рдВрде рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдкрд╛рд░ рдХрд░ рдЬрд╛рдПрдВрдЧреЗред

All Articles