|
1 JSDOC.PluginManager.registerPlugin( |
|
2 "JSDOC.publishSrcHilite", |
|
3 { |
|
4 onPublishSrc: function(src) { |
|
5 if (src.path in JsHilite.cache) { |
|
6 return; // already generated src code |
|
7 } |
|
8 else JsHilite.cache[src.path] = true; |
|
9 |
|
10 try { |
|
11 var sourceCode = IO.readFile(src.path); |
|
12 } |
|
13 catch(e) { |
|
14 print(e.message); |
|
15 quit(); |
|
16 } |
|
17 |
|
18 var hiliter = new JsHilite(sourceCode, src.charset); |
|
19 src.hilited = hiliter.hilite(); |
|
20 } |
|
21 } |
|
22 ); |
|
23 |
|
24 function JsHilite(src, charset) { |
|
25 |
|
26 var tr = new JSDOC.TokenReader(); |
|
27 |
|
28 tr.keepComments = true; |
|
29 tr.keepDocs = true; |
|
30 tr.keepWhite = true; |
|
31 |
|
32 this.tokens = tr.tokenize(new JSDOC.TextStream(src)); |
|
33 |
|
34 // TODO is redefining toString() the best way? |
|
35 JSDOC.Token.prototype.toString = function() { |
|
36 return "<span class=\""+this.type+"\">"+this.data.replace(/</g, "<")+"</span>"; |
|
37 } |
|
38 |
|
39 if (!charset) charset = "utf-8"; |
|
40 |
|
41 this.header = '<html><head><meta http-equiv="content-type" content="text/html; charset='+charset+'"> '+ |
|
42 "<style>\n\ |
|
43 .KEYW {color: #933;}\n\ |
|
44 .COMM {color: #bbb; font-style: italic;}\n\ |
|
45 .NUMB {color: #393;}\n\ |
|
46 .STRN {color: #393;}\n\ |
|
47 .REGX {color: #339;}\n\ |
|
48 .line {border-right: 1px dotted #666; color: #666; font-style: normal;}\n\ |
|
49 </style></head><body><pre>"; |
|
50 this.footer = "</pre></body></html>"; |
|
51 this.showLinenumbers = true; |
|
52 } |
|
53 |
|
54 JsHilite.cache = {}; |
|
55 |
|
56 JsHilite.prototype.hilite = function() { |
|
57 var hilited = this.tokens.join(""); |
|
58 var line = 1; |
|
59 if (this.showLinenumbers) hilited = hilited.replace(/(^|\n)/g, function(m){return m+"<span class='line'>"+((line<10)? " ":"")+((line<100)? " ":"")+(line++)+"</span> "}); |
|
60 |
|
61 return this.header+hilited+this.footer; |
|
62 } |