123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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);
- }
- });
- });
|