123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- if (!dojo._hasResource["dojox.dtl.tag.logic"]) { // _hasResource checks added
- // by build. Do not use
- // _hasResource directly in
- // your code.
- dojo._hasResource["dojox.dtl.tag.logic"] = true;
- dojo.provide("dojox.dtl.tag.logic");
- dojo.require("dojox.dtl._base");
- dojox.dtl.tag.logic.IfNode = function(bools, trues, falses, type) {
- this.bools = bools;
- this.trues = trues;
- this.falses = falses;
- this.type = type;
- }
- dojo.extend(dojox.dtl.tag.logic.IfNode, {
- render : function(context, buffer) {
- if (this.type == "or") {
- for (var i = 0, bool; bool = this.bools[i]; i++) {
- var ifnot = bool[0];
- var filter = bool[1];
- var value = filter.resolve(context);
- if ((value && !ifnot) || (ifnot && !value)) {
- if (this.falses) {
- buffer = this.falses.unrender(context,
- buffer);
- }
- return this.trues.render(context, buffer, this);
- }
- buffer = this.trues.unrender(context, buffer);
- if (this.falses)
- return this.falses
- .render(context, buffer, this);
- }
- } else {
- for (var i = 0, bool; bool = this.bools[i]; i++) {
- var ifnot = bool[0];
- var filter = bool[1];
- var value = filter.resolve(context);
- if (!((value && !ifnot) || (ifnot && !value))) {
- if (this.trues) {
- buffer = this.trues.unrender(context,
- buffer);
- }
- return this.falses
- .render(context, buffer, this);
- }
- buffer = this.falses.unrender(context, buffer);
- if (this.falses)
- return this.trues.render(context, buffer, this);
- }
- }
- return buffer;
- },
- unrender : function(context, buffer) {
- if (this.trues)
- buffer = this.trues.unrender(context, buffer);
- if (this.falses)
- buffer = this.falses.unrender(context, buffer);
- return buffer;
- },
- clone : function(buffer) {
- var trues = this.trues;
- var falses = this.falses;
- if (trues) {
- trues = trues.clone(buffer);
- }
- if (falses) {
- falses = falses.clone(buffer);
- }
- return new this.constructor(this.bools, trues, falses,
- this.type);
- },
- toString : function() {
- return "dojox.dtl.tag.logic.IfNode";
- }
- });
- dojox.dtl.tag.logic.ForNode = function(assign, loop, reversed, nodelist) {
- this.assign = assign;
- this.loop = loop;
- this.reversed = reversed;
- this.nodelist = nodelist;
- this.pool = [];
- }
- dojo.extend(dojox.dtl.tag.logic.ForNode, {
- render : function(context, buffer) {
- var parentloop = {};
- if (context.forloop) {
- parentloop = context.forloop;
- }
- var items = dojox.dtl.resolveVariable(this.loop, context);
- context.push();
- for (var i = items.length; i < this.pool.length; i++) {
- this.pool[i].unrender(context, buffer);
- }
- if (this.reversed) {
- items = items.reversed();
- }
- var j = 0;
- for (var i in items) {
- var item = items[i];
- context.forloop = {
- key : i,
- counter0 : j,
- counter : j + 1,
- revcounter0 : items.length - j - 1,
- revcounter : items.length - j,
- first : j == 0,
- parentloop : parentloop
- };
- context[this.assign] = item;
- if (j + 1 > this.pool.length) {
- this.pool.push(this.nodelist.clone(buffer));
- }
- buffer = this.pool[j].render(context, buffer, this);
- ++j;
- }
- context.pop();
- return buffer;
- },
- unrender : function(context, buffer) {
- for (var i = 0, pool; pool = this.pool[i]; i++) {
- buffer = pool.unrender(context, buffer);
- }
- return buffer;
- },
- clone : function(buffer) {
- return new this.constructor(this.assign, this.loop,
- this.reversed, this.nodelist.clone(buffer));
- },
- toString : function() {
- return "dojox.dtl.tag.logic.ForNode";
- }
- });
- dojox.dtl.tag.logic.if_ = function(parser, text) {
- var parts = text.split(/\s+/g);
- var type;
- var bools = [];
- parts.shift();
- text = parts.join(" ");
- parts = text.split(" and ");
- if (parts.length == 1) {
- type = "or";
- parts = text.split(" or ");
- } else {
- type = "and";
- for (var i = 0; i < parts.length; i++) {
- if (parts[i] == "or") {
- throw new Error("'if' tags can't mix 'and' and 'or'");
- }
- }
- }
- for (var i = 0, part; part = parts[i]; i++) {
- var not = false;
- if (part.indexOf("not ") == 0) {
- part = part.substring(4);
- not = true;
- }
- bools.push([not, new dojox.dtl.Filter(part)]);
- }
- var trues = parser.parse(["else", "endif"]);
- var falses = false;
- var token = parser.next();
- if (token.text == "else") {
- var falses = parser.parse(["endif"]);
- parser.next();
- }
- return new dojox.dtl.tag.logic.IfNode(bools, trues, falses, type);
- }
- dojox.dtl.tag.logic.for_ = function(parser, text) {
- var parts = text.split(/\s+/g);
- var reversed = parts.length == 5;
- var nodelist = parser.parse(["endfor"]);
- parser.next();
- return new dojox.dtl.tag.logic.ForNode(parts[1], parts[3], reversed,
- nodelist);
- }
- }
|