рд╢рд╛рдо рдХреЗ рд▓рд┐рдП рдкрд╛рда: рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реБрдИ рдХрд┐ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛ рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдкрд╣рд▓реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рд╡рд╣рд╛рдБ рд╕рдм рдХреБрдЫ рдмреЗрддрд╣рд╛рд╢рд╛ рдЬрдЯрд┐рд▓ рдерд╛ - рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡реГрдХреНрд╖, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд░реАрдм рдирд┐рд░реАрдХреНрд╖рдг рдкрд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рд╕рднреА рдХрд╛рдо рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдкреАрдЫреЗ рдФрд░ рдкреАрдЫреЗ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рд▓рдЧрднрдЧ рдХрднреА рднреА рдкрд░рд┐рдгрд╛рдореА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдбреЗрдореЛ рдкреЗрдЬ: рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░


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

let a = '"\'"'; 

рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддреН, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдиреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред

рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ


рд╣рдо рд░рд╛рдЬреНрдп рдЪрд░ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд░рдВрдЧ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдХреЗ рдЗрд╕ рдпрд╛ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд░рдВрдЧреАрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреАрд╡рд░реНрдб рдХреА рд╕реВрдЪреА (рдЬрд┐рд╕реЗ рднреА рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):

рдХреЙрдиреНрд╕реНрдЯ рд╕реНрдЯреЗрдЯреНрд╕ = {...
 const states = { NONE : 0, SINGLE_QUOTE : 1, // 'string' DOUBLE_QUOTE : 2, // "string" ML_QUOTE : 3, // `string` REGEX_LITERAL : 4, // /regex/ SL_COMMENT : 5, // // single line comment ML_COMMENT : 6, // /* multiline comment */ NUMBER_LITERAL : 7, // 123 KEYWORD : 8 // function, var etc. }; const colors = { NONE : '#000', SINGLE_QUOTE : '#aaa', // 'string' DOUBLE_QUOTE : '#aaa', // "string" ML_QUOTE : '#aaa', // `string` REGEX_LITERAL : '#707', // /regex/ SL_COMMENT : '#0a0', // // single line comment ML_COMMENT : '#0a0', // /* multiline comment */ NUMBER_LITERAL : '#a00', // 123 KEYWORD : '#00a', // function, var etc. OPERATOR : '#07f' // null, true etc. }; const keywords = 'async|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|of|package|private|protected|public|return|set|static|super|switch|throw|try|typeof|var|void|while|with|yield|catch|finally'.split('|'); 


рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рд▓реЗрдЧрд╛ рдФрд░ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд 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]; //     } return output; } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░реЗрдВ: рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдФрд░ рдорд▓реНрдЯреА-рд▓рд╛рдЗрдиред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдФрд░ рдЕрдЧрд▓рд╛ рд╡рд░реНрдг рд╕реНрд▓реИрд╢ рд╣реИ, рдФрд░ рд╡реЗ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реИрдВ ( рд╕реНрдерд┐рддрд┐ 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--; //        if ('+/-*=|&<>%,({[?:;'.indexOf(code[i+j]) != -1) break; //   ;   -   if (!/[0-9a-z$_]/i.test(code[i+j]) && word.length > 0) break; //  ,     if (/[0-9a-z$_]/i.test(code[i+j])) word = code[i+j] + word; //   - ,     if (')]}'.indexOf(code[i+j]) != -1) { isRegex = false; break; } } //      -    //  : return /test/g - , plainWord /test/g -  if (word.length > 0 && !keywords.includes(word)) isRegex = false; if (isRegex) { state = states.REGEX_LITERAL; output += '<span style="color: ' + colors.REGEX_LITERAL + '">' + char; continue; } } 

рдпрджреНрдпрдкрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рджреЛрд╖реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рднреА рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдпрджрд┐ (рдП) / рд░реЗрдЧреЗрдХреНрд╕ / рдпрд╛ рддреЛ: 1 / / рд░реЗрдЧреЗрдХреНрд╕ / / 2 ред рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ regexp рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрддреА рд╣реИ - рдпрд╣ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рд╣реИ; рдбрд┐рдЬрд╛рдЗрди рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд░реЗрдЧреЗрдХреНрд╕рдк рдХрд▓рд░рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд┐рдЬреНрдо.рдЬреЗрдПрд╕ рдореЗрдВ ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, regexps рдХреЗ рд╕рд╣реА рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд░рддреЗ рд╣реИрдВред

рджреВрд╕рд░рд╛ рдмрдЧ рдЬреЛ рдореБрдЭреЗ рдирд┐рдкрдЯрдирд╛ рдерд╛ рд╡рд╣ рдмреИрдХрд╕реНрд▓реИрд╢ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред рдПрдХ рдмрдВрдж рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдХреЛ 'test \\' рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдмреИрдХрд╕реНрд▓реИрд╢ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдереАред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдЬреЛ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ:

 if (state == states.SINGLE_QUOTE && char == '\'' && prev != '\\') 

рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдпрджрд┐ рдмреИрдХрд╕реНрд▓реИрд╢ рдмрдЪ рдЧрдпрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдФрд░ рдмреИрдХрд╕реНрд▓реИрд╢ рд╣реИ), рддреЛ рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред

 const closingCharNotEscaped = prev != '\\' || prev == '\\' && code[i-2] == '\\'; // ... if (state == states.SINGLE_QUOTE && char == '\'' && closingCharNotEscaped) 

рдПрдХ рд╣реА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдбрдмрд▓ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рдЙрджреНрдзрд░рдг рдХреЗ рд╕рд╛рде рддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА regexp рдХреА рдЦреЛрдЬ рдореЗрдВред

рдпрд╣ рд╕рдм рд╣реИ, рдЖрдк рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi482884/


All Articles