timeline/lib/mustache.js
author veltr
Fri, 25 May 2012 16:32:31 +0200
changeset 68 4def147b1604
parent 65 03bbfd9cd3c6
permissions -rw-r--r--
Added a visualization of the contents of clusters + mousewheel support
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
65
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     1
/*!
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     2
 * mustache.js - Logic-less {{mustache}} templates with JavaScript
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     3
 * http://github.com/janl/mustache.js
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     4
 */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     5
var Mustache = (typeof module !== "undefined" && module.exports) || {};
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     6
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     7
(function (exports) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     8
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
     9
  exports.name = "mustache.js";
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    10
  exports.version = "0.5.0-dev";
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    11
  exports.tags = ["{{", "}}"];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    12
  exports.parse = parse;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    13
  exports.compile = compile;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    14
  exports.render = render;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    15
  exports.clearCache = clearCache;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    16
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    17
  // This is here for backwards compatibility with 0.4.x.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    18
  exports.to_html = function (template, view, partials, send) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    19
    var result = render(template, view, partials);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    20
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    21
    if (typeof send === "function") {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    22
      send(result);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    23
    } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    24
      return result;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    25
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    26
  };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    27
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    28
  var _toString = Object.prototype.toString;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    29
  var _isArray = Array.isArray;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    30
  var _forEach = Array.prototype.forEach;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    31
  var _trim = String.prototype.trim;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    32
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    33
  var isArray;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    34
  if (_isArray) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    35
    isArray = _isArray;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    36
  } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    37
    isArray = function (obj) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    38
      return _toString.call(obj) === "[object Array]";
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    39
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    40
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    41
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    42
  var forEach;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    43
  if (_forEach) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    44
    forEach = function (obj, callback, scope) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    45
      return _forEach.call(obj, callback, scope);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    46
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    47
  } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    48
    forEach = function (obj, callback, scope) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    49
      for (var i = 0, len = obj.length; i < len; ++i) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    50
        callback.call(scope, obj[i], i, obj);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    51
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    52
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    53
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    54
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    55
  var spaceRe = /^\s*$/;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    56
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    57
  function isWhitespace(string) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    58
    return spaceRe.test(string);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    59
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    60
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    61
  var trim;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    62
  if (_trim) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    63
    trim = function (string) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    64
      return string == null ? "" : _trim.call(string);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    65
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    66
  } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    67
    var trimLeft, trimRight;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    68
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    69
    if (isWhitespace("\xA0")) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    70
      trimLeft = /^\s+/;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    71
      trimRight = /\s+$/;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    72
    } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    73
      // IE doesn't match non-breaking spaces with \s, thanks jQuery.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    74
      trimLeft = /^[\s\xA0]+/;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    75
      trimRight = /[\s\xA0]+$/;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    76
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    77
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    78
    trim = function (string) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    79
      return string == null ? "" :
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    80
        String(string).replace(trimLeft, "").replace(trimRight, "");
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    81
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    82
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    83
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    84
  var escapeMap = {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    85
    "&": "&amp;",
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    86
    "<": "&lt;",
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    87
    ">": "&gt;",
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    88
    '"': '&quot;',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    89
    "'": '&#39;'
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    90
  };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    91
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    92
  function escapeHTML(string) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    93
    return String(string).replace(/&(?!\w+;)|[<>"']/g, function (s) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    94
      return escapeMap[s] || s;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    95
    });
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    96
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    97
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    98
  /**
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
    99
   * Adds the `template`, `line`, and `file` properties to the given error
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   100
   * object and alters the message to provide more useful debugging information.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   101
   */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   102
  function debug(e, template, line, file) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   103
    file = file || "<template>";
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   104
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   105
    var lines = template.split("\n"),
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   106
        start = Math.max(line - 3, 0),
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   107
        end = Math.min(lines.length, line + 3),
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   108
        context = lines.slice(start, end);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   109
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   110
    var c;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   111
    for (var i = 0, len = context.length; i < len; ++i) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   112
      c = i + start + 1;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   113
      context[i] = (c === line ? " >> " : "    ") + context[i];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   114
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   115
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   116
    e.template = template;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   117
    e.line = line;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   118
    e.file = file;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   119
    e.message = [file + ":" + line, context.join("\n"), "", e.message].join("\n");
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   120
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   121
    return e;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   122
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   123
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   124
  /**
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   125
   * Looks up the value of the given `name` in the given context `stack`.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   126
   */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   127
  function lookup(name, stack, defaultValue) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   128
    if (name === ".") {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   129
      return stack[stack.length - 1];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   130
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   131
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   132
    var names = name.split(".");
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   133
    var lastIndex = names.length - 1;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   134
    var target = names[lastIndex];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   135
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   136
    var value, context, i = stack.length, j, localStack;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   137
    while (i) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   138
      localStack = stack.slice(0);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   139
      context = stack[--i];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   140
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   141
      j = 0;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   142
      while (j < lastIndex) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   143
        context = context[names[j++]];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   144
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   145
        if (context == null) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   146
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   147
        }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   148
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   149
        localStack.push(context);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   150
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   151
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   152
      if (context && typeof context === "object" && target in context) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   153
        value = context[target];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   154
        break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   155
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   156
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   157
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   158
    // If the value is a function, call it in the current context.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   159
    if (typeof value === "function") {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   160
      value = value.call(localStack[localStack.length - 1]);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   161
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   162
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   163
    if (value == null)  {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   164
      return defaultValue;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   165
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   166
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   167
    return value;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   168
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   169
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   170
  function renderSection(name, stack, callback, inverted) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   171
    var buffer = "";
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   172
    var value =  lookup(name, stack);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   173
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   174
    if (inverted) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   175
      // From the spec: inverted sections may render text once based on the
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   176
      // inverse value of the key. That is, they will be rendered if the key
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   177
      // doesn't exist, is false, or is an empty list.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   178
      if (value == null || value === false || (isArray(value) && value.length === 0)) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   179
        buffer += callback();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   180
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   181
    } else if (isArray(value)) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   182
      forEach(value, function (value) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   183
        stack.push(value);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   184
        buffer += callback();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   185
        stack.pop();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   186
      });
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   187
    } else if (typeof value === "object") {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   188
      stack.push(value);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   189
      buffer += callback();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   190
      stack.pop();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   191
    } else if (typeof value === "function") {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   192
      var scope = stack[stack.length - 1];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   193
      var scopedRender = function (template) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   194
        return render(template, scope);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   195
      };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   196
      buffer += value.call(scope, callback(), scopedRender) || "";
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   197
    } else if (value) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   198
      buffer += callback();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   199
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   200
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   201
    return buffer;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   202
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   203
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   204
  /**
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   205
   * Parses the given `template` and returns the source of a function that,
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   206
   * with the proper arguments, will render the template. Recognized options
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   207
   * include the following:
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   208
   *
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   209
   *   - file     The name of the file the template comes from (displayed in
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   210
   *              error messages)
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   211
   *   - tags     An array of open and close tags the `template` uses. Defaults
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   212
   *              to the value of Mustache.tags
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   213
   *   - debug    Set `true` to log the body of the generated function to the
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   214
   *              console
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   215
   *   - space    Set `true` to preserve whitespace from lines that otherwise
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   216
   *              contain only a {{tag}}. Defaults to `false`
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   217
   */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   218
  function parse(template, options) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   219
    options = options || {};
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   220
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   221
    var tags = options.tags || exports.tags,
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   222
        openTag = tags[0],
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   223
        closeTag = tags[tags.length - 1];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   224
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   225
    var code = [
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   226
      'var buffer = "";', // output buffer
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   227
      "\nvar line = 1;", // keep track of source line number
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   228
      "\ntry {",
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   229
      '\nbuffer += "'
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   230
    ];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   231
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   232
    var spaces = [],      // indices of whitespace in code on the current line
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   233
        hasTag = false,   // is there a {{tag}} on the current line?
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   234
        nonSpace = false; // is there a non-space char on the current line?
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   235
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   236
    // Strips all space characters from the code array for the current line
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   237
    // if there was a {{tag}} on it and otherwise only spaces.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   238
    var stripSpace = function () {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   239
      if (hasTag && !nonSpace && !options.space) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   240
        while (spaces.length) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   241
          code.splice(spaces.pop(), 1);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   242
        }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   243
      } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   244
        spaces = [];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   245
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   246
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   247
      hasTag = false;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   248
      nonSpace = false;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   249
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   250
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   251
    var sectionStack = [], updateLine, nextOpenTag, nextCloseTag;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   252
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   253
    var setTags = function (source) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   254
      tags = trim(source).split(/\s+/);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   255
      nextOpenTag = tags[0];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   256
      nextCloseTag = tags[tags.length - 1];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   257
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   258
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   259
    var includePartial = function (source) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   260
      code.push(
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   261
        '";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   262
        updateLine,
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   263
        '\nvar partial = partials["' + trim(source) + '"];',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   264
        '\nif (partial) {',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   265
        '\n  buffer += render(partial,stack[stack.length - 1],partials);',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   266
        '\n}',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   267
        '\nbuffer += "'
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   268
      );
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   269
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   270
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   271
    var openSection = function (source, inverted) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   272
      var name = trim(source);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   273
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   274
      if (name === "") {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   275
        throw debug(new Error("Section name may not be empty"), template, line, options.file);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   276
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   277
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   278
      sectionStack.push({name: name, inverted: inverted});
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   279
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   280
      code.push(
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   281
        '";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   282
        updateLine,
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   283
        '\nvar name = "' + name + '";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   284
        '\nvar callback = (function () {',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   285
        '\n  return function () {',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   286
        '\n    var buffer = "";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   287
        '\nbuffer += "'
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   288
      );
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   289
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   290
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   291
    var openInvertedSection = function (source) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   292
      openSection(source, true);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   293
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   294
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   295
    var closeSection = function (source) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   296
      var name = trim(source);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   297
      var openName = sectionStack.length != 0 && sectionStack[sectionStack.length - 1].name;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   298
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   299
      if (!openName || name != openName) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   300
        throw debug(new Error('Section named "' + name + '" was never opened'), template, line, options.file);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   301
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   302
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   303
      var section = sectionStack.pop();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   304
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   305
      code.push(
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   306
        '";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   307
        '\n    return buffer;',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   308
        '\n  };',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   309
        '\n})();'
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   310
      );
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   311
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   312
      if (section.inverted) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   313
        code.push("\nbuffer += renderSection(name,stack,callback,true);");
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   314
      } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   315
        code.push("\nbuffer += renderSection(name,stack,callback);");
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   316
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   317
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   318
      code.push('\nbuffer += "');
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   319
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   320
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   321
    var sendPlain = function (source) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   322
      code.push(
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   323
        '";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   324
        updateLine,
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   325
        '\nbuffer += lookup("' + trim(source) + '",stack,"");',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   326
        '\nbuffer += "'
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   327
      );
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   328
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   329
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   330
    var sendEscaped = function (source) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   331
      code.push(
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   332
        '";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   333
        updateLine,
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   334
        '\nbuffer += escapeHTML(lookup("' + trim(source) + '",stack,""));',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   335
        '\nbuffer += "'
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   336
      );
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   337
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   338
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   339
    var line = 1, c, callback;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   340
    for (var i = 0, len = template.length; i < len; ++i) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   341
      if (template.slice(i, i + openTag.length) === openTag) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   342
        i += openTag.length;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   343
        c = template.substr(i, 1);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   344
        updateLine = '\nline = ' + line + ';';
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   345
        nextOpenTag = openTag;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   346
        nextCloseTag = closeTag;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   347
        hasTag = true;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   348
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   349
        switch (c) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   350
        case "!": // comment
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   351
          i++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   352
          callback = null;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   353
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   354
        case "=": // change open/close tags, e.g. {{=<% %>=}}
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   355
          i++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   356
          closeTag = "=" + closeTag;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   357
          callback = setTags;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   358
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   359
        case ">": // include partial
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   360
          i++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   361
          callback = includePartial;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   362
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   363
        case "#": // start section
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   364
          i++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   365
          callback = openSection;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   366
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   367
        case "^": // start inverted section
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   368
          i++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   369
          callback = openInvertedSection;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   370
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   371
        case "/": // end section
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   372
          i++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   373
          callback = closeSection;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   374
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   375
        case "{": // plain variable
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   376
          closeTag = "}" + closeTag;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   377
          // fall through
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   378
        case "&": // plain variable
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   379
          i++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   380
          nonSpace = true;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   381
          callback = sendPlain;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   382
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   383
        default: // escaped variable
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   384
          nonSpace = true;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   385
          callback = sendEscaped;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   386
        }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   387
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   388
        var end = template.indexOf(closeTag, i);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   389
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   390
        if (end === -1) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   391
          throw debug(new Error('Tag "' + openTag + '" was not closed properly'), template, line, options.file);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   392
        }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   393
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   394
        var source = template.substring(i, end);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   395
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   396
        if (callback) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   397
          callback(source);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   398
        }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   399
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   400
        // Maintain line count for \n in source.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   401
        var n = 0;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   402
        while (~(n = source.indexOf("\n", n))) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   403
          line++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   404
          n++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   405
        }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   406
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   407
        i = end + closeTag.length - 1;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   408
        openTag = nextOpenTag;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   409
        closeTag = nextCloseTag;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   410
      } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   411
        c = template.substr(i, 1);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   412
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   413
        switch (c) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   414
        case '"':
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   415
        case "\\":
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   416
          nonSpace = true;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   417
          code.push("\\" + c);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   418
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   419
        case "\r":
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   420
          // Ignore carriage returns.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   421
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   422
        case "\n":
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   423
          spaces.push(code.length);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   424
          code.push("\\n");
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   425
          stripSpace(); // Check for whitespace on the current line.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   426
          line++;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   427
          break;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   428
        default:
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   429
          if (isWhitespace(c)) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   430
            spaces.push(code.length);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   431
          } else {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   432
            nonSpace = true;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   433
          }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   434
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   435
          code.push(c);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   436
        }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   437
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   438
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   439
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   440
    if (sectionStack.length != 0) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   441
      throw debug(new Error('Section "' + sectionStack[sectionStack.length - 1].name + '" was not closed properly'), template, line, options.file);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   442
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   443
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   444
    // Clean up any whitespace from a closing {{tag}} that was at the end
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   445
    // of the template without a trailing \n.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   446
    stripSpace();
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   447
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   448
    code.push(
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   449
      '";',
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   450
      "\nreturn buffer;",
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   451
      "\n} catch (e) { throw {error: e, line: line}; }"
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   452
    );
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   453
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   454
    // Ignore `buffer += "";` statements.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   455
    var body = code.join("").replace(/buffer \+= "";\n/g, "");
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   456
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   457
    if (options.debug) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   458
      if (typeof console != "undefined" && console.log) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   459
        console.log(body);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   460
      } else if (typeof print === "function") {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   461
        print(body);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   462
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   463
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   464
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   465
    return body;
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   466
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   467
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   468
  /**
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   469
   * Used by `compile` to generate a reusable function for the given `template`.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   470
   */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   471
  function _compile(template, options) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   472
    var args = "view,partials,stack,lookup,escapeHTML,renderSection,render";
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   473
    var body = parse(template, options);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   474
    var fn = new Function(args, body);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   475
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   476
    // This anonymous function wraps the generated function so we can do
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   477
    // argument coercion, setup some variables, and handle any errors
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   478
    // encountered while executing it.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   479
    return function (view, partials) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   480
      partials = partials || {};
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   481
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   482
      var stack = [view]; // context stack
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   483
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   484
      try {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   485
        return fn(view, partials, stack, lookup, escapeHTML, renderSection, render);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   486
      } catch (e) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   487
        throw debug(e.error, template, e.line, options.file);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   488
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   489
    };
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   490
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   491
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   492
  // Cache of pre-compiled templates.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   493
  var _cache = {};
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   494
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   495
  /**
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   496
   * Clear the cache of compiled templates.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   497
   */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   498
  function clearCache() {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   499
    _cache = {};
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   500
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   501
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   502
  /**
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   503
   * Compiles the given `template` into a reusable function using the given
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   504
   * `options`. In addition to the options accepted by Mustache.parse,
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   505
   * recognized options include the following:
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   506
   *
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   507
   *   - cache    Set `false` to bypass any pre-compiled version of the given
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   508
   *              template. Otherwise, a given `template` string will be cached
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   509
   *              the first time it is parsed
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   510
   */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   511
  function compile(template, options) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   512
    options = options || {};
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   513
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   514
    // Use a pre-compiled version from the cache if we have one.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   515
    if (options.cache !== false) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   516
      if (!_cache[template]) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   517
        _cache[template] = _compile(template, options);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   518
      }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   519
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   520
      return _cache[template];
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   521
    }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   522
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   523
    return _compile(template, options);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   524
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   525
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   526
  /**
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   527
   * High-level function that renders the given `template` using the given
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   528
   * `view` and `partials`. If you need to use any of the template options (see
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   529
   * `compile` above), you must compile in a separate step, and then call that
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   530
   * compiled function.
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   531
   */
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   532
  function render(template, view, partials) {
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   533
    return compile(template)(view, partials);
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   534
  }
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   535
03bbfd9cd3c6 First commit for Timeline
veltr
parents:
diff changeset
   536
})(Mustache);