diff options
Diffstat (limited to 'includes/js/dojox/dtl/tag/loop.js')
-rw-r--r-- | includes/js/dojox/dtl/tag/loop.js | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/includes/js/dojox/dtl/tag/loop.js b/includes/js/dojox/dtl/tag/loop.js new file mode 100644 index 0000000..3626c52 --- /dev/null +++ b/includes/js/dojox/dtl/tag/loop.js @@ -0,0 +1,196 @@ +if(!dojo._hasResource["dojox.dtl.tag.loop"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.dtl.tag.loop"] = true; +dojo.provide("dojox.dtl.tag.loop"); + +dojo.require("dojox.dtl._base"); +dojo.require("dojox.string.tokenize"); + +(function(){ + var dd = dojox.dtl; + var ddtl = dd.tag.loop; + + ddtl.CycleNode = dojo.extend(function(cyclevars, name, TextNode, shared){ + this.cyclevars = cyclevars; + this.name = name; + this.TextNode = TextNode; + this.shared = shared || {counter: -1, map: {}}; + }, + { + render: function(context, buffer){ + if(context.forloop && !context.forloop.counter0){ + this.shared.counter = -1; + } + + ++this.shared.counter; + var value = this.cyclevars[this.shared.counter % this.cyclevars.length]; + + var map = this.shared.map; + if(!map[value]){ + map[value] = new dd._Filter(value); + } + value = map[value].resolve(context, buffer); + + if(this.name){ + context[this.name] = value; + } + if(!this.contents){ + this.contents = new this.TextNode(""); + } + this.contents.set(value); + return this.contents.render(context, buffer); + }, + unrender: function(context, buffer){ + return this.contents.unrender(context, buffer); + }, + clone: function(){ + return new this.constructor(this.cyclevars, this.name, this.TextNode, this.shared); + } + }); + + ddtl.IfChangedNode = dojo.extend(function(nodes, vars, shared){ + this.nodes = nodes; + this._vars = vars; + this.shared = shared || {last: null}; + this.vars = dojo.map(vars, function(item){ + return new dojox.dtl._Filter(item); + }); + }, { + render: function(context, buffer){ + if(context.forloop && context.forloop.first){ + this.shared.last = null; + } + + var change; + if(this.vars.length){ + change = dojo.toJson(dojo.map(this.vars, function(item){ + return item.resolve(context); + })); + }else{ + change = this.nodes.dummyRender(context, buffer); + } + + if(change != this.shared.last){ + var firstloop = (this.shared.last === null); + this.shared.last = change; + context.push(); + context.ifchanged = {firstloop: firstloop} + buffer = this.nodes.render(context, buffer); + context.pop(); + } + return buffer; + }, + unrender: function(context, buffer){ + this.nodes.unrender(context, buffer); + }, + clone: function(buffer){ + return new this.constructor(this.nodes.clone(buffer), this._vars, this.shared); + } + }); + + ddtl.RegroupNode = dojo.extend(function(expression, key, alias){ + this._expression = expression; + this.expression = new dd._Filter(expression); + this.key = key; + this.alias = alias; + }, + { + _push: function(container, grouper, stack){ + if(stack.length){ + container.push({ grouper: grouper, list: stack }) + } + }, + render: function(context, buffer){ + context[this.alias] = []; + var list = this.expression.resolve(context); + if(list){ + var last = null; + var stack = []; + for(var i = 0; i < list.length; i++){ + var id = list[i][this.key]; + if(last !== id){ + this._push(context[this.alias], last, stack); + last = id; + stack = [list[i]]; + }else{ + stack.push(list[i]); + } + } + this._push(context[this.alias], last, stack); + } + return buffer; + }, + unrender: function(context, buffer){ + return buffer; + }, + clone: function(context, buffer){ + return this; + } + }); + + dojo.mixin(ddtl, { + cycle: function(parser, text){ + // summary: Cycle among the given strings each time this tag is encountered + var args = text.split(" "); + + if(args.length < 2){ + throw new Error("'cycle' tag requires at least two arguments"); + } + + if(args[1].indexOf(",") != -1){ + var vars = args[1].split(","); + args = [args[0]]; + for(var i = 0; i < vars.length; i++){ + args.push('"' + vars[i] + '"'); + } + } + + if(args.length == 2){ + var name = args[args.length - 1]; + + if(!parser._namedCycleNodes){ + throw new Error("No named cycles in template: '" + name + "' is not defined"); + } + if(!parser._namedCycleNodes[name]){ + throw new Error("Named cycle '" + name + "' does not exist"); + } + + return parser._namedCycleNodes[name]; + } + + if(args.length > 4 && args[args.length - 2] == "as"){ + var name = args[args.length - 1]; + + var node = new ddtl.CycleNode(args.slice(1, args.length - 2), name, parser.getTextNodeConstructor()); + + if(!parser._namedCycleNodes){ + parser._namedCycleNodes = {}; + } + parser._namedCycleNodes[name] = node; + }else{ + node = new ddtl.CycleNode(args.slice(1), null, parser.getTextNodeConstructor()); + } + + return node; + }, + ifchanged: function(parser, text){ + var parts = dojox.dtl.text.pySplit(text); + var nodes = parser.parse(["endifchanged"]); + parser.next(); + return new ddtl.IfChangedNode(nodes, parts.slice(1)); + }, + regroup: function(parser, text){ + var tokens = dojox.string.tokenize(dojo.trim(text), /(\s+)/g, function(spaces){ + return spaces; + }); + if(tokens.length < 11 || tokens[tokens.length - 3] != "as" || tokens[tokens.length - 7] != "by"){ + throw new Error("Expected the format: regroup list by key as newList"); + } + var expression = tokens.slice(2, -8).join(""); + var key = tokens[tokens.length - 5]; + var alias = tokens[tokens.length - 1]; + return new ddtl.RegroupNode(expression, key, alias); + } + }); +})(); + +} |