Subversion Repositories Applications.papyrus

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2150 mathias 1
if(!dojo._hasResource["dojox.dtl.tag.loader"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
2
dojo._hasResource["dojox.dtl.tag.loader"] = true;
3
dojo.provide("dojox.dtl.tag.loader");
4
 
5
dojo.require("dojox.dtl._base");
6
 
7
dojox.dtl.tag.loader.BlockNode = function(name, nodelist){
8
	this.name = name;
9
	this.nodelist = nodelist; // Can be overridden
10
}
11
dojo.extend(dojox.dtl.tag.loader.BlockNode, {
12
	render: function(context, buffer){
13
		if(this.override){
14
			buffer = this.override.render(context, buffer, this);
15
			this.rendered = this.override;
16
		}else{
17
			buffer =  this.nodelist.render(context, buffer, this);
18
			this.rendered = this.nodelist;
19
		}
20
		this.override = null;
21
		return buffer;
22
	},
23
	unrender: function(context, buffer){
24
		return this.rendered.unrender(context, buffer);
25
	},
26
	setOverride: function(nodelist){
27
		// summary: In a shared parent, we override, not overwrite
28
		if(!this.override){
29
			this.override = nodelist;
30
		}
31
	},
32
	toString: function(){ return "dojox.dtl.tag.loader.BlockNode"; }
33
});
34
dojox.dtl.tag.loader.block = function(parser, text){
35
	var parts = text.split(" ");
36
	var name = parts[1];
37
 
38
	parser._blocks = parser._blocks || {};
39
	parser._blocks[name] = parser._blocks[name] || [];
40
	parser._blocks[name].push(name);
41
 
42
	var nodelist = parser.parse(["endblock", "endblock " + name]);
43
	parser.next();
44
	return new dojox.dtl.tag.loader.BlockNode(name, nodelist);
45
}
46
 
47
dojox.dtl.tag.loader.ExtendsNode = function(getTemplate, nodelist, shared, parent, key){
48
	this.getTemplate = getTemplate;
49
	this.nodelist = nodelist;
50
	this.shared = shared;
51
	this.parent = parent;
52
	this.key = key;
53
}
54
dojo.extend(dojox.dtl.tag.loader.ExtendsNode, {
55
	parents: {},
56
	getParent: function(context){
57
		if(!this.parent){
58
			this.parent = context.get(this.key, false);
59
			if(!this.parent){
60
				throw new Error("extends tag used a variable that did not resolve");
61
			}
62
			if(typeof this.parent == "object"){
63
				if(this.parent.url){
64
					if(this.parent.shared){
65
						this.shared = true;
66
					}
67
					this.parent = this.parent.url.toString();
68
				}else{
69
					this.parent = this.parent.toString();
70
				}
71
			}
72
			if(this.parent && this.parent.indexOf("shared:") == 0){
73
				this.shared = true;
74
				this.parent = this.parent.substring(7, parent.length);
75
			}
76
		}
77
		var parent = this.parent;
78
		if(!parent){
79
			throw new Error("Invalid template name in 'extends' tag.");
80
		}
81
		if(parent.render){
82
			return parent;
83
		}
84
		if(this.parents[parent]){
85
			return this.parents[parent];
86
		}
87
		this.parent = this.getTemplate(dojox.dtl.text.getTemplateString(parent));
88
		if(this.shared){
89
			this.parents[parent] = this.parent;
90
		}
91
		return this.parent;
92
	},
93
	render: function(context, buffer){
94
		var st = dojox.dtl;
95
		var stbl = dojox.dtl.tag.loader;
96
		var parent = this.getParent(context);
97
		var isChild = parent.nodelist[0] instanceof this.constructor;
98
		var parentBlocks = {};
99
		for(var i = 0, node; node = parent.nodelist.contents[i]; i++){
100
			if(node instanceof stbl.BlockNode){
101
				parentBlocks[node.name] = node;
102
			}
103
		}
104
		for(var i = 0, node; node = this.nodelist.contents[i]; i++){
105
			if(node instanceof stbl.BlockNode){
106
				var block = parentBlocks[node.name];
107
				if(!block){
108
					if(isChild){
109
						parent.nodelist[0].nodelist.append(node);
110
					}
111
				}else{
112
					if(this.shared){
113
						block.setOverride(node.nodelist);
114
					}else{
115
						block.nodelist = node.nodelist;
116
					}
117
				}
118
			}
119
		}
120
		this.rendered = parent;
121
		return parent.render(context, buffer, this);
122
	},
123
	unrender: function(context, buffer){
124
		return this.rendered.unrender(context, buffer, this);
125
	},
126
	toString: function(){ return "dojox.dtl.block.ExtendsNode"; }
127
});
128
dojox.dtl.tag.loader.extends_ = function(parser, text){
129
	var parts = text.split(" ");
130
	var shared = false;
131
	var parent = null;
132
	var key = null;
133
	if(parts[1].charAt(0) == '"' || parts[1].charAt(0) == "'"){
134
		parent = parts[1].substring(1, parts[1].length - 1);
135
	}else{
136
		key = parts[1];
137
	}
138
	if(parent && parent.indexOf("shared:") == 0){
139
		shared = true;
140
		parent = parent.substring(7, parent.length);
141
	}
142
	var nodelist = parser.parse();
143
	return new dojox.dtl.tag.loader.ExtendsNode(parser.getTemplate, nodelist, shared, parent, key);
144
}
145
 
146
}