From 88f2e7e2004309ab887d5840d66339f57ea78405 Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Sat, 29 May 2010 11:31:51 +0200 Subject: [PATCH 1/6] open FaQ, answer dot notation question --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index bfda4db..fefddd9 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,15 @@ iteration marker: {{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 From 87c7ff84bd1181e50f276314d9fb2ee123a16cf7 Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Sat, 29 May 2010 11:35:26 +0200 Subject: [PATCH 2/6] =?UTF-8?q?whitespacin=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 76 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index fefddd9..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,8 +248,8 @@ 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}} From 5c086428384c8dc31e34226eb1179d17f26090e7 Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Tue, 1 Jun 2010 16:40:37 +0200 Subject: [PATCH 3/6] Make IMPLICIT ITERATORS a first class feature. Closes #39. --- examples/array_of_partials_implicit_partial.html | 1 - examples/array_of_strings.html | 1 - examples/array_partial.2.html | 2 -- examples/array_partial.txt | 2 -- mustache.js | 7 +++++-- 5 files changed, 5 insertions(+), 8 deletions(-) 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..38fa5ab 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 diff --git a/examples/array_partial.2.html b/examples/array_partial.2.html index 80d1d09..c2ea36c 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..fa87c28 100644 --- a/examples/array_partial.txt +++ b/examples/array_partial.txt @@ -1,6 +1,4 @@ Here's a non-sense array of values - - 1 2 3 diff --git a/mustache.js b/mustache.js index be1d7e6..4b0a43e 100644 --- a/mustache.js +++ b/mustache.js @@ -260,8 +260,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; From 497be8d81f83444b9057b8564bdca763725e3e31 Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Tue, 1 Jun 2010 16:47:26 +0200 Subject: [PATCH 4/6] update changes --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f843e74..e91c38b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ ## 0.3.0 (??-??-????) +* Make IMPLICIT ITERATORS a first class feature. * Fix Rhino compat. * CommonJS packaging is no longer a special case. * DRY Rakefile. From 1ddda5c5f8007bd9297b0e6f0050f03277a2549b Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Thu, 3 Jun 2010 19:34:35 +0200 Subject: [PATCH 5/6] Allow empty-string partials. Closes #40. --- mustache.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mustache.js b/mustache.js index 4b0a43e..80448b1 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") { From e4ab54d524cf52843c163efc428ad2f54d3806cc Mon Sep 17 00:00:00 2001 From: Jan Lehnardt Date: Fri, 4 Jun 2010 14:33:29 +0200 Subject: [PATCH 6/6] better whitspacing, closes #41 --- CHANGES.md | 1 + examples/array_of_strings.html | 2 +- examples/array_of_strings_options.html | 2 +- examples/array_partial.2.html | 2 +- examples/array_partial.txt | 8 ++++---- examples/complex.html | 12 ++++++------ examples/complex.txt | 10 +++++----- examples/partial_recursion.2.html | 2 +- examples/partial_recursion.html | 2 +- examples/recursion_with_same_names.txt | 4 ++-- examples/reuse_of_enumerables.txt | 8 ++++---- examples/section_as_context.html | 2 +- examples/section_as_context.txt | 6 +++--- mustache.js | 2 +- 14 files changed, 32 insertions(+), 31 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e91c38b..c3e69da 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ ## 0.3.0 (??-??-????) +* Improved whitespace handling. * Make IMPLICIT ITERATORS a first class feature. * Fix Rhino compat. * CommonJS packaging is no longer a special case. diff --git a/examples/array_of_strings.html b/examples/array_of_strings.html index 38fa5ab..2898705 100644 --- a/examples/array_of_strings.html +++ b/examples/array_of_strings.html @@ -1 +1 @@ -{{#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 c2ea36c..235dd5f 100644 --- a/examples/array_partial.2.html +++ b/examples/array_partial.2.html @@ -1,4 +1,4 @@ Here's a non-sense array of values {{#array}} - {{.}} + {{.}} {{/array}} \ No newline at end of file diff --git a/examples/array_partial.txt b/examples/array_partial.txt index fa87c28..fd5f48e 100644 --- a/examples/array_partial.txt +++ b/examples/array_partial.txt @@ -1,6 +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 80448b1..f3531e7 100644 --- a/mustache.js +++ b/mustache.js @@ -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*\\2\\s*" + this.ctag + + "\n*([\\s\\S]+?)" + this.otag + "\\/\\s*\\2\\s*" + this.ctag + "\\s*", "mg"); // for each {{#foo}}{{/foo}} section do...