Advertisement
12Me21

Highlighter Fix

Dec 10th, 2016
430
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function applySyntaxHighlighting(codeElement)
  2. {
  3.     var text=codeElement.textContent
  4.    
  5.     var list=[]; // each highlightable word is stored as [start_pos,length,classname]
  6.     //add 2nd capture group of matches to list
  7.     function repl(regex,classname)
  8.     {
  9.         while (m=regex.exec(text))
  10.             list.push([m.index+m[1].length,m[2].length,classname]);
  11.     }
  12.    
  13.     //find keywords
  14.     repl(/()(\".*?(?:\"|$))/mgi,"string");
  15.     repl(/(^|[^A-Z@_])(AND|BREAK|CALL|COMMON|CONTINUE|DATA|DEC|DEF|DIM|DIV|ELSE|ELSEIF|END|ENDIF|EXEC|FALSE|FOR|GOSUB|GOTO|IF|INC|INPUT|LINPUT|MOD|NEXT|NOT|ON|OUT|OR|PRINT|READ|REPEAT|RESTORE|RETURN|STEP|STOP|SWAP|THEN|TO|TRUE|UNTIL|USE|VAR|WEND|WHILE|XOR)(?![0-9A-Z_$#%])/mgi,"keyword");
  16.     repl(/(^|[^A-Z@_])(ABS|ACCEL|ACLS|ACOS|ARYOP|ASC|ASIN|ATAN|ATTR|BACKCOLOR|BACKTRACE|BEEP|BGANIM|BGCHK|BGCLIP|BGCLR|BGCOLOR|BGCOORD|BGCOPY|BGFILL|BGFUNC|BGGET|BGHIDE|BGHOME|BGLOAD|BGMCHK|BGMCLEAR|BGMCONT|BGMPAUSE|BGMPLAY|BGMPRG|BGMPRGA|BGMSET|BGMSETD|BGMSTOP|BGMVAR|BGMVOL|BGOFS|BGPAGE|BGPUT|BGROT|BGSAVE|BGSCALE|BGSCREEN|BGSHOW|BGSTART|BGSTOP|BGVAR|BIN\$|BIQUAD|BREPEAT|BQPARAM|BUTTON|CALLIDX|CEIL|CHKCALL|CHKCHR|CHKFILE|CHKLABEL|CHKVAR|CHK\$|CLASSIFY|CLIPBOARD|CLS|COLOR|COPY|COS|COSH|CSRX|CSRY|CSRZ|DATE\$|DEG|DELETE|DIALOG|DISPLAY|DLCOPEN|DTREAD|EFCOFF|EFCON|EFCSET|EFCWET|ERRNUM|ERRLINE|ERRPRG|EXP|EXTFEATURE|FADE|FADECHK|FFT|FFTWFN|FILL|FILES|FLOOR|FONTDEF|FORMAT\$|FREEMEM|GBOX|GCIRCLE|GCLIP|GCLS|GCOLOR|GCOPY|GFILL|GLINE|GLOAD|GOFS|GPAGE|GPAINT|GPRIO|GPSET|GPUTCHR|GSAVE|GSPOIT|GTRI|GYROA|GYROV|GYROSYNC|HARDWARE|HEX\$|IFFT|INKEY\$|INSTR|KEY|LEFT\$|LEN|LOAD|LOCATE|LOG|MAINCNT|MAX|MICDATA|MICPOS|MICSAVE|MICSIZE|MICSTART|MICSTOP|MID\$|MILLISEC|MIN|MPCOUNT|MPEND|MPGET|MPHOST|MPLOCAL|MPNAME\$|MPRECV|MPSEND|MPSET|MPSTART|MPSTAT|OPTION|PCMCONT|PCMPOS|PCMSTOP|PCMSTREAM|PCMVOL|POW|POP|PRGDEL|PRGEDIT|PRGGET\$|PRGINS|PRGNAME\$|PRGSET|PRGSIZE|PRGSLOT|PROJECT|PUSH|RAD|RANDOMIZE|RENAME|RESULT|RGB|RGBREAD|RIGHT\$|RINGCOPY|RND|RNDF|ROUND|RSORT|SAVE|SCROLL|SGN|SHIFT|SIN|SINH|SNDSTOP|SORT|SPANIM|SPCHK|SPCHR|SPCLIP|SPCLR|SPCOL|SPCOLOR|SPCOLVEC|SPDEF|SPFUNC|SPHIDE|SPHITINFO|SPHITRC|SPHITSP|SPHOME|SPLINK|SPOFS|SPPAGE|SPROT|SPSCALE|SPSET|SPSHOW|SPSTART|SPSTOP|SPUSED|SPUNLINK|SPVAR|SQR|STICK|STICKEX|STR\$|SUBST\$|SYSBEEP|TABSTEP|TALK|TALKCHK|TALKSTOP|TAN|TANH|TIME\$|TMREAD|TOUCH|UNSHIFT|VAL|VERSON|VISIBLE|VSYNC|WAIT|WAVSET|WAVSETA|WIDTH|XOFF|XON|XSCREEN)(?![0-9A-Z_$#%])/mgi,"function");
  17.     repl(/(^|[^A-Z0-9])((?:-?(?:(?:\d*\.(?:\d+(?:E-?\d+)?)?)|(?:\d+(?:E-?\d+)?))#?|&H[\dA-F]+|&B[01]+|#[A-Z\d]+))(?!E)/mgi,"number");
  18.     repl(/()(@[0-9A-Z_]*)/mgi,"label");
  19.     repl(/()('.*$)/mgi,"comment");
  20.  
  21.     list=list.sort(function(a,b){return a[0]>b[0]?1:-1}); //sort list by start positions   
  22.    
  23.     text=text.replace(/</g,"\0");//remove < to stop html injection
  24.    
  25.     var pos=0,output="";
  26.     for(var i=0;i<list.length;i++)
  27.     {
  28.         if (list[i][0]>=pos) //only highlight if it's past the end of the previous keyword
  29.         {
  30.             start=list[i][0];
  31.             end=start+list[i][1]-1;
  32.             output+=text.substring(pos,start)+ //text before keyword
  33.             "<span class='"+list[i][2]+"'>"+ //tag
  34.             text.substring(start,end+1)+ //keyword
  35.             "</span>"; //closing tag
  36.             pos=end+1;
  37.         }
  38.     }
  39.     output+=text.substring(pos); //text after last keyword
  40.    
  41.     codeElement.innerHTML=output.replace(/\0/g,"&lt;"); //add escaped <'s
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement