NOTE: Depreciated code.
Below is the source for the syntax highlighting for this site, which I wrote in a night as a lightweight system for highlighting bits of code. It’s by no means complete, but I’ve designed it in such a way that it should be complete enough.
<
and >
, no other preparation for the code is required<pre>
tags0001 // Code-Highlight.js 0002 // 0003 // This javascript adds simple syntax highlighting, boasting a small file size, 0004 // simple therefore compatible, backwards compatible for systems not running 0005 // javascript and clean formatting. Code also offers the ability to print in a 0006 // clean and printer friendly fashion. 0007 // 0008 // Version 1.0.1 0009 // Written By B[]Array 0010 // 0011 // License: 0012 // No warranty, free to use. It would be kind if you said that you have used 0013 // this code. Use commercially if you wish, after all with any luck this will 0014 // help make the internet a cleaner place. 0015 0016 function codehighlight(){ 0017 var outerright = '</pre>'; 0018 var fontstart = '<b><font color="'; 0019 var fontend = '</font></b>'; 0020 0021 var red = "red"; 0022 var maroon = "maroon"; 0023 var olive = "olive"; 0024 var teal = "teal"; 0025 var grey = "darkslategray"; 0026 0027 var symbolpairs = [ 0028 ["[", '">['], 0029 ["]", '">]'], 0030 ["{", '">{'], 0031 ["}", '">}'], 0032 ["(", '">('], 0033 [")", '">)'] 0034 ]; 0035 0036 var symbolmath = [ 0037 ["+", '">+'], 0038 ["-", '">-'], 0039 ["*", '">*'], 0040 ["^", '">^'], 0041 ["//", '">//'] 0042 ]; 0043 0044 var symbolother = [ 0045 [".", '">.'], 0046 [",", '">,'], 0047 ["?", '">?'], 0048 ["!", '">!'], 0049 ["£", '">£'], 0050 ["$", '">$'], 0051 ["%", '">%'], 0052 ["@", '">@'], 0053 ["~", '">~'], 0054 ["|", '">|'], 0055 ["#", '">#'], 0056 [":", '">:'] 0057 ]; 0058 0059 var number = [ 0060 ["0", '">0'], 0061 ["1", '">1'], 0062 ["2", '">2'], 0063 ["3", '">3'], 0064 ["4", '">4'], 0065 ["5", '">5'], 0066 ["6", '">6'], 0067 ["7", '">7'], 0068 ["8", '">8'], 0069 ["9", '">9'] 0070 ]; 0071 0072 var codeblocks = document.getElementsByClassName("code"); 0073 for(var i = 0; i < codeblocks.length; i++){ 0074 var id = 'code' + i; 0075 var outerleft = '<input id="printcode" type="button" value="Print Code" onclick="printcode(\'' + id + '\');" /><pre class="code" id="' + id + '">'; 0076 0077 var newblock = document.createElement("p"); 0078 newblock.innerHTML = codeblocks[i].innerHTML; 0079 0080 for(var z = 0; z < symbolpairs.length; z++) 0081 newblock.innerHTML = newblock.innerHTML.split(symbolpairs[z][0]).join(fontstart + teal + symbolpairs[z][1] + fontend); 0082 0083 for(var z = 0; z < symbolmath.length; z++) 0084 newblock.innerHTML = newblock.innerHTML.split(symbolmath[z][0]).join(fontstart + maroon + symbolmath[z][1] + fontend); 0085 0086 for(var z = 0; z < symbolother.length; z++) 0087 newblock.innerHTML = newblock.innerHTML.split(symbolother[z][0]).join(fontstart + red + symbolother[z][1] + fontend); 0088 0089 for(var z = 0; z < number.length; z++) 0090 newblock.innerHTML = newblock.innerHTML.split(number[z][0]).join(fontstart + olive + number[z][1] + fontend); 0091 0092 newblock.innerHTML = outerleft + newblock.innerHTML + outerright; 0093 codeblocks[i].parentNode.replaceChild(newblock, codeblocks[i]); 0094 } 0095 } 0096 0097 function printcode(id){ 0098 var win = window.open('', '_blank'); 0099 win.document.write('<html><head></head><body>'); 0100 win.document.write('<h1>' + document.title + '</h1>'); 0101 win.document.write('<h2>' + document.getElementsByTagName("h1")[0].innerHTML + '</h2>'); 0102 0103 var codeblock = document.getElementById(id); 0104 win.document.write('<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">' + codeblock.innerHTML + '</pre>'); 0105 0106 win.document.write('</body></html>'); 0107 0108 // Special code for IE >= 10 0109 win.document.close(); 0110 win.focus(); 0111 0112 win.print(); 0113 win.close(); 0114 }
First things first, you will need to include the javascript file by placing the following into your code:
0115 <script type="text/javascript" src="code-highlight.js"></script>
Next, you must allow the code to run by calling it’s constructor codehighlight();
.
NOTE: I do know that it can be run from the onload
in the body
tag, but I wish to leave it open for future scripts to be added as part of a larger modular system.
0116 ... 0117 <head> 0118 ... 0119 <script type="text/javascript"> 0120 function main(){ 0121 codehighlight(); 0122 } 0123 </script> 0124 </head> 0125 <body onload="main();"> 0126 ... 0127 </body> 0128 ...
Now the code will parse the html on the page, next to add you code sections:
0129 <pre class="code"> 0130 <!-- Your code here --> 0131 </pre>
Further experimenting revealed that it’s much more efficient to use the what appears to be much more bloated multiple passes algorithm on the code than doing a character by character search once. I suspect that this is because the browser actually uses a much lighter search and replace algorithm than in the emulated environment of javascript. It’s probably the difference between C++ search and replace and a much higher level language. The effects on this page were anything up to 20 seconds page lockup compared to the almost instant viewing of this page with the current code.
If anybody has any advice on how to speed up or simplify the current passes without loosing too much if anything of the syntax I would be happy to listen. I find it somewhat annoying that it isn’t faster, but still, it isn’t bad for a browser based language and currently the speed is good on most devices, even old ones.