pax_global_header00006660000000000000000000000064117216510770014521gustar00rootroot0000000000000052 comment=90cc5f0d185282b9bc08e7be7a134606d36ada3f janl-mustache.js-90cc5f0/000077500000000000000000000000001172165107700153025ustar00rootroot00000000000000janl-mustache.js-90cc5f0/.gitignore000066400000000000000000000002061172165107700172700ustar00rootroot00000000000000# ignore temp vim files *.swp .DS_Store .rvmrc runner.js lib jquery.mustache.js qooxdoo.mustache.js dojox yui3 requirejs.mustache.js janl-mustache.js-90cc5f0/.travis.yml000066400000000000000000000001361172165107700174130ustar00rootroot00000000000000rvm: - 1.9.2 before_script: - sudo apt-get -y install xulrunner-2.0 - gem install rspec janl-mustache.js-90cc5f0/LICENSE000066400000000000000000000021511172165107700163060ustar00rootroot00000000000000The MIT License Copyright (c) 2009 Chris Wanstrath (Ruby) Copyright (c) 2010 Jan Lehnardt (JavaScript) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.janl-mustache.js-90cc5f0/README.md000066400000000000000000000211741172165107700165660ustar00rootroot00000000000000# mustache.js — Logic-less {{mustache}} templates with JavaScript > What could be more logical awesome than no logic at all? [mustache.js](http://github.com/janl/mustache.js) is an implementation of the [Mustache](http://mustache.github.com/) templating system in JavaScript. [Mustache](http://mustache.github.com/) is a logic-less template syntax. It can be used for HTML, config files, source code - anything. It works by expanding tags in a template using values provided in a hash or object. We call it "logic-less" because there are no if statements, else clauses, or for loops. Instead there are only tags. Some tags are replaced with a value, some nothing, and others a series of values. For a language-agnostic overview of Mustache's template syntax, see the `mustache(5)` [manpage](http://mustache.github.com/mustache.5.html). ## Where to use mustache.js? You can use mustache.js to render templates in many various scenarios where you can use JavaScript. For example, you can render templates in a browser, server-side using [node](http://nodejs.org/), in [CouchDB](http://couchdb.apache.org/) views, or in almost any other environment where you can use JavaScript. ## Who uses mustache.js? An updated list of mustache.js users is kept [on the Github wiki](http://wiki.github.com/janl/mustache.js/beard-competition). Add yourself or your company if you use mustache.js! ## Usage Below is quick example how to use mustache.js: var view = { title: "Joe", calc: function() { return 2 + 4; } }; var html = Mustache.to_html("{{title}} spends {{calc}}", view); In this example, the `Mustache.to_html` function takes two parameters: 1) the [mustache](http://mustache.github.com/) template and 2) a `view` object that contains the data and code needed to render the template. ## Template Tag Types There are several types of tags currently implemented in mustache.js. ### Simple Tags Tags are always surrounded by mustaches like this `{{foobar}}`. var view = {name: "Joe", say_hello: function(){ return "hello" }} template = "{{say_hello}}, {{name}}" #### Accessing values in nested objects (Dot Notation) To access data logically grouped into nested objects, specify a '.' delimited path to the value. var contact = { name: {first: "Bill", last: "Bobitybob" }, age: 37 } template = "Hello, {{name.first}} {{name.last}}. You are {{age}} years old." *NOTICE*: The dot notation feature was recently implemented for the 0.4 release, which is not out as of Nov 9 2011. You can find the feature in the current master branch of mustachejs. ### Conditional Sections Conditional sections begin with `{{#condition}}` and end with `{{/condition}}`. When `condition` evaluates to true, the section is rendered, otherwise the whole block will output nothing at all. `condition` may be a function returning true/false or a simple boolean. var view = {condition: function() { // [...your code goes here...] return true; }} {{#condition}} I will be visible if condition is true {{/condition}} ### Enumerable Sections Enumerable Sections use the same syntax as condition sections do. `{{#shopping_items}}` and `{{/shopping_items}}`. Actually the view decides how mustache.js renders the section. If the view returns an array, it will iterator over the items. Use `{{.}}` to access the current item inside the enumeration section. var view = {name: "Joe's shopping card", items: ["bananas", "apples"]} var template = "{{name}}: " Outputs: Joe's shopping card: ### Higher Order Sections If a section key returns a function, it will be called and passed both the unrendered block of text and a renderer convenience function. Given this object: "name": "Tater", "bolder": function() { return function(text, render) { return "" + render(text) + '' } } And this template: {{#bolder}}Hi {{name}}.{{/bolder}} We'll get this output: Hi Tater. As you can see, we’re pre-processing the text in the block. This can be used to implement caching, filters (like syntax highlighting), etc. You can use `this.name` to access the attribute `name` from your view. ### Dereferencing Sections If your data has components that are logically grouped into nested objects, you may wish to dereference an object to access its values. Given this object: { "name": "Bill", "address": { "street": "801 Streetly street", "city": "Boston", "state": "MA", "zip" "02101" } } And this template:

Contact: {{name}}

{{#address}}

{{street}}

{{city}}, {{state}} {{zip}}

{{/address}} We'll get this output:

Contact: Bill

801 Streetly street

Boston, MA 02101

### Inverted Sections An inverted section opens with `{{^section}}` instead of `{{#section}}` and uses a boolean negative to evaluate. Empty arrays are considered falsy. View: var inverted_section = { "repo": [] } Template: {{#repo}}{{name}}{{/repo}} {{^repo}}No repos :({{/repo}} Result: No repos :( ### View Partials mustache.js supports a quite powerful but yet simple view partial mechanism. Use the following syntax for partials: `{{>partial_name}}` var view = { name: "Joe", winnings: { value: 1000, taxed_value: function() { return this.value - (this.value * 0.4); } } }; var template = "Welcome, {{name}}! {{>winnings}}" var partials = { winnings: "You just won ${{value}} (which is ${{taxed_value}} after tax)"}; var output = Mustache.to_html(template, view, partials) output will be: Welcome, Joe! You just won $1000 (which is $600 after tax) You invoke a partial with `{{>winnings}}`. Invoking the partial `winnings` will tell mustache.js to look for a object in the context's property `winnings`. It will then use that object as the context for the template found in `partials` for `winnings`. ## Escaping mustache.js does escape all values when using the standard double mustache syntax. Characters which will be escaped: `& \ " ' < >`. To disable escaping, simply use triple mustaches like `{{{unescaped_variable}}}`. Example: Using `{{variable}}` inside a template for `5 > 2` will result in `5 > 2`, where as the usage of `{{{variable}}}` will result in `5 > 2`. ## Streaming To stream template results out of mustache.js, you can pass an optional `send()` callback to the `to_html()` call: Mustache.to_html(template, view, partials, function(line) { print(line); }); ## Pragmas Pragma tags let you alter the behaviour of mustache.js. They have the format of {{%PRAGMANAME}} and they accept options: {{%PRAGMANAME option=value}} ### IMPLICIT-ITERATOR When using a block to iterate over an enumerable (Array), mustache.js expects an objects as enumerable items. The implicit iterator pragma enables optional behaviour of allowing literals as enumerable items. Consider this view: var view = { foo: [1, 2, 3, 4, 5, "french"] }; The following template can iterate over the member `foo`: {{%IMPLICIT-ITERATOR}} {{#foo}} {{.}} {{/foo}} If you don't like the dot in there, the pragma accepts an option to set your own iteration marker: {{%IMPLICIT-ITERATOR iterator=bob}} {{#foo}} {{bob}} {{/foo}} ## Plugins for JavaScript Libraries mustache.js may be built specifically for several different client libraries and platforms, including the following: - [node](http://nodejs.org/) (or other CommonJS platforms) - [jQuery](http://jquery.com/) - [Dojo](http://www.dojotoolkit.org/) - [YUI](http://developer.yahoo.com/yui/) - [RequireJS](http://requirejs.org/) - [qooxdoo](http://qooxdoo.org/) These may be built using [Rake](http://rake.rubyforge.org/) and one of the following commands: $ rake commonjs $ rake jquery $ rake dojo $ rake yui $ rake requirejs $ rake qooxdoo ## Thanks Mustache.js wouldn't kick ass if it weren't for these fine souls: * Chris Wanstrath / defunkt * Alexander Lang / langalex * Sebastian Cohnen / tisba * J Chris Anderson / jchris * Tom Robinson / tlrobinson * Aaron Quint / quirkey * Douglas Crockford * Nikita Vasilyev / NV * Elise Wood / glytch * Damien Mathieu / dmathieu * Jakub Kuźma / qoobaa * Will Leinweber / will * dpree * Jason Smith / jhs * Aaron Gibralter / agibralter * Ross Boucher / boucher * Matt Sanford / mzsanford * Ben Cherry / bcherry * Michael Jackson / mjijackson janl-mustache.js-90cc5f0/Rakefile000066400000000000000000000034441172165107700167540ustar00rootroot00000000000000require 'rake' require 'rake/clean' task :default => :spec desc "Run all specs" task :spec do require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) do |t| #t.spec_opts = ['--options', "\"#{File.dirname(__FILE__)}/spec/spec.opts\""] t.pattern = 'spec/*_spec.rb' end end def version File.read("mustache.js").match('version: "([^\"]+)",$')[1] end # Creates a rule that uses the .tmpl.{pre,post} stuff to make a final, # wrapped, output file. There is some extra complexity because Dojo and YUI3 # use different template files and final locations. def templated_build(name, opts={}) short = name.downcase source = File.join("wrappers", short) dependencies = ["mustache.js"] + Dir.glob("#{source}/*.tpl.*") target_js = opts[:location] ? "mustache.js" : "#{short}.mustache.js" CLEAN.include(opts[:location] ? opts[:location] : target_js) desc "Package for #{name}" task short.to_sym => dependencies do puts "Packaging for #{name}" mkdir_p opts[:location] if opts[:location] sh "cat #{source}/#{target_js}.tpl.pre mustache.js \ #{source}/#{target_js}.tpl.post > #{opts[:location] || '.'}/#{target_js}" # extra if opts[:extra] sh "sed -e 's/{{version}}/#{version}/' #{source}/#{opts[:extra]} \ > #{opts[:location]}/#{opts[:extra]}" end puts "Done, see #{opts[:location] || '.'}/#{target_js}" end end templated_build "CommonJS", :location => "lib", :extra => "package.json" templated_build "jQuery" templated_build "Dojo", :location => "dojox/string" templated_build "YUI3", :location => "yui3/mustache" templated_build "RequireJS" templated_build "qooxdoo" task :minify do # npm install uglify-js mmjs = "mustache.min.js" `echo "/*! Version: 0.4.2 */" > #{mmjs}` `uglifyjs mustache.js >> #{mmjs}` puts "Created #{mmjs}" end janl-mustache.js-90cc5f0/TESTING.md000066400000000000000000000043371172165107700167500ustar00rootroot00000000000000## Running the mustache.js Test Suite Notice: the tests are only expected to run on unixoid systems. The mustache.js test suite uses the [RSpec](http://rspec.info/) testing framework. In order to run the tests you'll need to install [Ruby](http://ruby-lang.org/) as well as the `rake`, `rspec` (>=2), and `json` [RubyGems](http://rubygems.org/). ### How to install Ruby and the required gems from source Make sure you have the required tools to compile it: $ apt-get install build-essential libssl-dev libreadline5-dev zlib1g-dev Download and extract the Ruby source, and install it: $ wget ftp://ftp.ruby-lang.org/pub/ruby/stable-snapshot.tar.gz $ tar xvzf stable-snapshot.tar.gz $ cd ruby $ ./configure && make && make install Download and extract RubyGems, and install it: $ wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.12.tgz $ tar xzvf rubygems-1.8.12.tgz $ cd rubygems-1.8.12 $ ruby setup.rb If you want to update RubyGems: $ gem update --system Install the required gems: $ gem install rake rspec json That's it! ### How to install node.js from source $ git clone https://github.com/joyent/node.git $ cd node $ # select the version to install, master is unstable; $ # latest stable version is advertised on http://nodejs.org $ git checkout v0.6.11 $ ./configure $ make $ sudo make install ### How to run the tests The mustache.js test suite currently uses 4 different JavaScript runtime engines to maximize portability across platforms and browsers. They are: * node * SpiderMonkey (Mozilla, Firefox) * JavaScriptCore (WebKit, Safari) * Rhino (Mozilla, Java) When the test suite runs it will automatically determine which platforms are available on your machine and run on all of them. The suite must run on at least one platform in order to succeed. Once you have at least one JavaScript platform installed, you can run the test suite with the following command: $ rake ### How to create a test All test files live in the spec/_files directory. To create a new test: * Create a template file `somename.mustache` * Create a javascript file with data and functions `somename.js` * Create a file the expected result `somename.txt` janl-mustache.js-90cc5f0/mustache.js000066400000000000000000000303121172165107700174500ustar00rootroot00000000000000/* mustache.js — Logic-less templates in JavaScript See http://mustache.github.com/ for more info. */ var Mustache = function () { var _toString = Object.prototype.toString; Array.isArray = Array.isArray || function (obj) { return _toString.call(obj) == "[object Array]"; } var _trim = String.prototype.trim, trim; if (_trim) { trim = function (text) { return text == null ? "" : _trim.call(text); } } else { var trimLeft, trimRight; // IE doesn't match non-breaking spaces with \s. if ((/\S/).test("\xA0")) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } else { trimLeft = /^\s+/; trimRight = /\s+$/; } trim = function (text) { return text == null ? "" : text.toString().replace(trimLeft, "").replace(trimRight, ""); } } var escapeMap = { "&": "&", "<": "<", ">": ">", '"': '"', "'": ''' }; function escapeHTML(string) { return String(string).replace(/&(?!#?\w+;)|[<>"']/g, function (s) { return escapeMap[s] || s; }); } var regexCache = {}; var Renderer = function () {}; Renderer.prototype = { otag: "{{", ctag: "}}", pragmas: {}, buffer: [], pragmas_implemented: { "IMPLICIT-ITERATOR": true }, context: {}, render: function (template, context, partials, in_recursion) { // reset buffer & set context if (!in_recursion) { this.context = context; this.buffer = []; // TODO: make this non-lazy } // fail fast if (!this.includes("", template)) { if (in_recursion) { return template; } else { this.send(template); return; } } // get the pragmas together template = this.render_pragmas(template); // render the template var html = this.render_section(template, context, partials); // render_section did not find any sections, we still need to render the tags if (html === false) { html = this.render_tags(template, context, partials, in_recursion); } if (in_recursion) { return html; } else { this.sendLines(html); } }, /* Sends parsed lines */ send: function (line) { if (line !== "") { this.buffer.push(line); } }, sendLines: function (text) { if (text) { var lines = text.split("\n"); for (var i = 0; i < lines.length; i++) { this.send(lines[i]); } } }, /* Looks for %PRAGMAS */ render_pragmas: function (template) { // no pragmas if (!this.includes("%", template)) { return template; } var that = this; var regex = this.getCachedRegex("render_pragmas", function (otag, ctag) { return new RegExp(otag + "%([\\w-]+) ?([\\w]+=[\\w]+)?" + ctag, "g"); }); return template.replace(regex, function (match, pragma, options) { if (!that.pragmas_implemented[pragma]) { throw({message: "This implementation of mustache doesn't understand the '" + pragma + "' pragma"}); } that.pragmas[pragma] = {}; if (options) { var opts = options.split("="); that.pragmas[pragma][opts[0]] = opts[1]; } return ""; // ignore unknown pragmas silently }); }, /* Tries to find a partial in the curent scope and render it */ render_partial: function (name, context, partials) { name = trim(name); if (!partials || partials[name] === undefined) { throw({message: "unknown_partial '" + name + "'"}); } if (!context || typeof context[name] != "object") { return this.render(partials[name], context, partials, true); } return this.render(partials[name], context[name], partials, true); }, /* Renders inverted (^) and normal (#) sections */ render_section: function (template, context, partials) { if (!this.includes("#", template) && !this.includes("^", template)) { // did not render anything, there were no sections return false; } var that = this; var regex = this.getCachedRegex("render_section", function (otag, ctag) { // This regex matches _the first_ section ({{#foo}}{{/foo}}), and captures the remainder return new RegExp( "^([\\s\\S]*?)" + // all the crap at the beginning that is not {{*}} ($1) otag + // {{ "(\\^|\\#)\\s*(.+?)\\s*" +// #foo (# == $2, foo == $3), not greedy ctag + // }} "\n*([\\s\\S]*?)" + // between the tag ($2). leading newlines are dropped otag + // {{ "\\/\\s*\\3\\s*" + // /foo (backreference to the opening tag). ctag + // }} "\\s*([\\s\\S]*)$", // everything else in the string ($4). leading whitespace is dropped. "g"); }); // for each {{#foo}}{{/foo}} section do... return template.replace(regex, function (match, before, type, name, content, after) { // before contains only tags, no sections var renderedBefore = before ? that.render_tags(before, context, partials, true) : "", // after may contain both sections and tags, so use full rendering function renderedAfter = after ? that.render(after, context, partials, true) : "", // will be computed below renderedContent, value = that.find(name, context); if (type === "^") { // inverted section if (!value || Array.isArray(value) && value.length === 0) { // false or empty list, render it renderedContent = that.render(content, context, partials, true); } else { renderedContent = ""; } } else if (type === "#") { // normal section if (Array.isArray(value)) { // Enumerable, Let's loop! renderedContent = that.map(value, function (row) { return that.render(content, that.create_context(row), partials, true); }).join(""); } else if (that.is_object(value)) { // Object, Use it as subcontext! renderedContent = that.render(content, that.create_context(value), partials, true); } else if (typeof value == "function") { // higher order section renderedContent = value.call(context, content, function (text) { return that.render(text, context, partials, true); }); } else if (value) { // boolean section renderedContent = that.render(content, context, partials, true); } else { renderedContent = ""; } } return renderedBefore + renderedContent + renderedAfter; }); }, /* Replace {{foo}} and friends with values from our view */ render_tags: function (template, context, partials, in_recursion) { // tit for tat var that = this; var new_regex = function () { return that.getCachedRegex("render_tags", function (otag, ctag) { return new RegExp(otag + "(=|!|>|&|\\{|%)?([^#\\^]+?)\\1?" + ctag + "+", "g"); }); }; var regex = new_regex(); var tag_replace_callback = function (match, operator, name) { switch(operator) { case "!": // ignore comments return ""; case "=": // set new delimiters, rebuild the replace regexp that.set_delimiters(name); regex = new_regex(); return ""; case ">": // render partial return that.render_partial(name, context, partials); case "{": // the triple mustache is unescaped case "&": // & operator is an alternative unescape method return that.find(name, context); default: // escape the value return escapeHTML(that.find(name, context)); } }; var lines = template.split("\n"); for(var i = 0; i < lines.length; i++) { lines[i] = lines[i].replace(regex, tag_replace_callback, this); if (!in_recursion) { this.send(lines[i]); } } if (in_recursion) { return lines.join("\n"); } }, set_delimiters: function (delimiters) { var dels = delimiters.split(" "); this.otag = this.escape_regex(dels[0]); this.ctag = this.escape_regex(dels[1]); }, escape_regex: function (text) { // thank you Simon Willison if (!arguments.callee.sRE) { var specials = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\' ]; arguments.callee.sRE = new RegExp( '(\\' + specials.join('|\\') + ')', 'g' ); } return text.replace(arguments.callee.sRE, '\\$1'); }, /* find `name` in current `context`. That is find me a value from the view object */ find: function (name, context) { name = trim(name); // Checks whether a value is thruthy or false or 0 function is_kinda_truthy(bool) { return bool === false || bool === 0 || bool; } var value; // check for dot notation eg. foo.bar if (name.match(/([a-z_]+)\./ig)) { var childValue = this.walk_context(name, context); if (is_kinda_truthy(childValue)) { value = childValue; } } else { if (is_kinda_truthy(context[name])) { value = context[name]; } else if (is_kinda_truthy(this.context[name])) { value = this.context[name]; } } if (typeof value == "function") { return value.apply(context); } if (value !== undefined) { return value; } // silently ignore unkown variables return ""; }, walk_context: function (name, context) { var path = name.split('.'); // if the var doesn't exist in current context, check the top level context var value_context = (context[path[0]] != undefined) ? context : this.context; var value = value_context[path.shift()]; while (value != undefined && path.length > 0) { value_context = value; value = value[path.shift()]; } // if the value is a function, call it, binding the correct context if (typeof value == "function") { return value.apply(value_context); } return value; }, // Utility methods /* includes tag */ includes: function (needle, haystack) { return haystack.indexOf(this.otag + needle) != -1; }, // by @langalex, support for arrays of strings create_context: function (_context) { if (this.is_object(_context)) { return _context; } else { var iterator = "."; if (this.pragmas["IMPLICIT-ITERATOR"]) { iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator; } var ctx = {}; ctx[iterator] = _context; return ctx; } }, is_object: function (a) { return a && typeof a == "object"; }, /* Why, why, why? Because IE. Cry, cry cry. */ map: function (array, fn) { if (typeof array.map == "function") { return array.map(fn); } else { var r = []; var l = array.length; for(var i = 0; i < l; i++) { r.push(fn(array[i])); } return r; } }, getCachedRegex: function (name, generator) { var byOtag = regexCache[this.otag]; if (!byOtag) { byOtag = regexCache[this.otag] = {}; } var byCtag = byOtag[this.ctag]; if (!byCtag) { byCtag = byOtag[this.ctag] = {}; } var regex = byCtag[name]; if (!regex) { regex = byCtag[name] = generator(this.otag, this.ctag); } return regex; } }; return({ name: "mustache.js", version: "0.4.2", /* Turns a template and view into HTML */ to_html: function (template, view, partials, send_fun) { var renderer = new Renderer(); if (send_fun) { renderer.send = send_fun; } renderer.render(template, view || {}, partials); if (!send_fun) { return renderer.buffer.join("\n"); } } }); }(); janl-mustache.js-90cc5f0/mustache.js.nuspec000066400000000000000000000010361172165107700207450ustar00rootroot00000000000000 mustache.js 0.4.2 mustache.js Authors https://github.com/janl/mustache.js/blob/master/LICENSE http://mustache.github.com/ false Logic-less templates in JavaScript. mustache template templates javascript janl-mustache.js-90cc5f0/mustache.min.js000066400000000000000000000106561172165107700202430ustar00rootroot00000000000000/*! Version: 0.4.2 */ /* mustache.js — Logic-less templates in JavaScript See http://mustache.github.com/ for more info. */var Mustache=function(){function g(a){return String(a).replace(/&(?!#?\w+;)|[<>"']/g,function(a){return f[a]||a})}var a=Object.prototype.toString;Array.isArray=Array.isArray||function(b){return a.call(b)=="[object Array]"};var b=String.prototype.trim,c;if(b)c=function(a){return a==null?"":b.call(a)};else{var d,e;/\S/.test(" ")?(d=/^[\s\xA0]+/,e=/[\s\xA0]+$/):(d=/^\s+/,e=/\s+$/),c=function(a){return a==null?"":a.toString().replace(d,"").replace(e,"")}}var f={"&":"&","<":"<",">":">",'"':""","'":"'"},h={},i=function(){};return i.prototype={otag:"{{",ctag:"}}",pragmas:{},buffer:[],pragmas_implemented:{"IMPLICIT-ITERATOR":!0},context:{},render:function(a,b,c,d){d||(this.context=b,this.buffer=[]);if(!this.includes("",a)){if(d)return a;this.send(a);return}a=this.render_pragmas(a);var e=this.render_section(a,b,c);e===!1&&(e=this.render_tags(a,b,c,d));if(d)return e;this.sendLines(e)},send:function(a){a!==""&&this.buffer.push(a)},sendLines:function(a){if(a){var b=a.split("\n");for(var c=0;c|&|\\{|%)?([^#\\^]+?)\\1?"+b+"+","g")})},h=f(),i=function(a,d,i){switch(d){case"!":return"";case"=":return e.set_delimiters(i),h=f(),"";case">":return e.render_partial(i,b,c);case"{":case"&":return e.find(i,b);default:return g(e.find(i,b))}},j=a.split("\n");for(var k=0;k0)d=e,e=e[c.shift()];return typeof e=="function"?e.apply(d):e},includes:function(a,b){return b.indexOf(this.otag+a)!=-1},create_context:function(a){if(this.is_object(a))return a;var b=".";this.pragmas["IMPLICIT-ITERATOR"]&&(b=this.pragmas["IMPLICIT-ITERATOR"].iterator);var c={};return c[b]=a,c},is_object:function(a){return a&&typeof a=="object"},map:function(a,b){if(typeof a.map=="function")return a.map(b);var c=[],d=a.length;for(var e=0;e" }; janl-mustache.js-90cc5f0/spec/_files/ampersand_escape.mustache000066400000000000000000000000151172165107700245160ustar00rootroot00000000000000{{&message}} janl-mustache.js-90cc5f0/spec/_files/ampersand_escape.txt000066400000000000000000000000141172165107700235230ustar00rootroot00000000000000Some janl-mustache.js-90cc5f0/spec/_files/apostrophe.js000066400000000000000000000000571172165107700222210ustar00rootroot00000000000000var apostrophe = {'apos': "'", 'control':'X'}; janl-mustache.js-90cc5f0/spec/_files/apostrophe.mustache000066400000000000000000000000241172165107700234100ustar00rootroot00000000000000{{apos}}{{control}} janl-mustache.js-90cc5f0/spec/_files/apostrophe.txt000066400000000000000000000000071172165107700224170ustar00rootroot00000000000000'X janl-mustache.js-90cc5f0/spec/_files/array_of_partials_implicit_partial.2.mustache000066400000000000000000000000061172165107700304730ustar00rootroot00000000000000{{.}} janl-mustache.js-90cc5f0/spec/_files/array_of_partials_implicit_partial.js000066400000000000000000000000741172165107700271430ustar00rootroot00000000000000var partial_context = { numbers: ['1', '2', '3', '4'] }; janl-mustache.js-90cc5f0/spec/_files/array_of_partials_implicit_partial.mustache000066400000000000000000000000731172165107700303370ustar00rootroot00000000000000Here is some stuff! {{#numbers}} {{>partial}} {{/numbers}} janl-mustache.js-90cc5f0/spec/_files/array_of_partials_implicit_partial.txt000066400000000000000000000000341172165107700273420ustar00rootroot00000000000000Here is some stuff! 1 2 3 4 janl-mustache.js-90cc5f0/spec/_files/array_of_partials_partial.2.mustache000066400000000000000000000000061172165107700266010ustar00rootroot00000000000000{{i}} janl-mustache.js-90cc5f0/spec/_files/array_of_partials_partial.js000066400000000000000000000001201172165107700252410ustar00rootroot00000000000000var partial_context = { numbers: [{i: '1'}, {i: '2'}, {i: '3'}, {i: '4'}] }; janl-mustache.js-90cc5f0/spec/_files/array_of_partials_partial.mustache000066400000000000000000000000731172165107700264450ustar00rootroot00000000000000Here is some stuff! {{#numbers}} {{>partial}} {{/numbers}} janl-mustache.js-90cc5f0/spec/_files/array_of_partials_partial.txt000066400000000000000000000000341172165107700254500ustar00rootroot00000000000000Here is some stuff! 1 2 3 4 janl-mustache.js-90cc5f0/spec/_files/array_of_strings.js000066400000000000000000000000771172165107700234120ustar00rootroot00000000000000var array_of_strings = {array_of_strings: ['hello', 'world']}; janl-mustache.js-90cc5f0/spec/_files/array_of_strings.mustache000066400000000000000000000000601172165107700245770ustar00rootroot00000000000000{{#array_of_strings}}{{.}} {{/array_of_strings}}janl-mustache.js-90cc5f0/spec/_files/array_of_strings.txt000066400000000000000000000000151172165107700236050ustar00rootroot00000000000000hello world janl-mustache.js-90cc5f0/spec/_files/array_of_strings_options.js000066400000000000000000000001171172165107700251600ustar00rootroot00000000000000var array_of_strings_options = {array_of_strings_options: ['hello', 'world']}; janl-mustache.js-90cc5f0/spec/_files/array_of_strings_options.mustache000066400000000000000000000001461172165107700263570ustar00rootroot00000000000000{{%IMPLICIT-ITERATOR iterator=rob}} {{#array_of_strings_options}}{{rob}} {{/array_of_strings_options}}janl-mustache.js-90cc5f0/spec/_files/array_of_strings_options.txt000066400000000000000000000000151172165107700253600ustar00rootroot00000000000000hello world janl-mustache.js-90cc5f0/spec/_files/array_partial.2.mustache000066400000000000000000000001001172165107700242110ustar00rootroot00000000000000Here's a non-sense array of values {{#array}} {{.}} {{/array}}janl-mustache.js-90cc5f0/spec/_files/array_partial.js000066400000000000000000000001141172165107700226610ustar00rootroot00000000000000var partial_context = { partial: { array: ['1', '2', '3', '4'] } };janl-mustache.js-90cc5f0/spec/_files/array_partial.mustache000066400000000000000000000000141172165107700240550ustar00rootroot00000000000000{{>partial}}janl-mustache.js-90cc5f0/spec/_files/array_partial.txt000066400000000000000000000000641172165107700230700ustar00rootroot00000000000000Here's a non-sense array of values 1 2 3 4 janl-mustache.js-90cc5f0/spec/_files/bug_11_eating_whitespace.js000066400000000000000000000000601172165107700246500ustar00rootroot00000000000000var bug_11_eating_whitespace = { tag: "yo" }; janl-mustache.js-90cc5f0/spec/_files/bug_11_eating_whitespace.mustache000066400000000000000000000000141172165107700260440ustar00rootroot00000000000000{{tag}} foo janl-mustache.js-90cc5f0/spec/_files/bug_11_eating_whitespace.txt000066400000000000000000000000071172165107700250540ustar00rootroot00000000000000yo foo janl-mustache.js-90cc5f0/spec/_files/comments.js000066400000000000000000000001171172165107700216570ustar00rootroot00000000000000var comments = { title: function() { return "A Comedy of Errors"; } }; janl-mustache.js-90cc5f0/spec/_files/comments.mustache000066400000000000000000000001011172165107700230450ustar00rootroot00000000000000

{{title}}{{! just something interesting... or not... }}

janl-mustache.js-90cc5f0/spec/_files/comments.txt000066400000000000000000000000341172165107700220600ustar00rootroot00000000000000

A Comedy of Errors

janl-mustache.js-90cc5f0/spec/_files/complex.js000066400000000000000000000006461172165107700215100ustar00rootroot00000000000000var complex = { header: function() { return "Colors"; }, item: [ {name: "red", current: true, url: "#Red"}, {name: "green", current: false, url: "#Green"}, {name: "blue", current: false, url: "#Blue"} ], link: function() { return this["current"] !== true; }, list: function() { return this.item.length !== 0; }, empty: function() { return this.item.length === 0; } }; janl-mustache.js-90cc5f0/spec/_files/complex.mustache000066400000000000000000000004051172165107700226760ustar00rootroot00000000000000

{{header}}

{{#list}}
    {{#item}} {{#current}}
  • {{name}}
  • {{/current}} {{#link}}
  • {{name}}
  • {{/link}} {{/item}}
{{/list}} {{#empty}}

The list is empty.

{{/empty}}janl-mustache.js-90cc5f0/spec/_files/complex.txt000066400000000000000000000002251172165107700217040ustar00rootroot00000000000000

Colors

janl-mustache.js-90cc5f0/spec/_files/delimiters.js000066400000000000000000000003051172165107700221720ustar00rootroot00000000000000var delimiters = { first: "It worked the first time.", second: "And it worked the second time.", third: "Then, surprisingly, it worked the third time.", fourth: "Fourth time also fine!." } janl-mustache.js-90cc5f0/spec/_files/delimiters.mustache000066400000000000000000000001261172165107700233700ustar00rootroot00000000000000{{=<% %>=}}* <% first %> * <% second %> <%=| |=%> * | third | |={{ }}=| * {{ fourth }}janl-mustache.js-90cc5f0/spec/_files/delimiters.txt000066400000000000000000000002071172165107700223760ustar00rootroot00000000000000* It worked the first time. * And it worked the second time. * Then, surprisingly, it worked the third time. * Fourth time also fine!. janl-mustache.js-90cc5f0/spec/_files/dot_notation.js000066400000000000000000000006041172165107700225340ustar00rootroot00000000000000var dot_notation = { name: "A Book", authors: ["John Power", "Jamie Walsh"], price:{ value: 200, vat: function() { return this.value * 0.2; }, currency: { symbol: '€', name: 'Euro' } }, availability:{ status: true, text: "In Stock" }, // And now, some truthy false values truthy: { zero: 0, notTrue: false } }; janl-mustache.js-90cc5f0/spec/_files/dot_notation.mustache000066400000000000000000000006251172165107700237340ustar00rootroot00000000000000

{{name}}

Authors:

    {{#authors}}
  • {{.}}
  • {{/authors}}

Price: {{price.currency.symbol}}{{price.value}} {{#price.currency}}{{name}} {{availability.text}}{{/price.currency}}

VAT: {{price.currency.symbol}}{{price.vat}}

Test truthy false values:

Zero: {{truthy.zero}}

False: {{truthy.notTrue}}

janl-mustache.js-90cc5f0/spec/_files/dot_notation.txt000066400000000000000000000004051172165107700227360ustar00rootroot00000000000000

A Book

Authors:

  • John Power
  • Jamie Walsh

Price: €200 Euro In Stock

VAT: €40

Test truthy false values:

Zero: 0

False: false

janl-mustache.js-90cc5f0/spec/_files/double_render.js000066400000000000000000000001051172165107700226400ustar00rootroot00000000000000var double_render = { foo: true, bar: "{{win}}", win: "FAIL" };janl-mustache.js-90cc5f0/spec/_files/double_render.mustache000066400000000000000000000000301172165107700240320ustar00rootroot00000000000000{{#foo}}{{bar}}{{/foo}} janl-mustache.js-90cc5f0/spec/_files/double_render.txt000066400000000000000000000000101172165107700230360ustar00rootroot00000000000000{{win}} janl-mustache.js-90cc5f0/spec/_files/empty_partial.2.mustache000066400000000000000000000000021172165107700242320ustar00rootroot00000000000000yojanl-mustache.js-90cc5f0/spec/_files/empty_partial.js000066400000000000000000000000441172165107700227030ustar00rootroot00000000000000var partial_context = { foo: 1 }; janl-mustache.js-90cc5f0/spec/_files/empty_partial.mustache000066400000000000000000000000311172165107700240740ustar00rootroot00000000000000hey {{foo}} {{>partial}} janl-mustache.js-90cc5f0/spec/_files/empty_partial.txt000066400000000000000000000000111172165107700231000ustar00rootroot00000000000000hey 1 yo janl-mustache.js-90cc5f0/spec/_files/empty_sections.js000066400000000000000000000000311172165107700230720ustar00rootroot00000000000000var empty_sections = {}; janl-mustache.js-90cc5f0/spec/_files/empty_sections.mustache000066400000000000000000000000441172165107700242730ustar00rootroot00000000000000{{#foo}}{{/foo}}foo{{#bar}}{{/bar}} janl-mustache.js-90cc5f0/spec/_files/empty_sections.txt000066400000000000000000000000041172165107700232750ustar00rootroot00000000000000foo janl-mustache.js-90cc5f0/spec/_files/empty_template.js000066400000000000000000000000311172165107700230560ustar00rootroot00000000000000var empty_template = {}; janl-mustache.js-90cc5f0/spec/_files/empty_template.mustache000066400000000000000000000000641172165107700242610ustar00rootroot00000000000000

Test

janl-mustache.js-90cc5f0/spec/_files/empty_template.txt000066400000000000000000000000651172165107700232700ustar00rootroot00000000000000

Test

janl-mustache.js-90cc5f0/spec/_files/error_not_found.js000066400000000000000000000000371172165107700232370ustar00rootroot00000000000000var error_not_found = {bar: 2};janl-mustache.js-90cc5f0/spec/_files/error_not_found.mustache000066400000000000000000000000071172165107700244310ustar00rootroot00000000000000{{foo}}janl-mustache.js-90cc5f0/spec/_files/error_not_found.txt000066400000000000000000000000011172165107700234310ustar00rootroot00000000000000 janl-mustache.js-90cc5f0/spec/_files/escaped.js000066400000000000000000000001761172165107700214430ustar00rootroot00000000000000var escaped = { title: function() { return "Bear > Shark"; }, subtitle: 'Rock 'n Roll', entities: """ }; janl-mustache.js-90cc5f0/spec/_files/escaped.mustache000066400000000000000000000000771172165107700226400ustar00rootroot00000000000000

{{title}}

{{subtitle}}

But not {{entities}}. janl-mustache.js-90cc5f0/spec/_files/escaped.txt000066400000000000000000000001031172165107700216340ustar00rootroot00000000000000

Bear > Shark

Rock 'n Roll

But not ". janl-mustache.js-90cc5f0/spec/_files/higher_order_sections.js000066400000000000000000000003161172165107700244030ustar00rootroot00000000000000var higher_order_sections = { "name": "Tater", "helper": "To tinker?", "bolder": function() { return function(text, render) { return "" + render(text) + ' ' + this.helper; } } }janl-mustache.js-90cc5f0/spec/_files/higher_order_sections.mustache000066400000000000000000000000431172165107700255750ustar00rootroot00000000000000{{#bolder}}Hi {{name}}.{{/bolder}} janl-mustache.js-90cc5f0/spec/_files/higher_order_sections.txt000066400000000000000000000000341172165107700246030ustar00rootroot00000000000000Hi Tater. To tinker? janl-mustache.js-90cc5f0/spec/_files/inverted_section.js000066400000000000000000000000511172165107700233730ustar00rootroot00000000000000var inverted_section = { "repo": [] } janl-mustache.js-90cc5f0/spec/_files/inverted_section.mustache000066400000000000000000000001001172165107700245630ustar00rootroot00000000000000{{#repo}}{{name}}{{/repo}} {{^repo}}No repos :({{/repo}} janl-mustache.js-90cc5f0/spec/_files/inverted_section.txt000066400000000000000000000000141172165107700235750ustar00rootroot00000000000000No repos :( janl-mustache.js-90cc5f0/spec/_files/keys_with_questionmarks.js000066400000000000000000000001051172165107700250220ustar00rootroot00000000000000var keys_with_questionmarks = { "person?": { name: "Jon" } } janl-mustache.js-90cc5f0/spec/_files/keys_with_questionmarks.mustache000066400000000000000000000000511172165107700262170ustar00rootroot00000000000000{{#person?}} Hi {{name}}! {{/person?}} janl-mustache.js-90cc5f0/spec/_files/keys_with_questionmarks.txt000066400000000000000000000000121172165107700252220ustar00rootroot00000000000000 Hi Jon! janl-mustache.js-90cc5f0/spec/_files/nesting.js000066400000000000000000000001221172165107700214750ustar00rootroot00000000000000var nesting = { foo: [ {a: {b: 1}}, {a: {b: 2}}, {a: {b: 3}} ] }; janl-mustache.js-90cc5f0/spec/_files/nesting.mustache000066400000000000000000000000561172165107700227000ustar00rootroot00000000000000{{#foo}} {{#a}} {{b}} {{/a}} {{/foo}} janl-mustache.js-90cc5f0/spec/_files/nesting.txt000066400000000000000000000000371172165107700217050ustar00rootroot00000000000000 1 2 3 janl-mustache.js-90cc5f0/spec/_files/null_string.js000066400000000000000000000002041172165107700223670ustar00rootroot00000000000000var null_string = { name: "Elise", glytch: true, binary: false, value: null, numeric: function() { return NaN; } }; janl-mustache.js-90cc5f0/spec/_files/null_string.mustache000066400000000000000000000001261172165107700235670ustar00rootroot00000000000000Hello {{name}} glytch {{glytch}} binary {{binary}} value {{value}} numeric {{numeric}}janl-mustache.js-90cc5f0/spec/_files/null_string.txt000066400000000000000000000000701172165107700225730ustar00rootroot00000000000000Hello Elise glytch true binary false value numeric NaN janl-mustache.js-90cc5f0/spec/_files/partial_recursion.2.mustache000066400000000000000000000000611172165107700251120ustar00rootroot00000000000000{{name}} {{#children}} {{>partial}} {{/children}}janl-mustache.js-90cc5f0/spec/_files/partial_recursion.js000066400000000000000000000002071172165107700235570ustar00rootroot00000000000000var partial_context = { name: '1', kids: [ { name: '1.1', children: [ {name: '1.1.1'} ] } ] }; janl-mustache.js-90cc5f0/spec/_files/partial_recursion.mustache000066400000000000000000000000511172165107700247510ustar00rootroot00000000000000{{name}} {{#kids}} {{>partial}} {{/kids}}janl-mustache.js-90cc5f0/spec/_files/partial_recursion.txt000066400000000000000000000000141172165107700237560ustar00rootroot000000000000001 1.1 1.1.1 janl-mustache.js-90cc5f0/spec/_files/recursion_with_same_names.js000066400000000000000000000002221172165107700252630ustar00rootroot00000000000000var recursion_with_same_names = { name: 'name', description: 'desc', terms: [ {name: 't1', index: 0}, {name: 't2', index: 1}, ] };janl-mustache.js-90cc5f0/spec/_files/recursion_with_same_names.mustache000066400000000000000000000001131172165107700264570ustar00rootroot00000000000000{{ name }} {{ description }} {{#terms}} {{name}} {{index}} {{/terms}} janl-mustache.js-90cc5f0/spec/_files/recursion_with_same_names.txt000066400000000000000000000000341172165107700254670ustar00rootroot00000000000000name desc t1 0 t2 1 janl-mustache.js-90cc5f0/spec/_files/reuse_of_enumerables.js000066400000000000000000000001461172165107700242250ustar00rootroot00000000000000var reuse_of_enumerables = { terms: [ {name: 't1', index: 0}, {name: 't2', index: 1}, ] };janl-mustache.js-90cc5f0/spec/_files/reuse_of_enumerables.mustache000066400000000000000000000001321172165107700254150ustar00rootroot00000000000000{{#terms}} {{name}} {{index}} {{/terms}} {{#terms}} {{name}} {{index}} {{/terms}} janl-mustache.js-90cc5f0/spec/_files/reuse_of_enumerables.txt000066400000000000000000000000441172165107700244250ustar00rootroot00000000000000 t1 0 t2 1 t1 0 t2 1 janl-mustache.js-90cc5f0/spec/_files/section_as_context.js000066400000000000000000000002751172165107700237320ustar00rootroot00000000000000var section_as_context = { a_object: { title: 'this is an object', description: 'one of its attributes is a list', a_list: [{label: 'listitem1'}, {label: 'listitem2'}] } }; janl-mustache.js-90cc5f0/spec/_files/section_as_context.mustache000066400000000000000000000002201172165107700251150ustar00rootroot00000000000000{{#a_object}}

{{title}}

{{description}}

    {{#a_list}}
  • {{label}}
  • {{/a_list}}
{{/a_object}} janl-mustache.js-90cc5f0/spec/_files/section_as_context.txt000066400000000000000000000002151172165107700241270ustar00rootroot00000000000000

this is an object

one of its attributes is a list

  • listitem1
  • listitem2
janl-mustache.js-90cc5f0/spec/_files/simple.js000066400000000000000000000002161172165107700213230ustar00rootroot00000000000000var simple = { name: "Chris", value: 10000, taxed_value: function() { return this.value - (this.value * 0.4); }, in_ca: true }; janl-mustache.js-90cc5f0/spec/_files/simple.mustache000066400000000000000000000001511172165107700225160ustar00rootroot00000000000000Hello {{name}} You have just won ${{value}}! {{#in_ca}} Well, ${{ taxed_value }}, after taxes. {{/in_ca}}janl-mustache.js-90cc5f0/spec/_files/simple.txt000066400000000000000000000001001172165107700215160ustar00rootroot00000000000000Hello Chris You have just won $10000! Well, $6000, after taxes. janl-mustache.js-90cc5f0/spec/_files/template_partial.2.mustache000066400000000000000000000000211172165107700247100ustar00rootroot00000000000000Again, {{again}}!janl-mustache.js-90cc5f0/spec/_files/template_partial.js000066400000000000000000000001611172165107700233600ustar00rootroot00000000000000var partial_context = { title: function() { return "Welcome"; }, partial: { again: "Goodbye" } } janl-mustache.js-90cc5f0/spec/_files/template_partial.mustache000066400000000000000000000000371172165107700245570ustar00rootroot00000000000000

{{title}}

{{>partial}}janl-mustache.js-90cc5f0/spec/_files/template_partial.txt000066400000000000000000000000411172165107700235600ustar00rootroot00000000000000

Welcome

Again, Goodbye! janl-mustache.js-90cc5f0/spec/_files/two_in_a_row.js000066400000000000000000000000751172165107700225230ustar00rootroot00000000000000var two_in_a_row = { name: "Joe", greeting: "Welcome" }; janl-mustache.js-90cc5f0/spec/_files/two_in_a_row.mustache000066400000000000000000000000271172165107700237150ustar00rootroot00000000000000{{greeting}}, {{name}}!janl-mustache.js-90cc5f0/spec/_files/two_in_a_row.txt000066400000000000000000000000161172165107700227210ustar00rootroot00000000000000Welcome, Joe! janl-mustache.js-90cc5f0/spec/_files/two_sections.js000066400000000000000000000000261172165107700225510ustar00rootroot00000000000000var two_sections = {};janl-mustache.js-90cc5f0/spec/_files/two_sections.mustache000066400000000000000000000000441172165107700237460ustar00rootroot00000000000000{{#foo}} {{/foo}} {{#bar}} {{/bar}} janl-mustache.js-90cc5f0/spec/_files/two_sections.txt000066400000000000000000000000011172165107700227450ustar00rootroot00000000000000 janl-mustache.js-90cc5f0/spec/_files/unescaped.js000066400000000000000000000001121172165107700217740ustar00rootroot00000000000000var unescaped = { title: function() { return "Bear > Shark"; } }; janl-mustache.js-90cc5f0/spec/_files/unescaped.mustache000066400000000000000000000000241172165107700231730ustar00rootroot00000000000000

{{{title}}}

janl-mustache.js-90cc5f0/spec/_files/unescaped.txt000066400000000000000000000000261172165107700222030ustar00rootroot00000000000000

Bear > Shark

janl-mustache.js-90cc5f0/spec/_files/unknown_pragma.js000066400000000000000000000000311172165107700230530ustar00rootroot00000000000000var unknown_pragma = {}; janl-mustache.js-90cc5f0/spec/_files/unknown_pragma.mustache000066400000000000000000000000421172165107700242520ustar00rootroot00000000000000{{%I-HAVE-THE-GREATEST-MUSTACHE}} janl-mustache.js-90cc5f0/spec/_files/unknown_pragma.txt000066400000000000000000000001441172165107700232630ustar00rootroot00000000000000ERROR: This implementation of mustache doesn't understand the 'I-HAVE-THE-GREATEST-MUSTACHE' pragma janl-mustache.js-90cc5f0/spec/_files/view_partial.2.mustache000066400000000000000000000001521172165107700240540ustar00rootroot00000000000000Hello {{name}} You have just won ${{value}}! {{#in_ca}} Well, ${{ taxed_value }}, after taxes. {{/in_ca}} janl-mustache.js-90cc5f0/spec/_files/view_partial.js000066400000000000000000000004531172165107700225230ustar00rootroot00000000000000var partial_context = { greeting: function() { return "Welcome"; }, farewell: function() { return "Fair enough, right?"; }, partial: { name: "Chris", value: 10000, taxed_value: function() { return this.value - (this.value * 0.4); }, in_ca: true } }; janl-mustache.js-90cc5f0/spec/_files/view_partial.mustache000066400000000000000000000000701172165107700237130ustar00rootroot00000000000000

{{greeting}}

{{>partial}}

{{farewell}}

janl-mustache.js-90cc5f0/spec/_files/view_partial.txt000066400000000000000000000001571172165107700227270ustar00rootroot00000000000000

Welcome

Hello Chris You have just won $10000! Well, $6000, after taxes.

Fair enough, right?

janl-mustache.js-90cc5f0/spec/_files/whitespace_partial.2.mustache000066400000000000000000000001621172165107700252370ustar00rootroot00000000000000Hello {{ name}} You have just won ${{value }}! {{# in_ca }} Well, ${{ taxed_value }}, after taxes. {{/ in_ca }} janl-mustache.js-90cc5f0/spec/_files/whitespace_partial.js000066400000000000000000000004531172165107700237050ustar00rootroot00000000000000var partial_context = { greeting: function() { return "Welcome"; }, farewell: function() { return "Fair enough, right?"; }, partial: { name: "Chris", value: 10000, taxed_value: function() { return this.value - (this.value * 0.4); }, in_ca: true } }; janl-mustache.js-90cc5f0/spec/_files/whitespace_partial.mustache000066400000000000000000000001001172165107700250670ustar00rootroot00000000000000

{{ greeting }}

{{> partial }}

{{ farewell }}

janl-mustache.js-90cc5f0/spec/_files/whitespace_partial.txt000066400000000000000000000001571172165107700241110ustar00rootroot00000000000000

Welcome

Hello Chris You have just won $10000! Well, $6000, after taxes.

Fair enough, right?

janl-mustache.js-90cc5f0/spec/mustache_spec.rb000066400000000000000000000153041172165107700214070ustar00rootroot00000000000000require 'rubygems' require 'json' ROOT = File.expand_path('../..', __FILE__) SPEC = File.join(ROOT, 'spec') FILES = File.join(SPEC, '_files') MUSTACHE = File.read(File.join(ROOT, "mustache.js")) TESTS = Dir.glob(File.join(FILES, '*.js')).map do |name| File.basename name, '.js' end PARTIALS = TESTS.select {|t| t.include? "partial" } NON_PARTIALS = TESTS.select {|t| not t.include? "partial" } NODE_PATH = `which node`.strip JS_PATH = `which js`.strip JSC_PATH = "/System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Resources/jsc" RHINO_JAR = "org.mozilla.javascript.tools.shell.Main" def load_test(name, is_partial=false) view = File.read(File.join(FILES, "#{name}.js")) template = File.read(File.join(FILES, "#{name}.mustache")).to_json expect = File.read(File.join(FILES, "#{name}.txt")) test = [view, template, expect] if is_partial test << File.read(File.join(FILES, "#{name}.2.mustache")).to_json end test end def run_js(runner, js) cmd = case runner when :spidermonkey JS_PATH when :jsc JSC_PATH when :rhino "java #{RHINO_JAR}" when :node NODE_PATH end runner_file = "runner.js" File.open(runner_file, 'w') {|file| file.write(js) } `#{cmd} #{runner_file}` ensure FileUtils.rm_r(runner_file) end $engines_run = 0 describe "mustache" do shared_examples_for "mustache rendering" do before(:all) do $engines_run += 1 end it "should return the same when invoked multiple times" do js = <<-JS #{@boilerplate} Mustache.to_html("x") print(Mustache.to_html("x")); JS run_js(@runner, js).should == "x\n" end it "should clear the context after each run" do js = <<-JS #{@boilerplate} Mustache.to_html("{{#list}}{{x}}{{/list}}", {list: [{x: 1}]}) try { print(Mustache.to_html("{{#list}}{{x}}{{/list}}", {list: [{}]})); } catch(e) { print('ERROR: ' + e.message); } JS run_js(@runner, js).should == "\n" end NON_PARTIALS.each do |test| describe test do it "should generate the correct html" do view, template, expect = load_test(test) js = <<-JS try { #{@boilerplate} #{view} var template = #{template}; var result = Mustache.to_html(template, #{test}); print(result); } catch(e) { print('ERROR: ' + e.message); } JS run_js(@runner, js).should == expect end it "should sendFun the correct html" do view, template, expect = load_test(test) js = <<-JS try { #{@boilerplate} #{view} var chunks = []; var sendFun = function(chunk) { if (chunk != "") { chunks.push(chunk); } } var template = #{template}; Mustache.to_html(template, #{test}, null, sendFun); print(chunks.join("\\n")); } catch(e) { print('ERROR: ' + e.message); } JS run_js(@runner, js).strip.should == expect.strip end end end PARTIALS.each do |test| describe test do it "should generate the correct html" do view, template, expect, partial = load_test(test, true) js = <<-JS try { #{@boilerplate} #{view} var template = #{template}; var partials = {"partial": #{partial}}; var result = Mustache.to_html(template, partial_context, partials); print(result); } catch(e) { print('ERROR: ' + e.message); } JS run_js(@runner, js).should == expect end it "should sendFun the correct html" do view, template, expect, partial = load_test(test, true) js = <<-JS try { #{@boilerplate} #{view}; var template = #{template}; var partials = {"partial": #{partial}}; var chunks = []; var sendFun = function(chunk) { if (chunk != "") { chunks.push(chunk); } } Mustache.to_html(template, partial_context, partials, sendFun); print(chunks.join("\\n")); } catch(e) { print('ERROR: ' + e.message); } JS run_js(@runner, js).strip.should == expect.strip end end end end context "running in node" do if File.exist?(NODE_PATH) before(:all) do $stdout.write "Testing in node " @runner = :node @boilerplate = MUSTACHE.dup @boilerplate << <<-JS function print(message) { console.log(message); } JS end after(:all) do puts " Done!" end it_should_behave_like "mustache rendering" else puts "Skipping tests in node (node not found)" end end context "running in SpiderMonkey (Mozilla, Firefox)" do if File.exist?(JS_PATH) before(:all) do $stdout.write "Testing in SpiderMonkey " @runner = :spidermonkey @boilerplate = MUSTACHE.dup end after(:all) do puts " Done!" end it_should_behave_like "mustache rendering" else puts "Skipping tests in SpiderMonkey (js not found)" end end context "running in JavaScriptCore (WebKit, Safari)" do if File.exist?(JSC_PATH) before(:all) do $stdout.write "Testing in JavaScriptCore " @runner = :jsc @boilerplate = MUSTACHE.dup end after(:all) do puts " Done!" end it_should_behave_like "mustache rendering" else puts "Skipping tests in JavaScriptCore (jsc not found)" end end context "running in Rhino (Mozilla, Java)" do if `java #{RHINO_JAR} 'foo' 2>&1` !~ /ClassNotFoundException/ before(:all) do $stdout.write "Testing in Rhino " @runner = :rhino @boilerplate = MUSTACHE.dup end after(:all) do puts " Done!" end it_should_behave_like "mustache rendering" else puts "Skipping tests in Rhino (JAR #{RHINO_JAR} was not found)" end end context "suite" do before(:each) do $stdout.write "Verifying that we ran at the tests in at least one engine ... " end after(:each) do if @exception.nil? puts "OK" else puts "ERROR!" end end it "should have run at least one time" do $engines_run.should > 0 end end end janl-mustache.js-90cc5f0/wrappers/000077500000000000000000000000001172165107700171455ustar00rootroot00000000000000janl-mustache.js-90cc5f0/wrappers/commonjs/000077500000000000000000000000001172165107700207725ustar00rootroot00000000000000janl-mustache.js-90cc5f0/wrappers/commonjs/mustache.js.tpl.post000066400000000000000000000003441172165107700247240ustar00rootroot00000000000000if (typeof module !== 'undefined' && module.exports) { exports.name = Mustache.name; exports.version = Mustache.version; exports.to_html = function() { return Mustache.to_html.apply(this, arguments); }; } janl-mustache.js-90cc5f0/wrappers/commonjs/mustache.js.tpl.pre000066400000000000000000000001561172165107700245260ustar00rootroot00000000000000/* * CommonJS-compatible mustache.js module * * See http://github.com/janl/mustache.js for more info. */ janl-mustache.js-90cc5f0/wrappers/commonjs/package.json000066400000000000000000000003771172165107700232670ustar00rootroot00000000000000{ "name": "mustache", "author": "http://mustache.github.com/", "description": "Logic-less {{mustache}} templates with JavaScript", "keywords": ["template", "templates", "mustache"], "version": "{{version}}", "main": "./mustache" } janl-mustache.js-90cc5f0/wrappers/dojo/000077500000000000000000000000001172165107700201005ustar00rootroot00000000000000janl-mustache.js-90cc5f0/wrappers/dojo/mustache.js.tpl.post000066400000000000000000000000731172165107700240310ustar00rootroot00000000000000 dojox.mustache = dojo.hitch(Mustache, "to_html"); })();janl-mustache.js-90cc5f0/wrappers/dojo/mustache.js.tpl.pre000066400000000000000000000003001172165107700236230ustar00rootroot00000000000000/* Shameless port of a shameless port @defunkt => @janl => @aq => @voodootikigod See http://github.com/defunkt/mustache for more info. */ dojo.provide("dojox.mustache._base"); (function(){ janl-mustache.js-90cc5f0/wrappers/jquery/000077500000000000000000000000001172165107700204645ustar00rootroot00000000000000janl-mustache.js-90cc5f0/wrappers/jquery/jquery.mustache.js.tpl.post000066400000000000000000000001761172165107700257370ustar00rootroot00000000000000 $.mustache = function(template, view, partials) { return Mustache.to_html(template, view, partials); }; })(jQuery); janl-mustache.js-90cc5f0/wrappers/jquery/jquery.mustache.js.tpl.pre000066400000000000000000000002151172165107700255320ustar00rootroot00000000000000/* Shameless port of a shameless port @defunkt => @janl => @aq See http://github.com/defunkt/mustache for more info. */ ;(function($) { janl-mustache.js-90cc5f0/wrappers/qooxdoo/000077500000000000000000000000001172165107700206355ustar00rootroot00000000000000janl-mustache.js-90cc5f0/wrappers/qooxdoo/qooxdoo.mustache.js.tpl.post000066400000000000000000000002511172165107700262530ustar00rootroot00000000000000/** * Above is the original mustache code. */ // EXPOSE qooxdoo variant qx.bom.Template.version = Mustache.version; qx.bom.Template.toHtml = Mustache.to_html; })(); janl-mustache.js-90cc5f0/wrappers/qooxdoo/qooxdoo.mustache.js.tpl.pre000066400000000000000000000105141172165107700260570ustar00rootroot00000000000000/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2011 1&1 Internet AG, Germany, http://www.1und1.de License: LGPL: http://www.gnu.org/licenses/lgpl.html EPL: http://www.eclipse.org/org/documents/epl-v10.php See the LICENSE file in the project's top-level directory for details. Authors: * Martin Wittemann (martinwittemann) ====================================================================== This class contains code based on the following work: * Mustache.js version 0.4.2 Code: https://github.com/janl/mustache.js Copyright: (c) 2009 Chris Wanstrath (Ruby) (c) 2010 Jan Lehnardt (JavaScript) License: MIT: http://www.opensource.org/licenses/mit-license.php ---------------------------------------------------------------------- Copyright (c) 2009 Chris Wanstrath (Ruby) Copyright (c) 2010 Jan Lehnardt (JavaScript) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ************************************************************************ */ /** * The is a template class which can be used for HTML templating. In fact, * this is a wrapper for mustache.js which is a "framework-agnostic way to * render logic-free views". * * Here is a basic example how to use it: * Template: *
 * var template = "Hi, my name is {{name}}!";
 * var view = {name: "qooxdoo"};
 * qx.bom.Template.toHtml(template, view);
 * // return "Hi, my name is qooxdoo!"
 * 
* * For further details, please visit the mustache.js documentation here: * https://github.com/janl/mustache.js/blob/master/README.md */ qx.Class.define("qx.bom.Template", { statics : { /** Contains the mustache.js version. */ version: null, /** * Original and only template method of mustache.js. For further * documentation, please visit https://github.com/janl/mustache.js * * @signature function(template, view, partials, send_fun) * @param template {String} The String containing the template. * @param view {Object} The object holding the data to render. * @param partials {Object} Object holding parts of a template. * @param send_fun {Function?} Callback function for streaming. * @return {String} The parsed template. */ toHtml: null, /** * Helper method which provides you with a direct access to templates * stored as HTML in the DOM. The DOM node with the given ID will be reated * as a template, parsed and a new DOM node will be returned containing the * parsed data. * * @param id {String} The id of the HTML template in the DOM. * @param view {Object} The object holding the data to render. * @param partials {Object} Object holding parts of a template. * @return {DomNode} A DOM element holding the parsed template data. */ get : function(id, view, partials) { var template = document.getElementById(id); var inner = template.innerHTML; inner = this.toHtml(inner, view, partials); var helper = qx.bom.Element.create("div"); helper.innerHTML = inner; return helper.children[0]; } } }); (function() { /** * Below is the original mustache.js code. Snapshot date is mentioned in * the head of this file. */ janl-mustache.js-90cc5f0/wrappers/requirejs/000077500000000000000000000000001172165107700211565ustar00rootroot00000000000000janl-mustache.js-90cc5f0/wrappers/requirejs/requirejs.mustache.js.tpl.post000066400000000000000000000000251172165107700271140ustar00rootroot00000000000000 return Mustache; });janl-mustache.js-90cc5f0/wrappers/requirejs/requirejs.mustache.js.tpl.pre000066400000000000000000000001741172165107700267220ustar00rootroot00000000000000/* Shameless port of a shameless port ^ 2 @defunkt => @janl => @aq => @voodootikigod => @timruffles */ define(function(){ janl-mustache.js-90cc5f0/wrappers/yui3/000077500000000000000000000000001172165107700200365ustar00rootroot00000000000000janl-mustache.js-90cc5f0/wrappers/yui3/mustache.js.tpl.post000066400000000000000000000000561172165107700237700ustar00rootroot00000000000000 Y.mustache = Mustache.to_html; }, "0"); janl-mustache.js-90cc5f0/wrappers/yui3/mustache.js.tpl.pre000066400000000000000000000000421172165107700235640ustar00rootroot00000000000000YUI.add("mustache", function(Y) {