src/cm/media/js/lib/yui/yui3-3.15.0/build/handlebars-compiler/handlebars-compiler-debug.js
author gibus
Mon, 10 Mar 2014 15:19:48 +0100
changeset 602 e16a97fb364a
permissions -rw-r--r--
Use YUI 3.15
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('handlebars-compiler', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/*!
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
Handlebars.js - Copyright (C) 2011 Yehuda Katz
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
https://raw.github.com/wycats/handlebars.js/master/LICENSE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
// This file contains code that will be inserted at the beginning of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
// handlebars-compiler module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
// This is necessary because the Y.Handlebars object is created in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
// handlebars-base module, but the native Handlebars code expects to use a local
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
// Handlebars reference.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
var Handlebars = Y.Handlebars;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
/* THIS FILE IS GENERATED BY A BUILD SCRIPT - DO NOT EDIT! */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
/* Jison generated parser */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
var handlebars = (function(){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
var parser = {trace: function trace() { },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
yy: {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
symbols_: {"error":2,"root":3,"program":4,"EOF":5,"simpleInverse":6,"statements":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"CLOSE_UNESCAPED":24,"OPEN_PARTIAL":25,"partialName":26,"params":27,"hash":28,"dataName":29,"param":30,"STRING":31,"INTEGER":32,"BOOLEAN":33,"hashSegments":34,"hashSegment":35,"ID":36,"EQUALS":37,"DATA":38,"pathSegments":39,"SEP":40,"$accept":0,"$end":1},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"CLOSE_UNESCAPED",25:"OPEN_PARTIAL",31:"STRING",32:"INTEGER",33:"BOOLEAN",36:"ID",37:"EQUALS",38:"DATA",40:"SEP"},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
productions_: [0,[3,2],[4,2],[4,3],[4,2],[4,1],[4,1],[4,0],[7,1],[7,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[6,2],[17,3],[17,2],[17,2],[17,1],[17,1],[27,2],[27,1],[30,1],[30,1],[30,1],[30,1],[30,1],[28,1],[34,2],[34,1],[35,3],[35,3],[35,3],[35,3],[35,3],[26,1],[26,1],[26,1],[29,2],[21,1],[39,3],[39,1]],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
var $0 = $$.length - 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
switch (yystate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
case 1: return $$[$0-1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
case 2: this.$ = new yy.ProgramNode([], $$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
case 3: this.$ = new yy.ProgramNode($$[$0-2], $$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
case 4: this.$ = new yy.ProgramNode($$[$0-1], []);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
case 5: this.$ = new yy.ProgramNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
case 6: this.$ = new yy.ProgramNode([], []);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
case 7: this.$ = new yy.ProgramNode([]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
case 8: this.$ = [$$[$0]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
case 9: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
case 10: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1].inverse, $$[$0-1], $$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
case 11: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0-1].inverse, $$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
case 12: this.$ = $$[$0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
case 13: this.$ = $$[$0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
case 14: this.$ = new yy.ContentNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
case 15: this.$ = new yy.CommentNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
case 18: this.$ = $$[$0-1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
case 19:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
    // Parsing out the '&' escape token at this level saves ~500 bytes after min due to the removal of one parser node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], $$[$0-2][2] === '&');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
case 20: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
case 21: this.$ = new yy.PartialNode($$[$0-1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
case 22: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
case 23:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
case 24: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
case 25: this.$ = [[$$[$0-1]].concat($$[$0]), null];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
case 26: this.$ = [[$$[$0-1]], $$[$0]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
case 27: this.$ = [[$$[$0]], null];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
case 28: this.$ = [[$$[$0]], null];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
case 29: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
case 30: this.$ = [$$[$0]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
case 31: this.$ = $$[$0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
case 32: this.$ = new yy.StringNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
case 33: this.$ = new yy.IntegerNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
case 34: this.$ = new yy.BooleanNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
case 35: this.$ = $$[$0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
case 36: this.$ = new yy.HashNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
case 37: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
case 38: this.$ = [$$[$0]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
case 39: this.$ = [$$[$0-2], $$[$0]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
case 40: this.$ = [$$[$0-2], new yy.StringNode($$[$0])];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
case 41: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
case 42: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
case 43: this.$ = [$$[$0-2], $$[$0]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
case 44: this.$ = new yy.PartialNameNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
case 45: this.$ = new yy.PartialNameNode(new yy.StringNode($$[$0]));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
case 46: this.$ = new yy.PartialNameNode(new yy.IntegerNode($$[$0]));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
case 47: this.$ = new yy.DataNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
case 48: this.$ = new yy.IdNode($$[$0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
case 49: $$[$0-2].push({part: $$[$0], separator: $$[$0-1]}); this.$ = $$[$0-2];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
case 50: this.$ = [{part: $$[$0]}];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
table: [{3:1,4:2,5:[2,7],6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],22:[1,14],23:[1,15],25:[1,16]},{1:[3]},{5:[1,17]},{5:[2,6],7:18,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,6],22:[1,14],23:[1,15],25:[1,16]},{5:[2,5],6:20,8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,5],22:[1,14],23:[1,15],25:[1,16]},{17:23,18:[1,22],21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],25:[2,8]},{4:29,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{4:30,6:3,7:4,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,5],20:[2,7],22:[1,14],23:[1,15],25:[1,16]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],25:[2,12]},{5:[2,13],14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],25:[2,13]},{5:[2,14],14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],25:[2,14]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],25:[2,15]},{17:31,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:32,21:24,29:25,36:[1,28],38:[1,27],39:26},{17:33,21:24,29:25,36:[1,28],38:[1,27],39:26},{21:35,26:34,31:[1,36],32:[1,37],36:[1,28],39:26},{1:[2,1]},{5:[2,2],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,2],22:[1,14],23:[1,15],25:[1,16]},{17:23,21:24,29:25,36:[1,28],38:[1,27],39:26},{5:[2,4],7:38,8:6,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,4],22:[1,14],23:[1,15],25:[1,16]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],25:[2,9]},{5:[2,23],14:[2,23],15:[2,23],16:[2,23],19:[2,23],20:[2,23],22:[2,23],23:[2,23],25:[2,23]},{18:[1,39]},{18:[2,27],21:44,24:[2,27],27:40,28:41,29:48,30:42,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,28],24:[2,28]},{18:[2,48],24:[2,48],31:[2,48],32:[2,48],33:[2,48],36:[2,48],38:[2,48],40:[1,51]},{21:52,36:[1,28],39:26},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],38:[2,50],40:[2,50]},{10:53,20:[1,54]},{10:55,20:[1,54]},{18:[1,56]},{18:[1,57]},{24:[1,58]},{18:[1,59],21:60,36:[1,28],39:26},{18:[2,44],36:[2,44]},{18:[2,45],36:[2,45]},{18:[2,46],36:[2,46]},{5:[2,3],8:21,9:7,11:8,12:9,13:10,14:[1,11],15:[1,12],16:[1,13],19:[1,19],20:[2,3],22:[1,14],23:[1,15],25:[1,16]},{14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],25:[2,17]},{18:[2,25],21:44,24:[2,25],28:61,29:48,30:62,31:[1,45],32:[1,46],33:[1,47],34:43,35:49,36:[1,50],38:[1,27],39:26},{18:[2,26],24:[2,26]},{18:[2,30],24:[2,30],31:[2,30],32:[2,30],33:[2,30],36:[2,30],38:[2,30]},{18:[2,36],24:[2,36],35:63,36:[1,64]},{18:[2,31],24:[2,31],31:[2,31],32:[2,31],33:[2,31],36:[2,31],38:[2,31]},{18:[2,32],24:[2,32],31:[2,32],32:[2,32],33:[2,32],36:[2,32],38:[2,32]},{18:[2,33],24:[2,33],31:[2,33],32:[2,33],33:[2,33],36:[2,33],38:[2,33]},{18:[2,34],24:[2,34],31:[2,34],32:[2,34],33:[2,34],36:[2,34],38:[2,34]},{18:[2,35],24:[2,35],31:[2,35],32:[2,35],33:[2,35],36:[2,35],38:[2,35]},{18:[2,38],24:[2,38],36:[2,38]},{18:[2,50],24:[2,50],31:[2,50],32:[2,50],33:[2,50],36:[2,50],37:[1,65],38:[2,50],40:[2,50]},{36:[1,66]},{18:[2,47],24:[2,47],31:[2,47],32:[2,47],33:[2,47],36:[2,47],38:[2,47]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],25:[2,10]},{21:67,36:[1,28],39:26},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],25:[2,11]},{14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],25:[2,16]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],25:[2,19]},{5:[2,20],14:[2,20],15:[2,20],16:[2,20],19:[2,20],20:[2,20],22:[2,20],23:[2,20],25:[2,20]},{5:[2,21],14:[2,21],15:[2,21],16:[2,21],19:[2,21],20:[2,21],22:[2,21],23:[2,21],25:[2,21]},{18:[1,68]},{18:[2,24],24:[2,24]},{18:[2,29],24:[2,29],31:[2,29],32:[2,29],33:[2,29],36:[2,29],38:[2,29]},{18:[2,37],24:[2,37],36:[2,37]},{37:[1,65]},{21:69,29:73,31:[1,70],32:[1,71],33:[1,72],36:[1,28],38:[1,27],39:26},{18:[2,49],24:[2,49],31:[2,49],32:[2,49],33:[2,49],36:[2,49],38:[2,49],40:[2,49]},{18:[1,74]},{5:[2,22],14:[2,22],15:[2,22],16:[2,22],19:[2,22],20:[2,22],22:[2,22],23:[2,22],25:[2,22]},{18:[2,39],24:[2,39],36:[2,39]},{18:[2,40],24:[2,40],36:[2,40]},{18:[2,41],24:[2,41],36:[2,41]},{18:[2,42],24:[2,42],36:[2,42]},{18:[2,43],24:[2,43],36:[2,43]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],25:[2,18]}],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
defaultActions: {17:[2,1]},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
parseError: function parseError(str, hash) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    throw new Error(str);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
parse: function parse(input) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    this.lexer.setInput(input);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    this.lexer.yy = this.yy;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
    this.yy.lexer = this.lexer;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
    this.yy.parser = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    if (typeof this.lexer.yylloc == "undefined")
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
        this.lexer.yylloc = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
    var yyloc = this.lexer.yylloc;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
    lstack.push(yyloc);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
    var ranges = this.lexer.options && this.lexer.options.ranges;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
    if (typeof this.yy.parseError === "function")
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
        this.parseError = this.yy.parseError;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
    function popStack(n) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
        stack.length = stack.length - 2 * n;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
        vstack.length = vstack.length - n;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
        lstack.length = lstack.length - n;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
    function lex() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
        var token;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
        token = self.lexer.lex() || 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
        if (typeof token !== "number") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
            token = self.symbols_[token] || token;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
        return token;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
    while (true) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
        state = stack[stack.length - 1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
        if (this.defaultActions[state]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
            action = this.defaultActions[state];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
            if (symbol === null || typeof symbol == "undefined") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
                symbol = lex();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
            action = table[state] && table[state][symbol];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        if (typeof action === "undefined" || !action.length || !action[0]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
            var errStr = "";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
            if (!recovering) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
                expected = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
                for (p in table[state])
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
                    if (this.terminals_[p] && p > 2) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
                        expected.push("'" + this.terminals_[p] + "'");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
                if (this.lexer.showPosition) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
                    errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
                    errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
                this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
        if (action[0] instanceof Array && action.length > 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
            throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
        switch (action[0]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
        case 1:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
            stack.push(symbol);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
            vstack.push(this.lexer.yytext);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
            lstack.push(this.lexer.yylloc);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
            stack.push(action[1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
            symbol = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
            if (!preErrorSymbol) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
                yyleng = this.lexer.yyleng;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
                yytext = this.lexer.yytext;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
                yylineno = this.lexer.yylineno;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
                yyloc = this.lexer.yylloc;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
                if (recovering > 0)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
                    recovering--;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
                symbol = preErrorSymbol;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
                preErrorSymbol = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
            break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
        case 2:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
            len = this.productions_[action[1]][1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
            yyval.$ = vstack[vstack.length - len];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
            yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
            if (ranges) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
                yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
            r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
            if (typeof r !== "undefined") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
                return r;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
            if (len) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
                stack = stack.slice(0, -1 * len * 2);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
                vstack = vstack.slice(0, -1 * len);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
                lstack = lstack.slice(0, -1 * len);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
            stack.push(this.productions_[action[1]][0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
            vstack.push(yyval.$);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
            lstack.push(yyval._$);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
            stack.push(newState);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
            break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
        case 3:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
            return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
    return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
/* Jison generated lexer */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
var lexer = (function(){
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
var lexer = ({EOF:1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
parseError:function parseError(str, hash) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
        if (this.yy.parser) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
            this.yy.parser.parseError(str, hash);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
            throw new Error(str);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
setInput:function (input) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
        this._input = input;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
        this._more = this._less = this.done = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        this.yylineno = this.yyleng = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
        this.yytext = this.matched = this.match = '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
        this.conditionStack = ['INITIAL'];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
        this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
        if (this.options.ranges) this.yylloc.range = [0,0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
        this.offset = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
input:function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
        var ch = this._input[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
        this.yytext += ch;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
        this.yyleng++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
        this.offset++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
        this.match += ch;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
        this.matched += ch;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
        var lines = ch.match(/(?:\r\n?|\n).*/g);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        if (lines) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
            this.yylineno++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
            this.yylloc.last_line++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
            this.yylloc.last_column++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
        if (this.options.ranges) this.yylloc.range[1]++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
        this._input = this._input.slice(1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
        return ch;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
unput:function (ch) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
        var len = ch.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
        var lines = ch.split(/(?:\r\n?|\n)/g);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
        this._input = ch + this._input;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        this.yytext = this.yytext.substr(0, this.yytext.length-len-1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
        //this.yyleng -= len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
        this.offset -= len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
        this.match = this.match.substr(0, this.match.length-1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
        this.matched = this.matched.substr(0, this.matched.length-1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
        if (lines.length-1) this.yylineno -= lines.length-1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
        var r = this.yylloc.range;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
        this.yylloc = {first_line: this.yylloc.first_line,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
          last_line: this.yylineno+1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
          first_column: this.yylloc.first_column,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
          last_column: lines ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
              (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
              this.yylloc.first_column - len
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
          };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
        if (this.options.ranges) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
more:function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
        this._more = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
less:function (n) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
        this.unput(this.match.slice(n));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
pastInput:function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
        var past = this.matched.substr(0, this.matched.length - this.match.length);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
upcomingInput:function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
        var next = this.match;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
        if (next.length < 20) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
            next += this._input.substr(0, 20-next.length);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
        return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
showPosition:function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
        var pre = this.pastInput();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
        var c = new Array(pre.length + 1).join("-");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
        return pre + this.upcomingInput() + "\n" + c+"^";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
next:function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
        if (this.done) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
            return this.EOF;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
        if (!this._input) this.done = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
        var token,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
            match,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
            tempMatch,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
            index,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
            col,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
            lines;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
        if (!this._more) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
            this.yytext = '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
            this.match = '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
        var rules = this._currentRules();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
        for (var i=0;i < rules.length; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
            tempMatch = this._input.match(this.rules[rules[i]]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
                match = tempMatch;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
                index = i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
                if (!this.options.flex) break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
        if (match) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
            lines = match[0].match(/(?:\r\n?|\n).*/g);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
            if (lines) this.yylineno += lines.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
            this.yylloc = {first_line: this.yylloc.last_line,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
                           last_line: this.yylineno+1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
                           first_column: this.yylloc.last_column,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
                           last_column: lines ? lines[lines.length-1].length-lines[lines.length-1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
            this.yytext += match[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
            this.match += match[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
            this.matches = match;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
            this.yyleng = this.yytext.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
            if (this.options.ranges) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
                this.yylloc.range = [this.offset, this.offset += this.yyleng];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
            this._more = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
            this._input = this._input.slice(match[0].length);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
            this.matched += match[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
            token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
            if (this.done && this._input) this.done = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
            if (token) return token;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
            else return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
        if (this._input === "") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
            return this.EOF;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
            return this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
                    {text: "", token: null, line: this.yylineno});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
lex:function lex() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
        var r = this.next();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
        if (typeof r !== 'undefined') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
            return r;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
            return this.lex();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
begin:function begin(condition) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
        this.conditionStack.push(condition);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
popState:function popState() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
        return this.conditionStack.pop();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
_currentRules:function _currentRules() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
        return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
topState:function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
        return this.conditionStack[this.conditionStack.length-2];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
pushState:function begin(condition) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
        this.begin(condition);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
    }});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
lexer.options = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
var YYSTATE=YY_START
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
switch($avoiding_name_collisions) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
case 0: yy_.yytext = "\\"; return 14;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
case 1:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
                                   if(yy_.yytext.slice(-1) !== "\\") this.begin("mu");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
                                   if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
                                   if(yy_.yytext) return 14;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
case 2: return 14;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
case 3:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
                                   if(yy_.yytext.slice(-1) !== "\\") this.popState();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
                                   if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
                                   return 14;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
case 4: yy_.yytext = yy_.yytext.substr(0, yy_.yyleng-4); this.popState(); return 15;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
case 5: return 25;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
case 6: return 16;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
case 7: return 20;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
case 8: return 19;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
case 9: return 19;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
case 10: return 23;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
case 11: return 22;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
case 12: this.popState(); this.begin('com');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
case 13: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
case 14: return 22;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
case 15: return 37;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
case 16: return 36;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
case 17: return 36;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
case 18: return 40;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
case 19: /*ignore whitespace*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
case 20: this.popState(); return 24;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
case 21: this.popState(); return 18;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
case 22: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 31;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
case 23: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\'/g,"'"); return 31;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
case 24: return 38;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
case 25: return 33;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
case 26: return 33;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
case 27: return 32;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
case 28: return 36;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
case 29: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 36;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
case 30: return 'INVALID';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
case 31: return 5;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
lexer.rules = [/^(?:\\\\(?=(\{\{)))/,/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|$)))/,/^(?:[\s\S]*?--\}\})/,/^(?:\{\{>)/,/^(?:\{\{#)/,/^(?:\{\{\/)/,/^(?:\{\{\^)/,/^(?:\{\{\s*else\b)/,/^(?:\{\{\{)/,/^(?:\{\{&)/,/^(?:\{\{!--)/,/^(?:\{\{![\s\S]*?\}\})/,/^(?:\{\{)/,/^(?:=)/,/^(?:\.(?=[}\/ ]))/,/^(?:\.\.)/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}\}\})/,/^(?:\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=[}\s]))/,/^(?:false(?=[}\s]))/,/^(?:-?[0-9]+(?=[}\s]))/,/^(?:[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.]))/,/^(?:\[[^\]]*\])/,/^(?:.)/,/^(?:$)/];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
lexer.conditions = {"mu":{"rules":[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31],"inclusive":false},"emu":{"rules":[3],"inclusive":false},"com":{"rules":[4],"inclusive":false},"INITIAL":{"rules":[0,1,2,31],"inclusive":true}};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
return lexer;})()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
parser.lexer = lexer;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
function Parser () { this.yy = {}; }Parser.prototype = parser;parser.Parser = Parser;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
return new Parser;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
})();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
/* THIS FILE IS GENERATED BY A BUILD SCRIPT - DO NOT EDIT! */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
Handlebars.Parser = handlebars;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
Handlebars.parse = function(input) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
  // Just return if an already-compile AST was passed in.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
  if(input.constructor === Handlebars.AST.ProgramNode) { return input; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
  Handlebars.Parser.yy = Handlebars.AST;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
  return Handlebars.Parser.parse(input);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
/* THIS FILE IS GENERATED BY A BUILD SCRIPT - DO NOT EDIT! */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
Handlebars.AST = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
Handlebars.AST.ProgramNode = function(statements, inverse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
  this.type = "program";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
  this.statements = statements;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
  if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
Handlebars.AST.MustacheNode = function(rawParams, hash, unescaped) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
  this.type = "mustache";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
  this.escaped = !unescaped;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
  this.hash = hash;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
  var id = this.id = rawParams[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
  var params = this.params = rawParams.slice(1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
  // a mustache is an eligible helper if:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
  // * its id is simple (a single part, not `this` or `..`)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
  var eligibleHelper = this.eligibleHelper = id.isSimple;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
  // a mustache is definitely a helper if:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
  // * it is an eligible helper, and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
  // * it has at least one parameter or hash segment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
  this.isHelper = eligibleHelper && (params.length || hash);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
  // if a mustache is an eligible helper but not a definite
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
  // helper, it is ambiguous, and will be resolved in a later
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
  // pass or at runtime.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
Handlebars.AST.PartialNode = function(partialName, context) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
  this.type         = "partial";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
  this.partialName  = partialName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
  this.context      = context;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
Handlebars.AST.BlockNode = function(mustache, program, inverse, close) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
  var verifyMatch = function(open, close) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
    if(open.original !== close.original) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
      throw new Handlebars.Exception(open.original + " doesn't match " + close.original);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
  };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
  verifyMatch(mustache.id, close);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
  this.type = "block";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
  this.mustache = mustache;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
  this.program  = program;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
  this.inverse  = inverse;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
  if (this.inverse && !this.program) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
    this.isInverse = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
Handlebars.AST.ContentNode = function(string) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
  this.type = "content";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
  this.string = string;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
Handlebars.AST.HashNode = function(pairs) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
  this.type = "hash";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
  this.pairs = pairs;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
Handlebars.AST.IdNode = function(parts) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
  this.type = "ID";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
  var original = "",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
      dig = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
      depth = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
  for(var i=0,l=parts.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
    var part = parts[i].part;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
    original += (parts[i].separator || '') + part;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
    if (part === ".." || part === "." || part === "this") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
      if (dig.length > 0) { throw new Handlebars.Exception("Invalid path: " + original); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
      else if (part === "..") { depth++; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
      else { this.isScoped = true; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
    else { dig.push(part); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
  this.original = original;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
  this.parts    = dig;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
  this.string   = dig.join('.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
  this.depth    = depth;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
  // an ID is simple if it only has one part, and that part is not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
  // `..` or `this`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
  this.isSimple = parts.length === 1 && !this.isScoped && depth === 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
  this.stringModeValue = this.string;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
Handlebars.AST.PartialNameNode = function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
  this.type = "PARTIAL_NAME";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
  this.name = name.original;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
Handlebars.AST.DataNode = function(id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
  this.type = "DATA";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
  this.id = id;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
Handlebars.AST.StringNode = function(string) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
  this.type = "STRING";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
  this.original =
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
    this.string =
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
    this.stringModeValue = string;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
Handlebars.AST.IntegerNode = function(integer) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
  this.type = "INTEGER";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
  this.original =
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
    this.integer = integer;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
  this.stringModeValue = Number(integer);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
Handlebars.AST.BooleanNode = function(bool) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
  this.type = "BOOLEAN";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
  this.bool = bool;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
  this.stringModeValue = bool === "true";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
Handlebars.AST.CommentNode = function(comment) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
  this.type = "comment";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
  this.comment = comment;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
/* THIS FILE IS GENERATED BY A BUILD SCRIPT - DO NOT EDIT! */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
/*jshint eqnull:true*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
var Compiler = Handlebars.Compiler = function() {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
var JavaScriptCompiler = Handlebars.JavaScriptCompiler = function() {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
// the foundHelper register will disambiguate helper lookup from finding a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
// function in a context. This is necessary for mustache compatibility, which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
// requires that context functions in blocks are evaluated by blockHelperMissing,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
// and then proceed as if the resulting value was provided to blockHelperMissing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
Compiler.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
  compiler: Compiler,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
  disassemble: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
    var opcodes = this.opcodes, opcode, out = [], params, param;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
    for (var i=0, l=opcodes.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
      opcode = opcodes[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
      if (opcode.opcode === 'DECLARE') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
        out.push("DECLARE " + opcode.name + "=" + opcode.value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
      } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
        params = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
        for (var j=0; j<opcode.args.length; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
          param = opcode.args[j];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
          if (typeof param === "string") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
            param = "\"" + param.replace("\n", "\\n") + "\"";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
          }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
          params.push(param);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
        out.push(opcode.opcode + " " + params.join(" "));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
    return out.join("\n");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
  equals: function(other) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
    var len = this.opcodes.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
    if (other.opcodes.length !== len) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
      return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
    for (var i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
      var opcode = this.opcodes[i],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
          otherOpcode = other.opcodes[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
      if (opcode.opcode !== otherOpcode.opcode || opcode.args.length !== otherOpcode.args.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
        return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
      for (var j = 0; j < opcode.args.length; j++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
        if (opcode.args[j] !== otherOpcode.args[j]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
          return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
    len = this.children.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
    if (other.children.length !== len) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
      return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
    for (i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
      if (!this.children[i].equals(other.children[i])) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
        return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
    return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
  guid: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
  compile: function(program, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
    this.children = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
    this.depths = {list: []};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
    this.options = options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
    // These changes will propagate to the other compiler components
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
    var knownHelpers = this.options.knownHelpers;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
    this.options.knownHelpers = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
      'helperMissing': true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
      'blockHelperMissing': true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
      'each': true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
      'if': true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
      'unless': true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
      'with': true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
      'log': true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
    if (knownHelpers) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
      for (var name in knownHelpers) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
        this.options.knownHelpers[name] = knownHelpers[name];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
    return this.program(program);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
  accept: function(node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
    return this[node.type](node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
  program: function(program) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
    var statements = program.statements, statement;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
    this.opcodes = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
    for(var i=0, l=statements.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
      statement = statements[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
      this[statement.type](statement);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
    this.isSimple = l === 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
    this.depths.list = this.depths.list.sort(function(a, b) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
      return a - b;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
    return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
  compileProgram: function(program) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
    var result = new this.compiler().compile(program, this.options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
    var guid = this.guid++, depth;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
    this.usePartial = this.usePartial || result.usePartial;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
    this.children[guid] = result;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
    for(var i=0, l=result.depths.list.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
      depth = result.depths.list[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
      if(depth < 2) { continue; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
      else { this.addDepth(depth - 1); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
    return guid;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
  block: function(block) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
    var mustache = block.mustache,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
        program = block.program,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
        inverse = block.inverse;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
    if (program) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
      program = this.compileProgram(program);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
    if (inverse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
      inverse = this.compileProgram(inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
    var type = this.classifyMustache(mustache);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
    if (type === "helper") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
      this.helperMustache(mustache, program, inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
    } else if (type === "simple") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
      this.simpleMustache(mustache);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
      // now that the simple mustache is resolved, we need to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
      // evaluate it by executing `blockHelperMissing`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
      this.opcode('pushProgram', program);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
      this.opcode('pushProgram', inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
      this.opcode('emptyHash');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
      this.opcode('blockValue');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
      this.ambiguousMustache(mustache, program, inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
      // now that the simple mustache is resolved, we need to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
      // evaluate it by executing `blockHelperMissing`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
      this.opcode('pushProgram', program);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
      this.opcode('pushProgram', inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
      this.opcode('emptyHash');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
      this.opcode('ambiguousBlockValue');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
    this.opcode('append');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
  hash: function(hash) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
    var pairs = hash.pairs, pair, val;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
    this.opcode('pushHash');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
    for(var i=0, l=pairs.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
      pair = pairs[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
      val  = pair[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
      if (this.options.stringParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
        if(val.depth) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
          this.addDepth(val.depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
        this.opcode('getContext', val.depth || 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
        this.opcode('pushStringParam', val.stringModeValue, val.type);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
      } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
        this.accept(val);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
      this.opcode('assignToHash', pair[0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
    this.opcode('popHash');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
  partial: function(partial) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
    var partialName = partial.partialName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
    this.usePartial = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
    if(partial.context) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
      this.ID(partial.context);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
      this.opcode('push', 'depth0');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
    this.opcode('invokePartial', partialName.name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
    this.opcode('append');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
  content: function(content) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
    this.opcode('appendContent', content.string);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
  mustache: function(mustache) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
    var options = this.options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
    var type = this.classifyMustache(mustache);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
    if (type === "simple") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
      this.simpleMustache(mustache);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
    } else if (type === "helper") {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
      this.helperMustache(mustache);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
      this.ambiguousMustache(mustache);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
    if(mustache.escaped && !options.noEscape) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
      this.opcode('appendEscaped');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
      this.opcode('append');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
  ambiguousMustache: function(mustache, program, inverse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
    var id = mustache.id,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
        name = id.parts[0],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
        isBlock = program != null || inverse != null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
    this.opcode('getContext', id.depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
    this.opcode('pushProgram', program);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
    this.opcode('pushProgram', inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
    this.opcode('invokeAmbiguous', name, isBlock);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
  simpleMustache: function(mustache) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
    var id = mustache.id;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
    if (id.type === 'DATA') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
      this.DATA(id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
    } else if (id.parts.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
      this.ID(id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
      // Simplified ID for `this`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
      this.addDepth(id.depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
      this.opcode('getContext', id.depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
      this.opcode('pushContext');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
    this.opcode('resolvePossibleLambda');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
  helperMustache: function(mustache, program, inverse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
    var params = this.setupFullMustacheParams(mustache, program, inverse),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
        name = mustache.id.parts[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
    if (this.options.knownHelpers[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
      this.opcode('invokeKnownHelper', params.length, name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
    } else if (this.options.knownHelpersOnly) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
      throw new Error("You specified knownHelpersOnly, but used the unknown helper " + name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
      this.opcode('invokeHelper', params.length, name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
  ID: function(id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
    this.addDepth(id.depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
    this.opcode('getContext', id.depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
    var name = id.parts[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
    if (!name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
      this.opcode('pushContext');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
      this.opcode('lookupOnContext', id.parts[0]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
    for(var i=1, l=id.parts.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   929
      this.opcode('lookup', id.parts[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   930
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   931
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   932
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   933
  DATA: function(data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   934
    this.options.data = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   935
    if (data.id.isScoped || data.id.depth) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   936
      throw new Handlebars.Exception('Scoped data references are not supported: ' + data.original);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   937
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   938
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   939
    this.opcode('lookupData');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   940
    var parts = data.id.parts;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   941
    for(var i=0, l=parts.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   942
      this.opcode('lookup', parts[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   943
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   944
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   945
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   946
  STRING: function(string) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   947
    this.opcode('pushString', string.string);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   948
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   949
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   950
  INTEGER: function(integer) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   951
    this.opcode('pushLiteral', integer.integer);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   952
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   953
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   954
  BOOLEAN: function(bool) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   955
    this.opcode('pushLiteral', bool.bool);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   956
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   957
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   958
  comment: function() {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   959
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   960
  // HELPERS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   961
  opcode: function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   962
    this.opcodes.push({ opcode: name, args: [].slice.call(arguments, 1) });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   963
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   964
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   965
  declare: function(name, value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   966
    this.opcodes.push({ opcode: 'DECLARE', name: name, value: value });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   967
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   968
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   969
  addDepth: function(depth) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   970
    if(isNaN(depth)) { throw new Error("EWOT"); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   971
    if(depth === 0) { return; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   972
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   973
    if(!this.depths[depth]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   974
      this.depths[depth] = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   975
      this.depths.list.push(depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   976
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   977
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   978
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   979
  classifyMustache: function(mustache) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   980
    var isHelper   = mustache.isHelper;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   981
    var isEligible = mustache.eligibleHelper;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   982
    var options    = this.options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   983
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   984
    // if ambiguous, we can possibly resolve the ambiguity now
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   985
    if (isEligible && !isHelper) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   986
      var name = mustache.id.parts[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   987
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   988
      if (options.knownHelpers[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   989
        isHelper = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   990
      } else if (options.knownHelpersOnly) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   991
        isEligible = false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   992
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   993
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   994
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   995
    if (isHelper) { return "helper"; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   996
    else if (isEligible) { return "ambiguous"; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   997
    else { return "simple"; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   998
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   999
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1000
  pushParams: function(params) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1001
    var i = params.length, param;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1002
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1003
    while(i--) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1004
      param = params[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1005
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1006
      if(this.options.stringParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1007
        if(param.depth) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1008
          this.addDepth(param.depth);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1009
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1010
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1011
        this.opcode('getContext', param.depth || 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1012
        this.opcode('pushStringParam', param.stringModeValue, param.type);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1013
      } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1014
        this[param.type](param);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1015
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1016
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1017
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1018
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1019
  setupMustacheParams: function(mustache) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1020
    var params = mustache.params;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1021
    this.pushParams(params);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1022
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1023
    if(mustache.hash) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1024
      this.hash(mustache.hash);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1025
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1026
      this.opcode('emptyHash');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1027
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1028
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1029
    return params;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1030
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1031
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1032
  // this will replace setupMustacheParams when we're done
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1033
  setupFullMustacheParams: function(mustache, program, inverse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1034
    var params = mustache.params;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1035
    this.pushParams(params);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1036
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1037
    this.opcode('pushProgram', program);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1038
    this.opcode('pushProgram', inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1039
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1040
    if(mustache.hash) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1041
      this.hash(mustache.hash);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1042
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1043
      this.opcode('emptyHash');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1044
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1045
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1046
    return params;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1047
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1048
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1049
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1050
var Literal = function(value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1051
  this.value = value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1052
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1053
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1054
JavaScriptCompiler.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1055
  // PUBLIC API: You can override these methods in a subclass to provide
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1056
  // alternative compiled forms for name lookup and buffering semantics
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1057
  nameLookup: function(parent, name /* , type*/) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1058
    if (/^[0-9]+$/.test(name)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1059
      return parent + "[" + name + "]";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1060
    } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1061
      return parent + "." + name;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1062
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1063
    else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1064
      return parent + "['" + name + "']";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1065
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1066
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1067
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1068
  appendToBuffer: function(string) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1069
    if (this.environment.isSimple) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1070
      return "return " + string + ";";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1071
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1072
      return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1073
        appendToBuffer: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1074
        content: string,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1075
        toString: function() { return "buffer += " + string + ";"; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1076
      };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1077
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1078
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1079
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1080
  initializeBuffer: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1081
    return this.quotedString("");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1082
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1083
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1084
  namespace: "Handlebars",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1085
  // END PUBLIC API
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1086
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1087
  compile: function(environment, options, context, asObject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1088
    this.environment = environment;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1089
    this.options = options || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1090
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1091
    Handlebars.log(Handlebars.logger.DEBUG, this.environment.disassemble() + "\n\n");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1092
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1093
    this.name = this.environment.name;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1094
    this.isChild = !!context;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1095
    this.context = context || {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1096
      programs: [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1097
      environments: [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1098
      aliases: { }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1099
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1100
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1101
    this.preamble();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1102
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1103
    this.stackSlot = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1104
    this.stackVars = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1105
    this.registers = { list: [] };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1106
    this.compileStack = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1107
    this.inlineStack = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1108
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1109
    this.compileChildren(environment, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1111
    var opcodes = environment.opcodes, opcode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1112
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1113
    this.i = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1114
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1115
    for(l=opcodes.length; this.i<l; this.i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1116
      opcode = opcodes[this.i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1117
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1118
      if(opcode.opcode === 'DECLARE') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1119
        this[opcode.name] = opcode.value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1120
      } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1121
        this[opcode.opcode].apply(this, opcode.args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1122
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1123
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1124
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1125
    return this.createFunctionContext(asObject);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1126
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1128
  nextOpcode: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1129
    var opcodes = this.environment.opcodes;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1130
    return opcodes[this.i + 1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1131
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1132
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1133
  eat: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1134
    this.i = this.i + 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1135
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1136
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1137
  preamble: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1138
    var out = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1140
    if (!this.isChild) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1141
      var namespace = this.namespace;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1142
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1143
      var copies = "helpers = this.merge(helpers, " + namespace + ".helpers);";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1144
      if (this.environment.usePartial) { copies = copies + " partials = this.merge(partials, " + namespace + ".partials);"; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1145
      if (this.options.data) { copies = copies + " data = data || {};"; }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1146
      out.push(copies);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1147
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1148
      out.push('');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1149
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1150
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1151
    if (!this.environment.isSimple) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1152
      out.push(", buffer = " + this.initializeBuffer());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1153
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1154
      out.push("");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1155
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1156
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1157
    // track the last context pushed into place to allow skipping the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1158
    // getContext opcode when it would be a noop
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1159
    this.lastContext = 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1160
    this.source = out;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1161
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1162
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1163
  createFunctionContext: function(asObject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1164
    var locals = this.stackVars.concat(this.registers.list);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1165
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1166
    if(locals.length > 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1167
      this.source[1] = this.source[1] + ", " + locals.join(", ");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1168
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1169
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1170
    // Generate minimizer alias mappings
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1171
    if (!this.isChild) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1172
      for (var alias in this.context.aliases) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1173
        if (this.context.aliases.hasOwnProperty(alias)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1174
          this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1175
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1176
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1177
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1179
    if (this.source[1]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1180
      this.source[1] = "var " + this.source[1].substring(2) + ";";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1181
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1183
    // Merge children
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1184
    if (!this.isChild) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1185
      this.source[1] += '\n' + this.context.programs.join('\n') + '\n';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1186
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1187
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1188
    if (!this.environment.isSimple) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1189
      this.source.push("return buffer;");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1190
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1191
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1192
    var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1193
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1194
    for(var i=0, l=this.environment.depths.list.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1195
      params.push("depth" + this.environment.depths.list[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1196
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1198
    // Perform a second pass over the output to merge content when possible
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1199
    var source = this.mergeSource();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1200
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1201
    if (!this.isChild) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1202
      var revision = Handlebars.COMPILER_REVISION,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1203
          versions = Handlebars.REVISION_CHANGES[revision];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1204
      source = "this.compilerInfo = ["+revision+",'"+versions+"'];\n"+source;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1205
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1206
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1207
    if (asObject) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1208
      params.push(source);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1209
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1210
      return Function.apply(this, params);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1211
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1212
      var functionSource = 'function ' + (this.name || '') + '(' + params.join(',') + ') {\n  ' + source + '}';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1213
      Handlebars.log(Handlebars.logger.DEBUG, functionSource + "\n\n");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1214
      return functionSource;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1215
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1216
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1217
  mergeSource: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1218
    // WARN: We are not handling the case where buffer is still populated as the source should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1219
    // not have buffer append operations as their final action.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1220
    var source = '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1221
        buffer;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1222
    for (var i = 0, len = this.source.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1223
      var line = this.source[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1224
      if (line.appendToBuffer) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1225
        if (buffer) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1226
          buffer = buffer + '\n    + ' + line.content;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1227
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1228
          buffer = line.content;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1229
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1230
      } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1231
        if (buffer) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1232
          source += 'buffer += ' + buffer + ';\n  ';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1233
          buffer = undefined;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1234
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1235
        source += line + '\n  ';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1236
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1237
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1238
    return source;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1239
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1240
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1241
  // [blockValue]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1242
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1243
  // On stack, before: hash, inverse, program, value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1244
  // On stack, after: return value of blockHelperMissing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1245
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1246
  // The purpose of this opcode is to take a block of the form
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1247
  // `{{#foo}}...{{/foo}}`, resolve the value of `foo`, and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1248
  // replace it on the stack with the result of properly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1249
  // invoking blockHelperMissing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1250
  blockValue: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1251
    this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1252
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1253
    var params = ["depth0"];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1254
    this.setupParams(0, params);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1255
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1256
    this.replaceStack(function(current) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1257
      params.splice(1, 0, current);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1258
      return "blockHelperMissing.call(" + params.join(", ") + ")";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1259
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1260
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1261
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1262
  // [ambiguousBlockValue]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1263
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1264
  // On stack, before: hash, inverse, program, value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1265
  // Compiler value, before: lastHelper=value of last found helper, if any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1266
  // On stack, after, if no lastHelper: same as [blockValue]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1267
  // On stack, after, if lastHelper: value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1268
  ambiguousBlockValue: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1269
    this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1270
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1271
    var params = ["depth0"];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1272
    this.setupParams(0, params);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1273
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1274
    var current = this.topStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1275
    params.splice(1, 0, current);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1276
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1277
    // Use the options value generated from the invocation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1278
    params[params.length-1] = 'options';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1279
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1280
    this.source.push("if (!" + this.lastHelper + ") { " + current + " = blockHelperMissing.call(" + params.join(", ") + "); }");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1281
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1282
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1283
  // [appendContent]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1284
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1285
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1286
  // On stack, after: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1287
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1288
  // Appends the string value of `content` to the current buffer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1289
  appendContent: function(content) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1290
    this.source.push(this.appendToBuffer(this.quotedString(content)));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1291
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1293
  // [append]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1294
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1295
  // On stack, before: value, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1296
  // On stack, after: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1297
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1298
  // Coerces `value` to a String and appends it to the current buffer.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1299
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1300
  // If `value` is truthy, or 0, it is coerced into a string and appended
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1301
  // Otherwise, the empty string is appended
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1302
  append: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1303
    // Force anything that is inlined onto the stack so we don't have duplication
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1304
    // when we examine local
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1305
    this.flushInline();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1306
    var local = this.popStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1307
    this.source.push("if(" + local + " || " + local + " === 0) { " + this.appendToBuffer(local) + " }");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1308
    if (this.environment.isSimple) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1309
      this.source.push("else { " + this.appendToBuffer("''") + " }");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1310
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1311
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1312
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1313
  // [appendEscaped]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1314
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1315
  // On stack, before: value, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1316
  // On stack, after: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1317
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1318
  // Escape `value` and append it to the buffer
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1319
  appendEscaped: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1320
    this.context.aliases.escapeExpression = 'this.escapeExpression';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1321
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1322
    this.source.push(this.appendToBuffer("escapeExpression(" + this.popStack() + ")"));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1323
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1324
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1325
  // [getContext]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1326
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1327
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1328
  // On stack, after: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1329
  // Compiler value, after: lastContext=depth
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1330
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1331
  // Set the value of the `lastContext` compiler value to the depth
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1332
  getContext: function(depth) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1333
    if(this.lastContext !== depth) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1334
      this.lastContext = depth;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1335
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1336
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1337
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1338
  // [lookupOnContext]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1339
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1340
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1341
  // On stack, after: currentContext[name], ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1342
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1343
  // Looks up the value of `name` on the current context and pushes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1344
  // it onto the stack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1345
  lookupOnContext: function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1346
    this.push(this.nameLookup('depth' + this.lastContext, name, 'context'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1347
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1348
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1349
  // [pushContext]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1350
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1351
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1352
  // On stack, after: currentContext, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1353
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1354
  // Pushes the value of the current context onto the stack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1355
  pushContext: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1356
    this.pushStackLiteral('depth' + this.lastContext);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1357
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1358
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1359
  // [resolvePossibleLambda]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1360
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1361
  // On stack, before: value, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1362
  // On stack, after: resolved value, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1363
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1364
  // If the `value` is a lambda, replace it on the stack by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1365
  // the return value of the lambda
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1366
  resolvePossibleLambda: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1367
    this.context.aliases.functionType = '"function"';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1368
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1369
    this.replaceStack(function(current) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1370
      return "typeof " + current + " === functionType ? " + current + ".apply(depth0) : " + current;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1371
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1372
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1373
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1374
  // [lookup]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1375
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1376
  // On stack, before: value, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1377
  // On stack, after: value[name], ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1378
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1379
  // Replace the value on the stack with the result of looking
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1380
  // up `name` on `value`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1381
  lookup: function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1382
    this.replaceStack(function(current) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1383
      return current + " == null || " + current + " === false ? " + current + " : " + this.nameLookup(current, name, 'context');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1384
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1385
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1387
  // [lookupData]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1388
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1389
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1390
  // On stack, after: data[id], ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1391
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1392
  // Push the result of looking up `id` on the current data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1393
  lookupData: function(id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1394
    this.push('data');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1395
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1396
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1397
  // [pushStringParam]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1398
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1399
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1400
  // On stack, after: string, currentContext, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1401
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1402
  // This opcode is designed for use in string mode, which
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1403
  // provides the string value of a parameter along with its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1404
  // depth rather than resolving it immediately.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1405
  pushStringParam: function(string, type) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1406
    this.pushStackLiteral('depth' + this.lastContext);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1407
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1408
    this.pushString(type);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1409
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1410
    if (typeof string === 'string') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1411
      this.pushString(string);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1412
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1413
      this.pushStackLiteral(string);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1414
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1415
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1416
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1417
  emptyHash: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1418
    this.pushStackLiteral('{}');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1419
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1420
    if (this.options.stringParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1421
      this.register('hashTypes', '{}');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1422
      this.register('hashContexts', '{}');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1423
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1424
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1425
  pushHash: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1426
    this.hash = {values: [], types: [], contexts: []};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1427
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1428
  popHash: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1429
    var hash = this.hash;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1430
    this.hash = undefined;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1431
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1432
    if (this.options.stringParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1433
      this.register('hashContexts', '{' + hash.contexts.join(',') + '}');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1434
      this.register('hashTypes', '{' + hash.types.join(',') + '}');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1435
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1436
    this.push('{\n    ' + hash.values.join(',\n    ') + '\n  }');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1437
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1438
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1439
  // [pushString]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1440
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1441
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1442
  // On stack, after: quotedString(string), ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1443
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1444
  // Push a quoted version of `string` onto the stack
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1445
  pushString: function(string) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1446
    this.pushStackLiteral(this.quotedString(string));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1447
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1448
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1449
  // [push]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1450
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1451
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1452
  // On stack, after: expr, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1453
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1454
  // Push an expression onto the stack
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1455
  push: function(expr) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1456
    this.inlineStack.push(expr);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1457
    return expr;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1458
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1459
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1460
  // [pushLiteral]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1461
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1462
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1463
  // On stack, after: value, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1464
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1465
  // Pushes a value onto the stack. This operation prevents
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1466
  // the compiler from creating a temporary variable to hold
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1467
  // it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1468
  pushLiteral: function(value) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1469
    this.pushStackLiteral(value);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1470
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1471
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1472
  // [pushProgram]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1473
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1474
  // On stack, before: ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1475
  // On stack, after: program(guid), ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1476
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1477
  // Push a program expression onto the stack. This takes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1478
  // a compile-time guid and converts it into a runtime-accessible
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1479
  // expression.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1480
  pushProgram: function(guid) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1481
    if (guid != null) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1482
      this.pushStackLiteral(this.programExpression(guid));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1483
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1484
      this.pushStackLiteral(null);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1485
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1486
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1487
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1488
  // [invokeHelper]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1489
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1490
  // On stack, before: hash, inverse, program, params..., ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1491
  // On stack, after: result of helper invocation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1492
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1493
  // Pops off the helper's parameters, invokes the helper,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1494
  // and pushes the helper's return value onto the stack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1495
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1496
  // If the helper is not found, `helperMissing` is called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1497
  invokeHelper: function(paramSize, name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1498
    this.context.aliases.helperMissing = 'helpers.helperMissing';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1499
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1500
    var helper = this.lastHelper = this.setupHelper(paramSize, name, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1501
    var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1502
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1503
    this.push(helper.name + ' || ' + nonHelper);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1504
    this.replaceStack(function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1505
      return name + ' ? ' + name + '.call(' +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1506
          helper.callParams + ") " + ": helperMissing.call(" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1507
          helper.helperMissingParams + ")";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1508
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1509
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1511
  // [invokeKnownHelper]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1512
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1513
  // On stack, before: hash, inverse, program, params..., ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1514
  // On stack, after: result of helper invocation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1515
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1516
  // This operation is used when the helper is known to exist,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1517
  // so a `helperMissing` fallback is not required.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1518
  invokeKnownHelper: function(paramSize, name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1519
    var helper = this.setupHelper(paramSize, name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1520
    this.push(helper.name + ".call(" + helper.callParams + ")");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1521
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1522
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1523
  // [invokeAmbiguous]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1524
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1525
  // On stack, before: hash, inverse, program, params..., ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1526
  // On stack, after: result of disambiguation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1527
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1528
  // This operation is used when an expression like `{{foo}}`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1529
  // is provided, but we don't know at compile-time whether it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1530
  // is a helper or a path.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1531
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1532
  // This operation emits more code than the other options,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1533
  // and can be avoided by passing the `knownHelpers` and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1534
  // `knownHelpersOnly` flags at compile-time.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1535
  invokeAmbiguous: function(name, helperCall) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1536
    this.context.aliases.functionType = '"function"';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1537
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1538
    this.pushStackLiteral('{}');    // Hash value
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1539
    var helper = this.setupHelper(0, name, helperCall);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1540
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1541
    var helperName = this.lastHelper = this.nameLookup('helpers', name, 'helper');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1542
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1543
    var nonHelper = this.nameLookup('depth' + this.lastContext, name, 'context');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1544
    var nextStack = this.nextStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1545
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1546
    this.source.push('if (' + nextStack + ' = ' + helperName + ') { ' + nextStack + ' = ' + nextStack + '.call(' + helper.callParams + '); }');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1547
    this.source.push('else { ' + nextStack + ' = ' + nonHelper + '; ' + nextStack + ' = typeof ' + nextStack + ' === functionType ? ' + nextStack + '.apply(depth0) : ' + nextStack + '; }');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1548
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1549
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1550
  // [invokePartial]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1551
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1552
  // On stack, before: context, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1553
  // On stack after: result of partial invocation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1554
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1555
  // This operation pops off a context, invokes a partial with that context,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1556
  // and pushes the result of the invocation back.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1557
  invokePartial: function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1558
    var params = [this.nameLookup('partials', name, 'partial'), "'" + name + "'", this.popStack(), "helpers", "partials"];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1559
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1560
    if (this.options.data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1561
      params.push("data");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1562
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1563
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1564
    this.context.aliases.self = "this";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1565
    this.push("self.invokePartial(" + params.join(", ") + ")");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1566
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1568
  // [assignToHash]
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1569
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1570
  // On stack, before: value, hash, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1571
  // On stack, after: hash, ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1572
  //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1573
  // Pops a value and hash off the stack, assigns `hash[key] = value`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1574
  // and pushes the hash back onto the stack.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1575
  assignToHash: function(key) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1576
    var value = this.popStack(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1577
        context,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1578
        type;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1579
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1580
    if (this.options.stringParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1581
      type = this.popStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1582
      context = this.popStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1583
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1584
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1585
    var hash = this.hash;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1586
    if (context) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1587
      hash.contexts.push("'" + key + "': " + context);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1588
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1589
    if (type) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1590
      hash.types.push("'" + key + "': " + type);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1591
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1592
    hash.values.push("'" + key + "': (" + value + ")");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1593
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1594
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1595
  // HELPERS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1596
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1597
  compiler: JavaScriptCompiler,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1598
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1599
  compileChildren: function(environment, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1600
    var children = environment.children, child, compiler;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1601
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1602
    for(var i=0, l=children.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1603
      child = children[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1604
      compiler = new this.compiler();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1605
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1606
      var index = this.matchExistingProgram(child);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1607
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1608
      if (index == null) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1609
        this.context.programs.push('');     // Placeholder to prevent name conflicts for nested children
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1610
        index = this.context.programs.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1611
        child.index = index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1612
        child.name = 'program' + index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1613
        this.context.programs[index] = compiler.compile(child, options, this.context);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1614
        this.context.environments[index] = child;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1615
      } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1616
        child.index = index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1617
        child.name = 'program' + index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1618
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1619
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1620
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1621
  matchExistingProgram: function(child) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1622
    for (var i = 0, len = this.context.environments.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1623
      var environment = this.context.environments[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1624
      if (environment && environment.equals(child)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1625
        return i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1626
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1627
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1628
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1629
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1630
  programExpression: function(guid) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1631
    this.context.aliases.self = "this";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1632
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1633
    if(guid == null) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1634
      return "self.noop";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1635
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1636
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1637
    var child = this.environment.children[guid],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1638
        depths = child.depths.list, depth;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1639
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1640
    var programParams = [child.index, child.name, "data"];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1641
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1642
    for(var i=0, l = depths.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1643
      depth = depths[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1644
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1645
      if(depth === 1) { programParams.push("depth0"); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1646
      else { programParams.push("depth" + (depth - 1)); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1647
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1648
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1649
    return (depths.length === 0 ? "self.program(" : "self.programWithDepth(") + programParams.join(", ") + ")";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1650
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1651
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1652
  register: function(name, val) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1653
    this.useRegister(name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1654
    this.source.push(name + " = " + val + ";");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1655
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1656
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1657
  useRegister: function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1658
    if(!this.registers[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1659
      this.registers[name] = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1660
      this.registers.list.push(name);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1661
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1662
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1663
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1664
  pushStackLiteral: function(item) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1665
    return this.push(new Literal(item));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1666
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1667
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1668
  pushStack: function(item) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1669
    this.flushInline();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1670
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1671
    var stack = this.incrStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1672
    if (item) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1673
      this.source.push(stack + " = " + item + ";");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1674
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1675
    this.compileStack.push(stack);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1676
    return stack;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1677
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1678
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1679
  replaceStack: function(callback) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1680
    var prefix = '',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1681
        inline = this.isInline(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1682
        stack;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1683
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1684
    // If we are currently inline then we want to merge the inline statement into the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1685
    // replacement statement via ','
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1686
    if (inline) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1687
      var top = this.popStack(true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1688
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1689
      if (top instanceof Literal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1690
        // Literals do not need to be inlined
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1691
        stack = top.value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1692
      } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1693
        // Get or create the current stack name for use by the inline
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1694
        var name = this.stackSlot ? this.topStackName() : this.incrStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1695
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1696
        prefix = '(' + this.push(name) + ' = ' + top + '),';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1697
        stack = this.topStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1698
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1699
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1700
      stack = this.topStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1701
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1702
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1703
    var item = callback.call(this, stack);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1704
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1705
    if (inline) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1706
      if (this.inlineStack.length || this.compileStack.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1707
        this.popStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1708
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1709
      this.push('(' + prefix + item + ')');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1710
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1711
      // Prevent modification of the context depth variable. Through replaceStack
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1712
      if (!/^stack/.test(stack)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1713
        stack = this.nextStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1714
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1715
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1716
      this.source.push(stack + " = (" + prefix + item + ");");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1717
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1718
    return stack;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1719
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1720
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1721
  nextStack: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1722
    return this.pushStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1723
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1724
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1725
  incrStack: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1726
    this.stackSlot++;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1727
    if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1728
    return this.topStackName();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1729
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1730
  topStackName: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1731
    return "stack" + this.stackSlot;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1732
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1733
  flushInline: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1734
    var inlineStack = this.inlineStack;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1735
    if (inlineStack.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1736
      this.inlineStack = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1737
      for (var i = 0, len = inlineStack.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1738
        var entry = inlineStack[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1739
        if (entry instanceof Literal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1740
          this.compileStack.push(entry);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1741
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1742
          this.pushStack(entry);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1743
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1744
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1745
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1746
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1747
  isInline: function() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1748
    return this.inlineStack.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1749
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1750
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1751
  popStack: function(wrapped) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1752
    var inline = this.isInline(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1753
        item = (inline ? this.inlineStack : this.compileStack).pop();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1754
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1755
    if (!wrapped && (item instanceof Literal)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1756
      return item.value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1757
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1758
      if (!inline) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1759
        this.stackSlot--;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1760
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1761
      return item;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1762
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1763
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1764
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1765
  topStack: function(wrapped) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1766
    var stack = (this.isInline() ? this.inlineStack : this.compileStack),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1767
        item = stack[stack.length - 1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1768
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1769
    if (!wrapped && (item instanceof Literal)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1770
      return item.value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1771
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1772
      return item;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1773
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1774
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1775
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1776
  quotedString: function(str) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1777
    return '"' + str
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1778
      .replace(/\\/g, '\\\\')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1779
      .replace(/"/g, '\\"')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1780
      .replace(/\n/g, '\\n')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1781
      .replace(/\r/g, '\\r')
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1782
      .replace(/\u2028/g, '\\u2028')   // Per Ecma-262 7.3 + 7.8.4
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1783
      .replace(/\u2029/g, '\\u2029') + '"';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1784
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1785
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1786
  setupHelper: function(paramSize, name, missingParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1787
    var params = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1788
    this.setupParams(paramSize, params, missingParams);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1789
    var foundHelper = this.nameLookup('helpers', name, 'helper');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1790
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1791
    return {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1792
      params: params,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1793
      name: foundHelper,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1794
      callParams: ["depth0"].concat(params).join(", "),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1795
      helperMissingParams: missingParams && ["depth0", this.quotedString(name)].concat(params).join(", ")
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1796
    };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1797
  },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1798
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1799
  // the params and contexts arguments are passed in arrays
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1800
  // to fill in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1801
  setupParams: function(paramSize, params, useRegister) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1802
    var options = [], contexts = [], types = [], param, inverse, program;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1803
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1804
    options.push("hash:" + this.popStack());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1805
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1806
    inverse = this.popStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1807
    program = this.popStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1808
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1809
    // Avoid setting fn and inverse if neither are set. This allows
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1810
    // helpers to do a check for `if (options.fn)`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1811
    if (program || inverse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1812
      if (!program) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1813
        this.context.aliases.self = "this";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1814
        program = "self.noop";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1815
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1816
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1817
      if (!inverse) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1818
       this.context.aliases.self = "this";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1819
        inverse = "self.noop";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1820
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1821
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1822
      options.push("inverse:" + inverse);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1823
      options.push("fn:" + program);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1824
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1825
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1826
    for(var i=0; i<paramSize; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1827
      param = this.popStack();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1828
      params.push(param);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1829
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1830
      if(this.options.stringParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1831
        types.push(this.popStack());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1832
        contexts.push(this.popStack());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1833
      }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1834
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1835
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1836
    if (this.options.stringParams) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1837
      options.push("contexts:[" + contexts.join(",") + "]");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1838
      options.push("types:[" + types.join(",") + "]");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1839
      options.push("hashContexts:hashContexts");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1840
      options.push("hashTypes:hashTypes");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1841
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1842
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1843
    if(this.options.data) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1844
      options.push("data:data");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1845
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1846
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1847
    options = "{" + options.join(",") + "}";
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1848
    if (useRegister) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1849
      this.register('options', options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1850
      params.push('options');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1851
    } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1852
      params.push(options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1853
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1854
    return params.join(", ");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1855
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1856
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1857
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1858
var reservedWords = (
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1859
  "break else new var" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1860
  " case finally return void" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1861
  " catch for switch while" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1862
  " continue function this with" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1863
  " default if throw" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1864
  " delete in try" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1865
  " do instanceof typeof" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1866
  " abstract enum int short" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1867
  " boolean export interface static" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1868
  " byte extends long super" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1869
  " char final native synchronized" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1870
  " class float package throws" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1871
  " const goto private transient" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1872
  " debugger implements protected volatile" +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1873
  " double import public let yield"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1874
).split(" ");
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1875
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1876
var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1877
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1878
for(var i=0, l=reservedWords.length; i<l; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1879
  compilerWords[reservedWords[i]] = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1880
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1881
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1882
JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1883
  if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1884
    return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1885
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1886
  return false;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1887
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1888
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1889
Handlebars.precompile = function(input, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1890
  if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1891
    throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.precompile. You passed " + input);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1892
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1893
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1894
  options = options || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1895
  if (!('data' in options)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1896
    options.data = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1897
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1898
  var ast = Handlebars.parse(input);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1899
  var environment = new Compiler().compile(ast, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1900
  return new JavaScriptCompiler().compile(environment, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1901
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1902
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1903
Handlebars.compile = function(input, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1904
  if (input == null || (typeof input !== 'string' && input.constructor !== Handlebars.AST.ProgramNode)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1905
    throw new Handlebars.Exception("You must pass a string or Handlebars AST to Handlebars.compile. You passed " + input);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1906
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1907
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1908
  options = options || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1909
  if (!('data' in options)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1910
    options.data = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1911
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1912
  var compiled;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1913
  function compile() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1914
    var ast = Handlebars.parse(input);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1915
    var environment = new Compiler().compile(ast, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1916
    var templateSpec = new JavaScriptCompiler().compile(environment, options, undefined, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1917
    return Handlebars.template(templateSpec);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1918
  }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1919
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1920
  // Template is only compiled on first use and cached after that point.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1921
  return function(context, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1922
    if (!compiled) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1923
      compiled = compile();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1924
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1925
    return compiled.call(this, context, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1926
  };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1927
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1928
// This file contains YUI-specific wrapper code and overrides for the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1929
// handlebars-compiler module.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1930
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1931
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1932
Handlebars parser and compiler. Use this module when you need to compile
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1933
Handlebars templates.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1934
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1935
@module handlebars
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1936
@submodule handlebars-compiler
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1937
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1938
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1939
var levels = ['debug', 'info', 'warn', 'error'];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1940
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1941
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1942
Logs a debugging message. Note that messages will only be logged when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1943
handlebars module is loaded in "debug" mode.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1944
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1945
@method log
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1946
@param {String} level Log level for this message. Supported levels are "debug",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1947
    "info", "warn", and "error".
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1948
@param {String} message Message to log.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1949
@for Handlebars
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1950
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1951
Handlebars.logger.log = function (level, message) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1952
    Y.log(message, levels[level] || 'error', 'Handlebars');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1953
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1954
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1955
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1956
Compiles and renders a Handlebars template string in a single step.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1957
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1958
If you'll be using a template more than once, it's more efficient to compile it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1959
into a function once using `compile()`, and then render it whenever you need to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1960
by simply executing the compiled function. However, if you only need to compile
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1961
and render a template once, `render()` is a handy shortcut for doing both in a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1962
single step.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1963
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1964
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1965
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1966
    Y.Handlebars.render('The pie of the day is {{pie}}!', {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1967
        pie: 'Maple Custard'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1968
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1969
    // => "The pie of the day is Maple Custard!"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1970
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1971
@method render
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1972
@param {String} string Handlebars template string to render.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1973
@param {Object} context Context object to pass to the template.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1974
@param {Object} [options] Compile/render options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1975
    @param {Object} [options.helpers] Helper functions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1976
    @param {Object} [options.partials] Partials.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1977
    @param {Object} [options.data] Data.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1978
@return {String} Rendered template string.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1979
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1980
Handlebars.render = function (string, context, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1981
    return Handlebars.compile(string)(context, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1982
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1983
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1984
// The rest of this file is just API docs for methods defined in Handlebars
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1985
// itself.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1986
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1987
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1988
Compiles a Handlebars template string into a function. To render the template,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1989
call the function and pass in a context object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1990
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1991
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1992
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1993
    var template = Y.Handlebars.compile('The pie of the day is {{pie}}!.');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1994
    template({pie: 'Pecan'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1995
    // => "The pie of the day is Pecan!"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1996
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1997
@method compile
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1998
@param {String} string Handlebars template string to compile.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  1999
@param {Object} [options] Compiler options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2000
@return {Function} Compiled template function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2001
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2002
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2003
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2004
Precompiles a Handlebars template string into a string of JavaScript code. This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2005
can be used to precompile a template at build time or on the server, and the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2006
resulting template can then be rendered at runtime or on the client without
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2007
needing to go through a compile step.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2008
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2009
To render a precompiled template, evaluate the code and then pass the resulting
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2010
function to `Y.Handlebars.template()` to get back an executable template
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2011
function.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2012
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2013
@method precompile
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2014
@param {String} string Handlebars template string to compile.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2015
@param {Object} [options] Compiler options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2016
@return {String} Precompiled template code.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2017
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2018
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2019
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
  2020
}, '@VERSION@', {"requires": ["handlebars-base"]});