diff options
Diffstat (limited to 'js/dojo/dojox/highlight/widget/Code.js')
| -rw-r--r-- | js/dojo/dojox/highlight/widget/Code.js | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/js/dojo/dojox/highlight/widget/Code.js b/js/dojo/dojox/highlight/widget/Code.js new file mode 100644 index 0000000..bd83c43 --- /dev/null +++ b/js/dojo/dojox/highlight/widget/Code.js @@ -0,0 +1,101 @@ +//>>built +define("dojox/highlight/widget/Code", ["dojo", "dijit", "dijit/_Widget", "dijit/_Templated", "dojox/highlight"], function(dojo, dijit){ + + dojo.declare("dojox.highlight.widget.Code",[dijit._Widget, dijit._Templated],{ + // summary: + // A simple source code formatting widget that adds line numbering, alternating line colors + // and line range support on top of dojox.highlight module. + + url: "", + range:null, + style:"", + listType:"1", + lang:"", + + // Note: If more control over formatting is required, the order list items can be replaced + // with a table implementation instead... Excercise is left for those that need it... + templateString: + '<div class="formatted" style="${style}">'+ + '<div class="titleBar"></div>'+ + '<ol type="${listType}" dojoAttachPoint="codeList" class="numbers"></ol>' + + '<div style="display:none" dojoAttachPoint="containerNode"></div>' + + '</div>', + + postCreate: function(){ + this.inherited(arguments); + if(this.url){ + // load from a url + dojo.xhrGet({ + url: this.url, + // then poopulate: + load: dojo.hitch(this,"_populate"), + error: dojo.hitch(this,"_loadError") + }); + }else{ + // or just populate from our internal content + this._populate(this.containerNode.innerHTML); + } + }, + + _populate: function(data){ + // put the content in a common node + this.containerNode.innerHTML = + "<pre><code class='" + this.lang + "'>" + + data.replace(/\</g,"<") + + "</code></pre>"; + // highlight it + dojo.query("pre > code",this.containerNode).forEach(dojox.highlight.init); + // FIXME: in ie7, the innerHTML in a real <pre> isn't split by \n's ? + // split the content into lines + var lines = this.containerNode.innerHTML.split("\n"); + dojo.forEach(lines,function(line,i){ + // setup all the lines of the content as <li>'s + var li = dojo.doc.createElement('li'); + // add some style sugar: + dojo.addClass(li, (i % 2 !== 0 ? "even" : "odd")); + line = "<pre><code>" + line + " </code></pre>"; + line = line.replace(/\t/g," "); + li.innerHTML = line; + this.codeList.appendChild(li); + },this); + // save our data + this._lines = dojo.query("li",this.codeList); + this._updateView(); + }, + + // FIXME: user _setRangeAttr pattern? so you can code.set('range', [1, 100]); + setRange: function(/* Array */range){ + // summary: update the view to a new passed range + if(dojo.isArray(range)){ + this.range = range; + this._updateView(); + } + }, + + _updateView: function(){ + // summary: set the list to the current range + if(this.range){ + var r = this.range; + this._lines + // hide them all + .style({ display:"none" }) + .filter(function(n,i){ + // remove nodes out of range + return (i + 1 >= r[0] && i + 1 <= r[1]); + }) + // set them visible again + .style({ display:"" }) + ; + // set the "start" attribute on the OL so numbering works + dojo.attr(this.codeList,"start",r[0]); + } + }, + + _loadError: function(error){ + // summary: a generic error handler for the url="" + console.warn("loading: ", this.url, " FAILED", error); + } + + }); + +});
\ No newline at end of file |
