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");
5 dojo.require("dojox.dtl._base");
9 var ddtl = dd.tag.loader;
11 ddtl.BlockNode = dojo.extend(function(name, nodelist){
13 this.nodelist = nodelist; // Can be overridden
16 render: function(context, buffer){
18 var nodelist = this.nodelist;
20 var block = buffer.blocks[name];
22 nodelist = block.nodelist;
26 this.rendered = nodelist;
27 return nodelist.render(context, buffer, this);
29 unrender: function(context, buffer){
30 return this.rendered.unrender(context, buffer);
32 clone: function(buffer){
33 return new this.constructor(this.name, this.nodelist.clone(buffer));
35 setOverride: function(nodelist){
36 // summary: In a shared parent, we override, not overwrite
38 this.override = nodelist;
41 toString: function(){ return "dojox.dtl.tag.loader.BlockNode"; }
44 ddtl.ExtendsNode = dojo.extend(function(getTemplate, nodelist, shared, parent, key){
45 this.getTemplate = getTemplate;
46 this.nodelist = nodelist;
53 getParent: function(context){
55 this.parent = context.get(this.key, false);
57 throw new Error("extends tag used a variable that did not resolve");
59 if(typeof this.parent == "object"){
61 if(this.parent.shared){
64 this.parent = this.parent.url.toString();
66 this.parent = this.parent.toString();
69 if(this.parent && this.parent.indexOf("shared:") == 0){
71 this.parent = this.parent.substring(7, parent.length);
74 var parent = this.parent;
76 throw new Error("Invalid template name in 'extends' tag.");
81 if(this.parents[parent]){
82 return this.parents[parent];
84 this.parent = this.getTemplate(dojox.dtl.text.getTemplateString(parent));
86 this.parents[parent] = this.parent;
90 render: function(context, buffer){
91 var parent = this.getParent(context);
93 buffer.blocks = buffer.blocks || {};
95 // The parent won't always be in the default parent's nodelist
96 for(var i = 0, node; node = this.nodelist.contents[i]; i++){
97 if(node instanceof dojox.dtl.tag.loader.BlockNode){
98 buffer.blocks[node.name] = {
100 nodelist: node.nodelist,
106 this.rendered = parent;
107 buffer = parent.nodelist.render(context, buffer, this);
109 var rerender = false;
110 for(var name in buffer.blocks){
111 var block = buffer.blocks[name];
114 parent.nodelist[0].nodelist.append(block.nodelist);
119 buffer = parent.nodelist.render(context, buffer, this);
124 unrender: function(context, buffer){
125 return this.rendered.unrender(context, buffer, this);
127 toString: function(){ return "dojox.dtl.block.ExtendsNode"; }
130 ddtl.IncludeNode = dojo.extend(function(path, constant, getTemplate, TextNode, parsed){
132 this.constant = constant;
133 this.path = (constant) ? path : new dd._Filter(path);
134 this.getTemplate = getTemplate;
135 this.TextNode = TextNode;
136 this.parsed = (arguments.length == 5) ? parsed : true;
140 render: function(context, buffer){
141 var location = ((this.constant) ? this.path : this.path.resolve(context)).toString();
142 var parsed = Number(this.parsed);
144 if(location != this.last){
147 buffer = this.unrender(context, buffer);
149 this.last = location;
152 var cache = this._cache[parsed];
155 if(!cache[location]){
156 cache[location] = dd.text._resolveTemplateArg(location, true);
159 var template = this.getTemplate(cache[location]);
160 this.rendered = template.nodelist;
162 return this.rendered.render(context, buffer, this);
164 if(this.TextNode == dd._TextNode){
166 this.rendered = new this.TextNode("");
167 this.rendered.set(dd.text._resolveTemplateArg(location, true));
169 return this.rendered.render(context, buffer);
171 if(!cache[location]){
173 var div = document.createElement("div");
174 div.innerHTML = dd.text._resolveTemplateArg(location, true);
175 var children = div.childNodes;
176 while(children.length){
177 var removed = div.removeChild(children[0]);
178 nodelist.push(removed);
180 cache[location] = nodelist;
185 for(var i = 0, child; child = cache[location][i]; i++){
186 this.nodelist.push(child.cloneNode(true));
189 for(var i = 0, node; node = this.nodelist[i]; i++){
190 buffer = buffer.concat(node);
196 unrender: function(context, buffer){
198 buffer = this.rendered.unrender(context, buffer);
201 for(var i = 0, node; node = this.nodelist[i]; i++){
202 buffer = buffer.remove(node);
207 clone: function(buffer){
208 return new this.constructor(this._path, this.constant, this.getTemplate, this.TextNode, this.parsed);
213 block: function(parser, text){
214 var parts = text.split(" ");
217 parser._blocks = parser._blocks || {};
218 parser._blocks[name] = parser._blocks[name] || [];
219 parser._blocks[name].push(name);
221 var nodelist = parser.parse(["endblock", "endblock " + name]);
223 return new dojox.dtl.tag.loader.BlockNode(name, nodelist);
225 extends_: function(parser, text){
226 var parts = text.split(" ");
230 if(parts[1].charAt(0) == '"' || parts[1].charAt(0) == "'"){
231 parent = parts[1].substring(1, parts[1].length - 1);
235 if(parent && parent.indexOf("shared:") == 0){
237 parent = parent.substring(7, parent.length);
239 var nodelist = parser.parse();
240 return new dojox.dtl.tag.loader.ExtendsNode(parser.getTemplate, nodelist, shared, parent, key);
242 include: function(parser, token){
243 var parts = dd.text.pySplit(token);
244 if(parts.length != 2){
245 throw new Error(parts[0] + " tag takes one argument: the name of the template to be included");
248 var constant = false;
249 if((path.charAt(0) == '"' || path.slice(-1) == "'") && path.charAt(0) == path.slice(-1)){
250 path = path.slice(1, -1);
253 return new ddtl.IncludeNode(path, constant, parser.getTemplate, parser.getTextNodeConstructor());
255 ssi: function(parser, token){
256 // We're going to treat things a little differently here.
257 // First of all, this tag is *not* portable, so I'm not
258 // concerned about it being a "drop in" replacement.
260 // Instead, we'll just replicate the include tag, but with that
261 // optional "parsed" parameter.
262 var parts = dd.text.pySplit(token);
264 if(parts.length == 3){
265 parsed = (parts.pop() == "parsed");
267 throw new Error("Second (optional) argument to ssi tag must be 'parsed'");
270 var node = ddtl.include(parser, parts.join(" "));
271 node.parsed = parsed;