.
### 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;