Advertisement
12Me21

sbhighlight.js

May 26th, 2017
474
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var applySyntaxHighlighting = (function () {
  2.     "use strict";
  3.    
  4.     //subroutine
  5.     function find(className, regex, code, highlightList) {
  6.         var match;
  7.         //WHY IS THIS NOT A BUILT-IN FUNCTION?
  8.         while (match = regex.exec(code)) {
  9.             highlightList.push({
  10.                 start: match.index,
  11.                 end: match.index + match[0].length,
  12.                 className: className,
  13.                 order: highlightList.length
  14.             });
  15.         }
  16.     }
  17.    
  18.     //escape & and < for setting innerHTML
  19.     function escapeHTML(text) {
  20.         return text.replace(/&/g, "&amp;").replace(/</g, "&lt;");
  21.     }
  22.    
  23.     //main function
  24.     return function (codeElement) {
  25.         var code = codeElement.textContent;
  26.        
  27.         var highlightList = [];
  28.        
  29.         //keyword
  30.         find("keyword", /CONTINUE|RESTORE|ELSEIF|COMMON|LINPUT|REPEAT|RETURN|ENDIF|BREAK|FALSE|GOSUB|INPUT|PRINT|UNTIL|WHILE|CALL(?:[\u0020\t](?:SP|BG))?|DATA|ELSE|EXEC|GOTO|NEXT|READ|STOP|SWAP|THEN|WEND|DEC|DEF|DIM|END|FOR|INC|OUT|REM|USE|VAR|IF|ON/igm, code, highlightList);
  31.         //built-in function or variable
  32.         find("function", /EXTFEATURE|BACKCOLOR|BACKTRACE|CLIPBOARD|PCMSTREAM|RANDOMIZE|SPHITINFO|BGMCLEAR|BGMPAUSE|BGSCREEN|CHKLABEL|CLASSIFY|GYROSYNC|HARDWARE|MICSTART|MILLISEC|PRGNAME\$|RINGCOPY|SPCOLVEC|SPUNLINK|TALKSTOP|BGCOLOR|BGCOORD|BGMCONT|BGMPLAY|BGMPRGA|BGMSETD|BGMSTOP|BGSCALE|BGSTART|BREPEAT|BQPARAM|CALLIDX|CHKCALL|CHKFILE|DISPLAY|DLCOPEN|ERRLINE|FADECHK|FONTDEF|FORMAT\$|FREEMEM|GCIRCLE|GPUTCHR|MAINCNT|MICDATA|MICSAVE|MICSIZE|MICSTOP|MPCOUNT|MPLOCAL|MPNAME\$|MPSTART|PCMCONT|PCMSTOP|PRGEDIT|PRGGET\$|PRGSIZE|PRGSLOT|PROJECT|RGBREAD|SNDSTOP|SPCOLOR|SPHITRC|SPHITSP|SPSCALE|SPSTART|STICKEX|SYSBEEP|TABSTEP|TALKCHK|UNSHIFT|VISIBLE|WAVSETA|XSCREEN|BGANIM|BGCLIP|BGCOPY|BGFILL|BGFUNC|BGHIDE|BGHOME|BGLOAD|BGMCHK|BGMPRG|BGMSET|BGMVAR|BGMVOL|BGPAGE|BGSAVE|BGSHOW|BGSTOP|BIQUAD|BUTTON|CHKCHR|CHKVAR|DELETE|DIALOG|DTREAD|EFCOFF|EFCSET|EFCWET|ERRNUM|ERRPRG|FFTWFN|GCOLOR|GPAINT|GSPOIT|INKEY\$|LOCATE|MICPOS|MPHOST|MPRECV|MPSEND|MPSTAT|OPTION([\u0020\t]+(STRICT|DEFINT|TOOL))|PCMPOS|PCMVOL|PRGDEL|PRGINS|PRGSET|RENAME|RESULT|RIGHT\$|SCROLL|SPANIM|SPCLIP|SPFUNC|SPHIDE|SPHOME|SPLINK|SPPAGE|SPSHOW|SPSTOP|SPUSED|SUBST\$|TMREAD|VERSON|WAVSET|ACCEL|ARYOP|BGCHK|BGCLR|BGGET|BGOFS|BGPUT|BGROT|BGVAR|COLOR|DATE\$|EFCON|FILES|FLOOR|GCLIP|GCOPY|GFILL|GLINE|GLOAD|GPAGE|GPRIO|GPSET|GSAVE|GYROA|GYROV|INSTR|LEFT\$|MPEND|MPGET|MPSET|ROUND|RSORT|SHIFT|SPCHK|SPCHR|SPCLR|SPCOL|SPDEF|SPOFS|SPROT|SPSET|SPVAR|STICK|TIME\$|TOUCH|VSYNC|WIDTH|ACLS|ACOS|ASIN|ATAN|ATTR|BEEP|BIN\$|CEIL|CHR\$|COPY|COSH|CSRX|CSRY|CSRZ|FADE|FILL|GBOX|GCLS|GOFS|GTRI|HEX\$|IFFT|LOAD|MID\$|PUSH|RNDF|SAVE|SINH|SORT|STR\$|TALK|TANH|WAIT|XOFF([\u0020\t]+(?:MOTION|MIC|EXPAD|EXKB))?|ABS|ASC|CLS|COS|DEG|EXP|FFT|KEY|LEN|LOG|MAX|MIN|POW|POP|RAD|RGB|RND|SGN|SIN|SQR|TAN|VAL|XON(?:[\u0020\t](?:MOTION|MIC|EXPAD))?/igm, code, highlightList);
  33.         //separator
  34.         find("separator", /[()\[\]=:;,]|TO|STEP/igm, code, highlightList);
  35.         //user defined function or variable
  36.         find("variable", /[A-Z_]\w*[$%#]?(?:[\u0020\t]*\[[\u0020\t]*\])?/igm, code, highlightList);
  37.         //operator
  38.         find("operator", /[+\-*\/!<>]|DIV|MOD|&&|\|\||<=|>=|==|!=|<<|>>|AND|OR|XOR|NOT/igm, code, highlightList);
  39.         //invalid number
  40.         find(undefined, /(?:\d*\.)?\d+(?=E)/igm, code, highlightList);
  41.         //number "123." and "."
  42.         find("number", /\d*\.#?/igm, code, highlightList);
  43.         //number
  44.         find("number", /(?:\d*\.)?\d+(?:E[+\-]?\d+)?#?|&H[\dA-F]+|&B[01]+/igm, code, highlightList);
  45.         //constant
  46.         find("number", /#(?:BGROT180|BGROT270|SPROT180|SPROT270|TMAGENTA|BGROT90|FUCHSIA|MAGENTA|PVRIGHT|SPROT90|TMAROON|TPURPLE|TROT180|TROT270|TYELLOW|AOPADD|AOPCLP|AOPDIV|AOPLIP|AOPMAD|AOPMUL|AOPSUB|BGREVH|BGREVV|BGROT0|MAROON|PURPLE|PVLEFT|SILVER|SPREVH|SPREVV|SPROT0|SPSHOW|TBLACK|TGREEN|TOLIVE|TROT90|TWHITE|WFBLKM|WFHAMM|WFHANN|WFRECT|YELLOW|BLACK|BQAPF|BQBPF|BQBSF|BQHPF|BQHSF|BQLPF|BQLSF|BQPEQ|CHKUV|CHKXY|GREEN|OLIVE|RIGHT|SPADD|TBLUE|TCYAN|TGRAY|TLIME|TNAVY|TREVH|TREVV|TROT0|TTEAL|WHITE|FALSE|AQUA|BLUE|CHKC|CHKI|CHKR|CHKS|CHKV|CHKZ|CYAN|DOWN|GRAY|LEFT|LIME|NAVY|TEAL|TRED|TRUE|OFF|RED|YES|NO|ON|UP|ZL|ZR|A|B|L|R|X|Y)/igm, code, highlightList);
  47.         //invalid constant
  48.         find(undefined, /#[A-Z0-9]*/igm, code, highlightList);
  49.         //label
  50.         find("label", /@\w+/igm, code, highlightList);
  51.         //invalid label
  52.         find(undefined, /@/igm, code, highlightList);
  53.         //string
  54.         find("string", /"[^"]*?(?:"|$)/igm, code, highlightList);
  55.         //comment
  56.         find("comment", /'[^'\n\r]*/igm, code, highlightList);
  57.        
  58.         highlightList = highlightList.sort(function (a, b) {
  59.             return a.start - b.start || b.end - a.end || a.order - b.order;
  60.         });
  61.        
  62.         //insert highlighting
  63.         var output = "";
  64.         var pos = 0;
  65.         highlightList.forEach(function (highlight) {
  66.             if (highlight.start >= pos) {
  67.                 if (highlight.className) {
  68.                     output +=
  69.                         escapeHTML(code.substring(pos, highlight.start)) +
  70.                         "<span class=\"" + highlight.className + "\">" +
  71.                         escapeHTML(code.substring(highlight.start, highlight.end)) +
  72.                         "</span>";
  73.                 } else {
  74.                     output += escapeHTML(code.substring(pos, highlight.end));
  75.                 }
  76.                 pos = highlight.end;
  77.             }
  78.         });
  79.         output += escapeHTML(code.substring(pos));
  80.        
  81.         codeElement.innerHTML = output;
  82.     };
  83.    
  84. }());
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement