aboutsummaryrefslogtreecommitdiff
path: root/includes/js/dojox/dtl/contrib/html.js
blob: 260bbe2df4a11755dc397c3753f48ff39309c941 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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, '&lt;$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"]
	});
})();

}