123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.highlight.widget.Code"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.highlight.widget.Code"] = true;
- dojo.provide("dojox.highlight.widget.Code");
- dojo.require("dijit._Widget");
- dojo.require("dijit._Templated");
- dojo.require("dojox.highlight");
- // A simple source code formatting widget that adds line numbering, alternating line colors
- // and line range support on top of dojox.highlight module.
- dojo.declare("highlight.Code",[dijit._Widget, dijit._Templated],{
- 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();
- },
-
- 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);
- }
- });
- }
|