diff --git a/CHANGES.md b/CHANGES.md index f843e74..c3e69da 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ ## 0.3.0 (??-??-????) +* Improved whitespace handling. +* Make IMPLICIT ITERATORS a first class feature. * Fix Rhino compat. * CommonJS packaging is no longer a special case. * DRY Rakefile. diff --git a/README.md b/README.md index bfda4db..7434356 100644 --- a/README.md +++ b/README.md @@ -8,16 +8,15 @@ plugins, see . ## Where to Use? -You can use mustache.js rendering stuff in various scenarios. E.g. you can render -templates in your browser, or rendering server-side stuff with [node.js][node.js], -use it for rendering stuff in [CouchDB][couchdb]'s views. +You can use mustache.js rendering stuff in various scenarios. E.g. you can +render templates in your browser, or rendering server-side stuff with +[node.js][node.js], use it for rendering stuff in [CouchDB][couchdb]’s views. ## Who Uses Mustache? An updated list is kept on the Github wiki. Add yourself, if you use -mustache.js: - +mustache.js: ## Usage @@ -35,16 +34,16 @@ A quick example how to use mustache.js: var html = Mustache.to_html(template, view); -`template` is a simple string with mustache tags and `view` is a JavaScript object containing the. +`template` is a simple string with mustache tags and `view` is a JavaScript +object containing the data and any code to render the template. ## Template Tag Types There are several types of tags currently implemented in mustache.js. -For a language-agnostic overview of Mustache's template syntax, see -the `mustache(5)` manpage or -. +For a language-agnostic overview of Mustache’s template syntax, see the +`mustache(5)` manpage or . ### Simple Tags @@ -57,10 +56,10 @@ Tags are always surrounded by mustaches like this `{{foobar}}`. ### Conditional Sections -Conditional sections begin with `{{#condition}}` and end with `{{/condition}}`. When -`condition` evaluates to true, the section is rendered, otherwise the hole block will -output nothing at all. `condition` may be a function returning true/false or a simple -boolean. +Conditional sections begin with `{{#condition}}` and end with +`{{/condition}}`. When `condition` evaluates to true, the section is rendered, +otherwise the hole 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...] @@ -76,8 +75,9 @@ boolean. 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. +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"]} @@ -90,8 +90,8 @@ the items. Use `{{.}}` to access the current item inside the enumeration section ### 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. +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 JS: @@ -110,8 +110,8 @@ 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. +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. @@ -151,8 +151,8 @@ Here is the result: ### Inverted Sections -An inverted section opens with `{{^section}}` instead of `{{#section}}` and uses a -boolean negative to evaluate. Empty arrays are considered falsy. +An inverted section opens with `{{^section}}` instead of `{{#section}}` and +uses a boolean negative to evaluate. Empty arrays are considered falsy. View: @@ -172,8 +172,8 @@ Result: ### View Partials -mustache.js supports a quite powerful but yet simple view partial mechanism. Use the -following syntax for partials: `{{>partial_name}}` +mustache.js supports a quite powerful but yet simple view partial mechanism. +Use the following syntax for partials: `{{>partial_name}}` var view = { name: "Joe", @@ -194,24 +194,25 @@ following syntax for partials: `{{>partial_name}}` 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`. +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 -tripple mustaches like `{{{unescaped_variable}}}`. +mustache.js does escape all values when using the standard double mustache +syntax. Characters which will be escaped: `& \ " < >`. To disable escaping, +simply use tripple 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: +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); @@ -220,7 +221,8 @@ callback to the `to_html()` call: ## Pragmas -Pragma tags let you alter the behaviour of mustache.js. They have the format of +Pragma tags let you alter the behaviour of mustache.js. They have the format +of {{%PRAGMANAME}} @@ -231,9 +233,9 @@ and they accept options: ### 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: +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"] @@ -246,14 +248,23 @@ The following template can iterate over the member `foo`: {{.}} {{/foo}} -If you don't like the dot in there, the pragma accepts an option to set your own -iteration marker: +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}} +## FaQ + +### Why doesn’t Mustache allow dot notation like `{{variable.member}}`? + +The reason is given in the [mustache.rb +bugtracker](http://github.com/defunkt/mustache/issues/issue/6). + +Mustache implementations strive to be template-compatible. + ## More Examples and Documentation diff --git a/examples/array_of_partials_implicit_partial.html b/examples/array_of_partials_implicit_partial.html index 11537e9..1af6d68 100644 --- a/examples/array_of_partials_implicit_partial.html +++ b/examples/array_of_partials_implicit_partial.html @@ -1,5 +1,4 @@ Here is some stuff! -{{%IMPLICIT-ITERATOR}} {{#numbers}} {{>partial}} {{/numbers}} diff --git a/examples/array_of_strings.html b/examples/array_of_strings.html index ab058c4..2898705 100644 --- a/examples/array_of_strings.html +++ b/examples/array_of_strings.html @@ -1,2 +1 @@ -{{%IMPLICIT-ITERATOR}} -{{#array_of_strings}} {{.}} {{/array_of_strings}} \ No newline at end of file +{{#array_of_strings}}{{.}} {{/array_of_strings}} \ No newline at end of file diff --git a/examples/array_of_strings_options.html b/examples/array_of_strings_options.html index 87fbf5e..6b28278 100644 --- a/examples/array_of_strings_options.html +++ b/examples/array_of_strings_options.html @@ -1,2 +1,2 @@ {{%IMPLICIT-ITERATOR iterator=rob}} -{{#array_of_strings_options}} {{rob}} {{/array_of_strings_options}} \ No newline at end of file +{{#array_of_strings_options}}{{rob}} {{/array_of_strings_options}} \ No newline at end of file diff --git a/examples/array_partial.2.html b/examples/array_partial.2.html index 80d1d09..235dd5f 100644 --- a/examples/array_partial.2.html +++ b/examples/array_partial.2.html @@ -1,6 +1,4 @@ Here's a non-sense array of values - -{{%IMPLICIT-ITERATOR}} {{#array}} - {{.}} + {{.}} {{/array}} \ No newline at end of file diff --git a/examples/array_partial.txt b/examples/array_partial.txt index a604ac2..fd5f48e 100644 --- a/examples/array_partial.txt +++ b/examples/array_partial.txt @@ -1,8 +1,6 @@ Here's a non-sense array of values - - -1 -2 -3 -4 + 1 + 2 + 3 + 4 diff --git a/examples/complex.html b/examples/complex.html index e7ca1b5..23bec3c 100644 --- a/examples/complex.html +++ b/examples/complex.html @@ -2,12 +2,12 @@ {{#list}}
    {{#item}} - {{#current}} -
  • {{name}}
  • - {{/current}} - {{#link}} -
  • {{name}}
  • - {{/link}} + {{#current}} +
  • {{name}}
  • + {{/current}} + {{#link}} +
  • {{name}}
  • + {{/link}} {{/item}}
{{/list}} diff --git a/examples/complex.txt b/examples/complex.txt index eb78d45..b51ca10 100644 --- a/examples/complex.txt +++ b/examples/complex.txt @@ -1,6 +1,6 @@

Colors

- + diff --git a/examples/partial_recursion.2.html b/examples/partial_recursion.2.html index c002d68..457d2a0 100644 --- a/examples/partial_recursion.2.html +++ b/examples/partial_recursion.2.html @@ -1,4 +1,4 @@ {{name}} {{#children}} - {{>partial}} +{{>partial}} {{/children}} \ No newline at end of file diff --git a/examples/partial_recursion.html b/examples/partial_recursion.html index 8d67c38..d965a6a 100644 --- a/examples/partial_recursion.html +++ b/examples/partial_recursion.html @@ -1,4 +1,4 @@ {{name}} {{#kids}} - {{>partial}} +{{>partial}} {{/kids}} \ No newline at end of file diff --git a/examples/recursion_with_same_names.txt b/examples/recursion_with_same_names.txt index 0f3e1bc..c23bb65 100644 --- a/examples/recursion_with_same_names.txt +++ b/examples/recursion_with_same_names.txt @@ -1,6 +1,6 @@ name desc -t1 + t1 0 -t2 + t2 1 diff --git a/examples/reuse_of_enumerables.txt b/examples/reuse_of_enumerables.txt index c6d5170..6d05d96 100644 --- a/examples/reuse_of_enumerables.txt +++ b/examples/reuse_of_enumerables.txt @@ -1,8 +1,8 @@ -t1 + t1 0 -t2 + t2 1 -t1 + t1 0 -t2 + t2 1 diff --git a/examples/section_as_context.html b/examples/section_as_context.html index 6a39a43..59990f6 100644 --- a/examples/section_as_context.html +++ b/examples/section_as_context.html @@ -3,7 +3,7 @@

{{description}}

    {{#a_list}} -
  • {{label}}
  • +
  • {{label}}
  • {{/a_list}}
{{/a_object}} diff --git a/examples/section_as_context.txt b/examples/section_as_context.txt index 55d4179..53ee336 100644 --- a/examples/section_as_context.txt +++ b/examples/section_as_context.txt @@ -1,6 +1,6 @@ -

this is an object

+

this is an object

one of its attributes is a list

    -
  • listitem1
  • -
  • listitem2
  • +
  • listitem1
  • +
  • listitem2
diff --git a/mustache.js b/mustache.js index 09807c3..55df52a 100644 --- a/mustache.js +++ b/mustache.js @@ -85,7 +85,7 @@ var Mustache = function() { */ render_partial: function(name, context, partials) { name = this.trim(name); - if(!partials || !partials[name]) { + if(!partials || partials[name] === undefined) { throw({message: "unknown_partial '" + name + "'"}); } if(typeof(context[name]) != "object") { @@ -105,7 +105,7 @@ var Mustache = function() { var that = this; // CSW - Added "+?" so it finds the tighest bound, not the widest var regex = new RegExp(this.otag + "(\\^|\\#)\\s*((.+?)(\\(.*\\))?)\\s*" + this.ctag + - "\\s*([\\s\\S]+?)" + this.otag + "\\/\\s*\\3\\s*" + this.ctag + + "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\3\\s*" + this.ctag + "\\s*", "mg"); // for each {{#foo}}{{/foo}} section do... @@ -276,8 +276,11 @@ var Mustache = function() { create_context: function(_context) { if(this.is_object(_context)) { return _context; - } else if(this.pragmas["IMPLICIT-ITERATOR"]) { - var iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator || "."; + } else { + var iterator = "."; + if(this.pragmas["IMPLICIT-ITERATOR"]) { + iterator = this.pragmas["IMPLICIT-ITERATOR"].iterator; + } var ctx = {}; ctx[iterator] = _context; return ctx;