рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реБрдИ рдХрд┐ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛ рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдкрд╣рд▓реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рд╡рд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдмреЗрддрд╣рд╛рд╢рд╛ рдЬрдЯрд┐рд▓ рдерд╛ - рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд░реАрдм рдирд┐рд░реАрдХреНрд╖рдг рдкрд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╕рднреА рдХрд╛рдо рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдкреАрдЫреЗ рдФрд░ рдкреАрдЫреЗ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд▓рдЧрднрдЧ рдХрднреА рднреА рдкрд░рд┐рдгрд╛рдореА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдбреЗрдореЛ рдкреЗрдЬ:
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░
рд╣рдо
рд░рд╛рдЬреНрдп рдХреЗ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдХреЛрдб рдореЗрдВ рд╣реИрдВред рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд░рд╛рдЬреНрдп рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдПрдХрд▓ рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдВрджрд░ рд╣реИрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рдорд╛рдкрди рдЙрджреНрдзрд░рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧреА рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдЧреАред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, regexp рдФрд░ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдмрд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛
рд░рд╛рдЬреНрдп рдореВрд▓реНрдп рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдЙрджреНрдШрд╛рдЯрди рдФрд░ рд╕рдорд╛рдкрди рд╡рд░реНрдг рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ; рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдПрдХ рдХреЛрдб:
let a = '"\'"';
рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддреН, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдиреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред
рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ
рд╣рдо рд░рд╛рдЬреНрдп рдЪрд░ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд░рдВрдЧ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдХреЗ рдЗрд╕ рдпрд╛ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд░рдВрдЧреАрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреАрд╡рд░реНрдб рдХреА рд╕реВрдЪреА (рдЬрд┐рд╕реЗ рднреА рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):
рдХреЙрдиреНрд╕реНрдЯ рд╕реНрдЯреЗрдЯреНрд╕ = {... const states = { NONE : 0, SINGLE_QUOTE : 1,
рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рд▓реЗрдЧрд╛ рдФрд░ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд HTML рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгреЛрдВ рдХреЛ рд╡рд░реНрдг рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд░рдВрдЧ рдХреЗ рд╕рд╛рде SPAN рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдПрдЧрд╛ред
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЪрдХреНрд░ рд╣реЛрдЧрд╛, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рдЦреБрд▓рдиреЗ / рдмрдВрдж рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдПрд╕рдкреАрдПрдПрди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
function highlight(code) { let output = ''; let state = states.NONE; for (let i = 0; i < code.length; i++) { let char = code[i], prev = code[i-1], next = code[i+1];
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдВ: рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдФрд░ рдорд▓реНрдЯреА-рд▓рд╛рдЗрдиред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдФрд░ рдЕрдЧрд▓рд╛ рд╡рд░реНрдг рд╕реНрд▓реИрд╢ рд╣реИ, рдФрд░ рд╡реЗ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реИрдВ (
рд╕реНрдерд┐рддрд┐ 0 рд╣реИ,
рдЕрд░реНрдерд╛рдд ,
рд╕реНрдЯреЗрдЯреНрд╕ред рдХреЛрдИ рднреА рдирд╣реАрдВ ), рддреЛ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╢реБрд░реБрдЖрдд рд╣реИред
рд░рд╛рдЬреНрдп рдмрджрд▓реЗрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд░рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдкреИрди рдЦреЛрд▓реЗрдВ:
if (state == states.NONE && char == '/' && next == '/') { state = states.SL_COMMENT; output += '<span style="color: ' + colors.SL_COMMENT + '">' + char; continue; }
рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдВрдЪ рдХрд╛рдо рди рдХрд░реЗрдВ рдФрд░ рд╕рдВрдШрд░реНрд╖ рди рд╣реЛред
рдЕрдЧрд▓рд╛, рд╣рдо рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ: рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдг рдПрдХ рдкрдВрдХреНрддрд┐ рд╡рд┐рд░рд╛рдо рд╣реИ рдФрд░
рд░рд╛рдЬреНрдп рдореЗрдВ рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рддреЛ SPAN рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░
рд░рд╛рдЬреНрдп рдХреЛ рд╢реВрдиреНрдп рдореЗрдВ рдмрджрд▓реЗрдВ:
if (state == states.SL_COMMENT && char == '\n') { state = states.NONE; output += char + '</span>'; continue; }
рдЗрд╕реА рддрд░рд╣, рд╣рдо рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ, рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛ рд░рд╣реЗ рд╡рд░реНрдг рдЕрд▓рдЧ рд╣реИрдВ:
if (state == states.NONE && char == '/' && next == '*') { state = states.ML_COMMENT; output += '<span style="color: ' + colors.ML_COMMENT + '">' + char; continue; } if (state == states.ML_COMMENT && char == '/' && prev == '*') { state = states.NONE; output += char + '</span>'; continue; }
рддрд╛рд░реЛрдВ рдХрд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдорд╛рдкрди рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдХреЛ рдмреИрдХрд╕реНрд▓реИрд╢ рдХреЗ рд╕рд╛рде рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рдкрди рд╕реНрд▓реИрд╢ рд╣реИред
if (state == states.NONE && char == '\'') { state = states.SINGLE_QUOTE; output += '<span style="color: ' + colors.SINGLE_QUOTE + '">' + char; continue; } if (state == states.SINGLE_QUOTE && char == '\'' && prev != '\\') { state = states.NONE; output += char + '</span>'; continue; }
рдХреЛрдб рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдКрдкрд░ рдерд╛, рдХреЗрд╡рд▓ рдЕрдм рд╣рдо рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдХреЛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрджреНрдзрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдмреИрдХрд╕реНрд▓реИрд╢ рдерд╛ред
рдбрдмрд▓-рдЙрджреНрдзреГрдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЪрд┐рддреНрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд░рдЦреВрдБрдЧрд╛ред
рдЕрдЧрд░ (рд░рд╛рдЬреНрдп == рд╕реНрдЯреЗрдЯреНрд╕ред рдХреЛрдИ рдФрд░& рдЪрд╛рд░ == '' '') {... if (state == states.NONE && char == '"') { state = states.DOUBLE_QUOTE; output += '<span style="color: ' + colors.DOUBLE_QUOTE + '">' + char; continue; } if (state == states.DOUBLE_QUOTE && char == '"' && prev != '\\') { state = states.NONE; output += char + '</span>'; continue; } if (state == states.NONE && char == '`') { state = states.ML_QUOTE; output += '<span style="color: ' + colors.ML_QUOTE + '">' + char; continue; } if (state == states.ML_QUOTE && char == '`' && prev != '\\') { state = states.NONE; output += char + '</span>'; continue; }
Regexp рд╢рд╛рдмреНрджрд┐рдХ, рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рд╣реИрдВ, рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реИрдВред рд╣рдо рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд▓реМрдЯ рдЖрдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде regexps рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВред
if (state == states.NONE && char == '/') { state = states.REGEX_LITERAL; output += '<span style="color: ' + colors.REGEX_LITERAL + '">' + char; continue; } if (state == states.REGEX_LITERAL && char == '/' && prev != '\\') { state = states.NONE; output += char + '</span>'; continue; }
рдпрд╣ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд 1-2 рдкрд╛рддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╡реЗ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░рдЪрдирд╛ рдореЗрдВ рдЕрдХреНрд╖рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (
0xFF ,
123n )ред
if (state == states.NONE && /[0-9]/.test(char) && !/[0-9a-z$_]/i.test(prev)) { state = states.NUMBER_LITERAL; output += '<span style="color: ' + colors.NUMBER_LITERAL + '">' + char; continue; } if (state == states.NUMBER_LITERAL && !/[0-9a-fnx]/i.test(char)) { state = states.NONE; output += '</span>' }
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдкрд┐рдЫрд▓реЗ рд╡рд░реНрдг рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдЕрдХреНрд╖рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЪрд░ рдирд╛рдореЛрдВ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреИрд╕реЗ рд╣реА рд╡рд░реНрддрдорд╛рди рдЪрд░рд┐рддреНрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдПрдХ рдЕрдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, SPAN рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░
рд░рд╛рдЬреНрдп рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рд╢рдмреНрджреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдХреАрд╡рд░реНрдб рдХреА рдЦреЛрдЬ рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЖрдЧреЗ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЪрд░рд┐рддреНрд░ рдХреАрд╡рд░реНрдб рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред
if (state == states.NONE && !/[a-z0-9$_]/i.test(prev)) { let word = '', j = 0; while (code[i + j] && /[az]/i.test(code[i + j])) { word += code[i + j]; j++; } if (keywords.includes(word)) { state = states.KEYWORD; output += '<span style="color: ' + colors.KEYWORD + '">'; } }
рдпрд╣рд╛рдБ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдкрд┐рдЫрд▓рд╛ рд╡рд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдирд╛рдо рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдХреАрд╡рд░реНрдб рд╢рдмреНрдж
рдЖрдЙрдЯрд▓реЗрдЯ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддрдм рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╕рдВрднрд╡ рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╢рдмреНрдж рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдЧреИрд░-рд╡рд░реНрдгрдирд╛рддреНрдордХ рдЪрд░рд┐рддреНрд░ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рд╛рдкреНрдд рд╢рдмреНрдж
рдХреАрд╡рд░реНрдб рд╕рд░рдгреА рдореЗрдВ рд╣реИ, рддреЛ SPAN рдЦреЛрд▓реЗрдВ рдФрд░ рд╢рдмреНрдж рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдЬреИрд╕реЗ рд╣реА рдПрдХ рдЧреИрд░-рдЕрдХреНрд╖рд░ рд╡рд░реНрдг рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╢рдмреНрдж рдХрд╛ рдЕрдВрдд - рддрджрдиреБрд╕рд╛рд░, SPAN рдХреЛ рдмрдВрдж рдХрд░реЗрдВ:
if (state == states.KEYWORD && !/[az]/i.test(char)) { state = states.NONE; output += '</span>'; }
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрд╛рдд рдмрдиреА рд╣реБрдИ рд╣реИ - рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдореБрдЦреНрдп рдЖрдХрд░реНрд╖рдг, рдпрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рдЙрди рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
if (state == states.NONE && '+-/*=&|%!<>?:'.indexOf(char) != -1) { output += '<span style="color: ' + colors.OPERATOR + '">' + char + '</span>'; continue; }
рд▓реВрдк рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрджрд┐
рдЬрд╛рд░реА рд░рд╣рдиреЗ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд╛рд░рдг рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡рд░реНрдг рдХреЛ рдкрд░рд┐рдгрд╛рдореА рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЬрдм рд╢рд╛рдмреНрджрд┐рдХ рдпрд╛ рдХреАрд╡рд░реНрдб рдХреА рд╢реБрд░реБрдЖрдд рдпрд╛ рдЕрдВрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд░рдВрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдкреИрди рдХреЛ рдЦреЛрд▓рддреЗ / рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ; рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд▓рд╛рдЗрди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреБрд▓реА рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдг рдлреЗрдВрдХрддреЗ рд╣реИрдВред рдпрд╣ рдЙрджреНрдШрд╛рдЯрди рдХреЛрдг рдХреЛрд╖реНрдардХ рдХреЛ рдкрд░рд┐рд░рдХреНрд╖рдг рдХреЗ рд▓рд╛рдпрдХ рднреА рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╡реЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
output += char.replace('<', '&' + 'lt;');
рдмрдЧ рдареАрдХ рдХрд░рдирд╛
рд╕рдм рдХреБрдЫ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдФрд░ рд╡реНрдпрд░реНрде рдирд╣реАрдВ: рдЕрдзрд┐рдХ рдЧрд╣рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде, рдРрд╕реЗ рдорд╛рдорд▓реЗ рдереЗ рдЬрд╣рд╛рдВ рдмреИрдХрд▓рд╛рдЗрдЯ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред
рд╡рд┐рднрд╛рдЬрди рдХреЛ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реИ, рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реЗрдХреНрд╕рдПрдХреНрд╕рдк рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд╣рдо рдЪрд░ рдХреЛ
isegex = true рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо "рд╕рд╛рдмрд┐рдд" рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ regexp рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдЪрд┐рдиреНрд╣ рд╣реИред рдбрд┐рд╡реАрдЬрди рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдХреАрд╡рд░реНрдб рдпрд╛ рдмреНрд░реИрдХреЗрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрд▓реИрд╢ рдХрд╛ рд╕рд╛рдордирд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдерд╛ if (state == states.NONE && char == '/') { state = states.REGEX_LITERAL; output += '<span style="color: ' + colors.REGEX_LITERAL + '">' + char; continue; }
if (state == states.NONE && char == '/') { let word = '', j = 0, isRegex = true; while (i + j >= 0) { j--;
рдпрджреНрдпрдкрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рджреЛрд╖реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рднреА рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рдпрджрд┐ (рдП) / рд░реЗрдЧреЗрдХреНрд╕ / рдпрд╛ рддреЛ:
1 / / рд░реЗрдЧреЗрдХреНрд╕ / / 2 ред рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ regexp рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрддреА рд╣реИ - рдпрд╣ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рд╣реИ; рдбрд┐рдЬрд╛рдЗрди рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ
рд░реЗрдЧреЗрдХреНрд╕рдк рдХрд▓рд░рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
рдкреНрд░рд┐рдЬреНрдо.рдЬреЗрдПрд╕ рдореЗрдВ ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, regexps рдХреЗ рд╕рд╣реА рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд░рддреЗ рд╣реИрдВред
рджреВрд╕рд░рд╛ рдмрдЧ рдЬреЛ рдореБрдЭреЗ рдирд┐рдкрдЯрдирд╛ рдерд╛ рд╡рд╣ рдмреИрдХрд╕реНрд▓реИрд╢ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред рдПрдХ рдмрдВрдж рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдХреЛ
'test \\' рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдмреИрдХрд╕реНрд▓реИрд╢ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдереАред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдЬреЛ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ:
if (state == states.SINGLE_QUOTE && char == '\'' && prev != '\\')
рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрджрд┐ рдмреИрдХрд╕реНрд▓реИрд╢ рдмрдЪ рдЧрдпрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдФрд░ рдмреИрдХрд╕реНрд▓реИрд╢ рд╣реИ), рддреЛ рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред
const closingCharNotEscaped = prev != '\\' || prev == '\\' && code[i-2] == '\\';
рдПрдХ рд╣реА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдбрдмрд▓ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде рддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА regexp рдХреА рдЦреЛрдЬ рдореЗрдВред
рдпрд╣ рд╕рдм рд╣реИ, рдЖрдк рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред