New file |
0,0 → 1,146 |
if(!dojo._hasResource["dojox.dtl.tag.loader"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. |
dojo._hasResource["dojox.dtl.tag.loader"] = true; |
dojo.provide("dojox.dtl.tag.loader"); |
|
dojo.require("dojox.dtl._base"); |
|
dojox.dtl.tag.loader.BlockNode = function(name, nodelist){ |
this.name = name; |
this.nodelist = nodelist; // Can be overridden |
} |
dojo.extend(dojox.dtl.tag.loader.BlockNode, { |
render: function(context, buffer){ |
if(this.override){ |
buffer = this.override.render(context, buffer, this); |
this.rendered = this.override; |
}else{ |
buffer = this.nodelist.render(context, buffer, this); |
this.rendered = this.nodelist; |
} |
this.override = null; |
return buffer; |
}, |
unrender: function(context, buffer){ |
return this.rendered.unrender(context, buffer); |
}, |
setOverride: function(nodelist){ |
// summary: In a shared parent, we override, not overwrite |
if(!this.override){ |
this.override = nodelist; |
} |
}, |
toString: function(){ return "dojox.dtl.tag.loader.BlockNode"; } |
}); |
dojox.dtl.tag.loader.block = function(parser, text){ |
var parts = text.split(" "); |
var name = parts[1]; |
|
parser._blocks = parser._blocks || {}; |
parser._blocks[name] = parser._blocks[name] || []; |
parser._blocks[name].push(name); |
|
var nodelist = parser.parse(["endblock", "endblock " + name]); |
parser.next(); |
return new dojox.dtl.tag.loader.BlockNode(name, nodelist); |
} |
|
dojox.dtl.tag.loader.ExtendsNode = function(getTemplate, nodelist, shared, parent, key){ |
this.getTemplate = getTemplate; |
this.nodelist = nodelist; |
this.shared = shared; |
this.parent = parent; |
this.key = key; |
} |
dojo.extend(dojox.dtl.tag.loader.ExtendsNode, { |
parents: {}, |
getParent: function(context){ |
if(!this.parent){ |
this.parent = context.get(this.key, false); |
if(!this.parent){ |
throw new Error("extends tag used a variable that did not resolve"); |
} |
if(typeof this.parent == "object"){ |
if(this.parent.url){ |
if(this.parent.shared){ |
this.shared = true; |
} |
this.parent = this.parent.url.toString(); |
}else{ |
this.parent = this.parent.toString(); |
} |
} |
if(this.parent && this.parent.indexOf("shared:") == 0){ |
this.shared = true; |
this.parent = this.parent.substring(7, parent.length); |
} |
} |
var parent = this.parent; |
if(!parent){ |
throw new Error("Invalid template name in 'extends' tag."); |
} |
if(parent.render){ |
return parent; |
} |
if(this.parents[parent]){ |
return this.parents[parent]; |
} |
this.parent = this.getTemplate(dojox.dtl.text.getTemplateString(parent)); |
if(this.shared){ |
this.parents[parent] = this.parent; |
} |
return this.parent; |
}, |
render: function(context, buffer){ |
var st = dojox.dtl; |
var stbl = dojox.dtl.tag.loader; |
var parent = this.getParent(context); |
var isChild = parent.nodelist[0] instanceof this.constructor; |
var parentBlocks = {}; |
for(var i = 0, node; node = parent.nodelist.contents[i]; i++){ |
if(node instanceof stbl.BlockNode){ |
parentBlocks[node.name] = node; |
} |
} |
for(var i = 0, node; node = this.nodelist.contents[i]; i++){ |
if(node instanceof stbl.BlockNode){ |
var block = parentBlocks[node.name]; |
if(!block){ |
if(isChild){ |
parent.nodelist[0].nodelist.append(node); |
} |
}else{ |
if(this.shared){ |
block.setOverride(node.nodelist); |
}else{ |
block.nodelist = node.nodelist; |
} |
} |
} |
} |
this.rendered = parent; |
return parent.render(context, buffer, this); |
}, |
unrender: function(context, buffer){ |
return this.rendered.unrender(context, buffer, this); |
}, |
toString: function(){ return "dojox.dtl.block.ExtendsNode"; } |
}); |
dojox.dtl.tag.loader.extends_ = function(parser, text){ |
var parts = text.split(" "); |
var shared = false; |
var parent = null; |
var key = null; |
if(parts[1].charAt(0) == '"' || parts[1].charAt(0) == "'"){ |
parent = parts[1].substring(1, parts[1].length - 1); |
}else{ |
key = parts[1]; |
} |
if(parent && parent.indexOf("shared:") == 0){ |
shared = true; |
parent = parent.substring(7, parent.length); |
} |
var nodelist = parser.parse(); |
return new dojox.dtl.tag.loader.ExtendsNode(parser.getTemplate, nodelist, shared, parent, key); |
} |
|
} |