108 lines
2.6 KiB
JavaScript
108 lines
2.6 KiB
JavaScript
|
if(!dojo._hasResource["dojox.dtl.contrib.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||
|
dojo._hasResource["dojox.dtl.contrib.html"] = true;
|
||
|
dojo.provide("dojox.dtl.contrib.html");
|
||
|
|
||
|
dojo.require("dojox.dtl.html");
|
||
|
|
||
|
(function(){
|
||
|
var dd = dojox.dtl;
|
||
|
var ddch = dd.contrib.html;
|
||
|
|
||
|
ddch.HtmlNode = dojo.extend(function(name){
|
||
|
this.contents = new dd._Filter(name);
|
||
|
this._div = document.createElement("div");
|
||
|
this._lasts = [];
|
||
|
},
|
||
|
{
|
||
|
render: function(context, buffer){
|
||
|
var text = this.contents.resolve(context);
|
||
|
if(text){
|
||
|
text = text.replace(/<(\/?script)/ig, '<$1').replace(/\bon[a-z]+\s*=/ig, '');
|
||
|
if(this._rendered && this._last != text){
|
||
|
buffer = this.unrender(context, buffer);
|
||
|
}
|
||
|
this._last = text;
|
||
|
|
||
|
// This can get reset in the above tag
|
||
|
if(!this._rendered){
|
||
|
this._rendered = true;
|
||
|
var div = this._div;
|
||
|
div.innerHTML = text;
|
||
|
var children = div.childNodes;
|
||
|
while(children.length){
|
||
|
var removed = div.removeChild(children[0]);
|
||
|
this._lasts.push(removed);
|
||
|
buffer = buffer.concat(removed);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return buffer;
|
||
|
},
|
||
|
unrender: function(context, buffer){
|
||
|
if(this._rendered){
|
||
|
this._rendered = false;
|
||
|
this._last = "";
|
||
|
for(var i = 0, node; node = this._lasts[i++];){
|
||
|
buffer = buffer.remove(node);
|
||
|
dojo._destroyElement(node);
|
||
|
}
|
||
|
this._lasts = [];
|
||
|
}
|
||
|
return buffer;
|
||
|
},
|
||
|
clone: function(buffer){
|
||
|
return new this.constructor(this.contents.getExpression());
|
||
|
}
|
||
|
});
|
||
|
|
||
|
ddch.StyleNode = dojo.extend(function(styles){
|
||
|
this.contents = {};
|
||
|
this._styles = styles;
|
||
|
for(var key in styles){
|
||
|
this.contents[key] = new dd.Template(styles[key]);
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
render: function(context, buffer){
|
||
|
for(var key in this.contents){
|
||
|
dojo.style(buffer.getParent(), key, this.contents[key].render(context));
|
||
|
}
|
||
|
return buffer;
|
||
|
},
|
||
|
unrender: function(context, buffer){
|
||
|
return buffer;
|
||
|
},
|
||
|
clone: function(buffer){
|
||
|
return new this.constructor(this._styles);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
dojo.mixin(ddch, {
|
||
|
html: function(parser, text){
|
||
|
var parts = text.split(" ", 2);
|
||
|
return new ddch.HtmlNode(parts[1]);
|
||
|
},
|
||
|
tstyle: function(parser, text){
|
||
|
var styles = {};
|
||
|
text = text.replace(/^tstyle\s+/, "");
|
||
|
var rules = text.split(/\s*;\s*/g);
|
||
|
for(var i = 0, rule; rule = rules[i]; i++){
|
||
|
var parts = rule.split(/\s*:\s*/g);
|
||
|
var key = parts[0];
|
||
|
var value = parts[1];
|
||
|
if(value.indexOf("{{") == 0){
|
||
|
styles[key] = value;
|
||
|
}
|
||
|
}
|
||
|
return new ddch.StyleNode(styles);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
dd.register.tags("dojox.dtl.contrib", {
|
||
|
"html": ["html", "attr:tstyle"]
|
||
|
});
|
||
|
})();
|
||
|
|
||
|
}
|