Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

issue #672: add tags parameter to render #673

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
13 changes: 7 additions & 6 deletions README.md
Expand Up @@ -117,9 +117,10 @@ Following is an [rtype](https://git.io/rtype) signature of the most commonly use

```js
Mustache.render(
template : String,
view : Object,
partials? : Object,
template : String,
view : Object,
partials? : Object,
tags = ['{{', '}}'] : Tags,
) => String

Mustache.parse(
Expand Down Expand Up @@ -504,15 +505,15 @@ Custom delimiters can be used in place of `{{` and `}}` by setting the new value

#### Setting in JavaScript

The `Mustache.tags` property holds an array consisting of the opening and closing tag values. Set custom values by passing a new array of tags to `parse()`, which gets honored over the default values, or by overriding the `tags` property itself:
The `Mustache.tags` property holds an array consisting of the opening and closing tag values. Set custom values by passing a new array of tags to `render()`, which gets honored over the default values, or by overriding the `tags` property itself:

```js
var customTags = [ '<%', '%>' ];
```

##### Pass Value into Parse Method
##### Pass Value into Render Method
```js
Mustache.parse(template, customTags);
Mustache.render(template, view, {}, customTags);
```

##### Override Tags Property
Expand Down
16 changes: 11 additions & 5 deletions mustache.js
Expand Up @@ -461,9 +461,13 @@
* names and templates of partials that are used in the template. It may
* also be a function that is used to load partial templates on the fly
* that takes a single argument: the name of the partial.
*
* If the optional `tags` argument is given here it must be an array with two
* string values: the opening and closing tags used in the template (e.g.
* [ "<%", "%>" ]). The default is to mustache.tags.
*/
Writer.prototype.render = function render (template, view, partials) {
var tokens = this.parse(template);
Writer.prototype.render = function render (template, view, partials, tags) {
var tokens = this.parse(template, tags);
var context = (view instanceof Context) ? view : new Context(view);
return this.renderTokens(tokens, context, partials, template);
};
Expand Down Expand Up @@ -592,16 +596,18 @@

/**
* Renders the `template` with the given `view` and `partials` using the
* default writer.
* default writer. If the optional `tags` argument is given here it must be an
* array with two string values: the opening and closing tags used in the
* template (e.g. [ "<%", "%>" ]). The default is to mustache.tags.
*/
mustache.render = function render (template, view, partials) {
mustache.render = function render (template, view, partials, tags) {
if (typeof template !== 'string') {
throw new TypeError('Invalid template! Template should be a "string" ' +
'but "' + typeStr(template) + '" was given as the first ' +
'argument for mustache#render(template, view, partials)');
}

return defaultWriter.render(template, view, partials);
return defaultWriter.render(template, view, partials, tags);
};

// This is here for backwards compatibility with 0.4.x.,
Expand Down
32 changes: 32 additions & 0 deletions test/render-test.js
Expand Up @@ -17,6 +17,38 @@ describe('Mustache.render', function () {
'for mustache#render(template, view, partials)');
});

it('uses tags argument instead of Mustache.tags when given', function () {
var template = '<<placeholder>>bar{{placeholder}}';

Mustache.tags = ['{{', '}}'];
assert.equal(Mustache.render(template, { placeholder: 'foo' }, {}, ['<<', '>>']), 'foobar{{placeholder}}');
});

it('uses tags argument instead of Mustache.tags when given, even when it previous rendered the template using Mustache.tags', function () {
var template = '((placeholder))bar{{placeholder}}';

Mustache.tags = ['{{', '}}'];
Mustache.render(template, { placeholder: 'foo' });
assert.equal(Mustache.render(template, { placeholder: 'foo' }, {}, ['((', '))']), 'foobar{{placeholder}}');
});

it('uses tags argument instead of Mustache.tags when given, even when it previous rendered the template using different tags', function () {
var template = '[[placeholder]]bar<<placeholder>>';

Mustache.render(template, { placeholder: 'foo' }, {}, ['<<', '>>']);
assert.equal(Mustache.render(template, { placeholder: 'foo' }, {}, ['[[', ']]']), 'foobar<<placeholder>>');
});

it('does not mutate Mustache.tags when given tags argument', function() {
var correctMustacheTags = ['{{', '}}'];
Mustache.tags = correctMustacheTags;

Mustache.render('((placeholder))', { placeholder: 'foo' }, {}, ['((', '))']);

assert.equal(Mustache.tags, correctMustacheTags);
assert.deepEqual(Mustache.tags, ['{{', '}}']);
});

tests.forEach(function (test) {
var view = eval(test.view);

Expand Down