Skip to content
This repository has been archived by the owner on Feb 24, 2018. It is now read-only.

Commit

Permalink
Merge pull request #7 from jadejs/escaped-to-mustEscape
Browse files Browse the repository at this point in the history
Rename escaped to mustEscape
  • Loading branch information
TimothyGu committed Oct 13, 2015
2 parents 6b963b9 + 2f9aa42 commit b5dfa06
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 70 deletions.
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Compile `attrs` to a JavaScript string that evaluates to the attributes in the d
- `runtime`: callback that takes a runtime function name and returns the source code that will evaluate to that function at runtime
- `format`: output format; must be `html` or `object`

`attrs` is an array of attributes, with each attribute having the form of `{ name, val, escaped }`. `val` represents a JavaScript string that evaluates to the value of the attribute, either statically or dynamically.
`attrs` is an array of attributes, with each attribute having the form of `{ name, val, mustEscape }`. `val` represents a JavaScript string that evaluates to the value of the attribute, either statically or dynamically.

```js
var compileAttrs = require('jade-attrs');
Expand All @@ -35,9 +35,9 @@ var jadeRuntime = require('jade-runtime');
function getBaz () { return 'baz<>'; }

var attrs = [
{name: 'foo', val: '"bar"', escaped: true },
{name: 'baz', val: 'getBaz()', escaped: true },
{name: 'quux', val: true, escaped: false}
{name: 'foo', val: '"bar"', mustEscape: true },
{name: 'baz', val: 'getBaz()', mustEscape: true },
{name: 'quux', val: true, mustEscape: false}
];
var result, finalResult;

Expand Down
20 changes: 10 additions & 10 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ function compileAttrs(attrs, options) {
typeof attr === 'object' &&
typeof attr.name === 'string' &&
(typeof attr.val === 'string' || typeof attr.val === 'boolean') &&
typeof attr.escaped === 'boolean';
}), 'All attributes should be supplied as an object of the form {name, val, escaped}');
typeof attr.mustEscape === 'boolean';
}), 'All attributes should be supplied as an object of the form {name, val, mustEscape}');
assert(options && typeof options === 'object', 'Options should be an object');
assert(typeof options.terse === 'boolean', 'Options.terse should be a boolean');
assert(
Expand All @@ -43,10 +43,10 @@ function compileAttrs(attrs, options) {
var classes = [];
var classEscaping = [];

function addAttribute(key, val, escaped, buf) {
function addAttribute(key, val, mustEscape, buf) {
if (isConstant(val)) {
if (options.format === 'html') {
var str = stringify(runtime.attr(key, toConstant(val), escaped, options.terse));
var str = stringify(runtime.attr(key, toConstant(val), mustEscape, options.terse));
var last = buf[buf.length - 1];
if (last && last[last.length - 1] === str[0]) {
buf[buf.length - 1] = last.substr(0, last.length - 1) + str.substr(1);
Expand All @@ -55,16 +55,16 @@ function compileAttrs(attrs, options) {
}
} else {
val = toConstant(val);
if (escaped) {
if (mustEscape) {
val = runtime.escape(val);
}
buf.push(stringify(key) + ': ' + stringify(val));
}
} else {
if (options.format === 'html') {
buf.push(options.runtime('attr') + '("' + key + '", ' + val + ', ' + stringify(escaped) + ', ' + stringify(options.terse) + ')');
buf.push(options.runtime('attr') + '("' + key + '", ' + val + ', ' + stringify(mustEscape) + ', ' + stringify(options.terse) + ')');
} else {
if (escaped) {
if (mustEscape) {
val = options.runtime('escape') + '(' + val + ')';
}
buf.push(stringify(key) + ': ' + val);
Expand All @@ -75,11 +75,11 @@ function compileAttrs(attrs, options) {
attrs.forEach(function(attr){
var key = attr.name;
var val = attr.val;
var escaped = attr.escaped;
var mustEscape = attr.mustEscape;

if (key === 'class') {
classes.push(val);
classEscaping.push(escaped);
classEscaping.push(mustEscape);
} else {
if (key === 'style') {
if (isConstant(val)) {
Expand All @@ -88,7 +88,7 @@ function compileAttrs(attrs, options) {
val = options.runtime('style') + '(' + val + ')';
}
}
addAttribute(key, val, escaped, buf);
addAttribute(key, val, mustEscape, buf);
}
});
var classesBuf = [];
Expand Down
112 changes: 56 additions & 56 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,68 +30,68 @@ function withOptions(opts, fn) {

withOptions({terse: true, format: 'html', runtime: function (name) { return 'jade.' + name; }}, function () {
test([], '');
test([{name: 'foo', val: 'false', escaped: true}], '');
test([{name: 'foo', val: 'true', escaped: true}], ' foo');
test([{name: 'foo', val: false, escaped: true}], '');
test([{name: 'foo', val: true, escaped: true}], ' foo');
test([{name: 'foo', val: 'foo', escaped: true}], '', {foo: false});
test([{name: 'foo', val: 'foo', escaped: true}], ' foo', {foo: true});
test([{name: 'foo', val: '"foo"', escaped: true}], ' foo="foo"');
test([{name: 'foo', val: '"foo"', escaped: true}, {name: 'bar', val: '"bar"', escaped: true}], ' foo="foo" bar="bar"');
test([{name: 'foo', val: 'foo', escaped: true}], ' foo="fooo"', {foo: 'fooo'});
test([{name: 'foo', val: 'foo', escaped: true}, {name: 'bar', val: 'bar', escaped: true}], ' foo="fooo" bar="baro"', {foo: 'fooo', bar: 'baro'});
test([{name: 'style', val: '{color: "red"}', escaped: true}], ' style="color:red"');
test([{name: 'style', val: '{color: color}', escaped: true}], ' style="color:red"', {color: 'red'});
test([{name: 'class', val: '"foo"', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], ' class="foo bar baz"');
test([{name: 'class', val: '{foo: foo}', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], ' class="foo bar baz"', {foo: true});
test([{name: 'class', val: '{foo: foo}', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], ' class="bar baz"', {foo: false});
test([{name: 'class', val: 'foo', escaped: true}, {name: 'class', val: '"<str>"', escaped: true}], ' class="&lt;foo&gt; &lt;str&gt;"', {foo: '<foo>'});
test([{name: 'foo', val: '"foo"', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], ' class="bar baz" foo="foo"');
test([{name: 'class', val: '["bar", "baz"]', escaped: true}, {name: 'foo', val: '"foo"', escaped: true}], ' class="bar baz" foo="foo"');
test([{name: 'foo', val: '"<foo>"', escaped: false}], ' foo="<foo>"');
test([{name: 'foo', val: '"<foo>"', escaped: true}], ' foo="&lt;foo&gt;"');
test([{name: 'foo', val: 'foo', escaped: false}], ' foo="<foo>"', {foo: '<foo>'});
test([{name: 'foo', val: 'foo', escaped: true}], ' foo="&lt;foo&gt;"', {foo: '<foo>'});
test([{name: 'foo', val: 'false', mustEscape: true}], '');
test([{name: 'foo', val: 'true', mustEscape: true}], ' foo');
test([{name: 'foo', val: false, mustEscape: true}], '');
test([{name: 'foo', val: true, mustEscape: true}], ' foo');
test([{name: 'foo', val: 'foo', mustEscape: true}], '', {foo: false});
test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo', {foo: true});
test([{name: 'foo', val: '"foo"', mustEscape: true}], ' foo="foo"');
test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'bar', val: '"bar"', mustEscape: true}], ' foo="foo" bar="bar"');
test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo="fooo"', {foo: 'fooo'});
test([{name: 'foo', val: 'foo', mustEscape: true}, {name: 'bar', val: 'bar', mustEscape: true}], ' foo="fooo" bar="baro"', {foo: 'fooo', bar: 'baro'});
test([{name: 'style', val: '{color: "red"}', mustEscape: true}], ' style="color:red"');
test([{name: 'style', val: '{color: color}', mustEscape: true}], ' style="color:red"', {color: 'red'});
test([{name: 'class', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="foo bar baz"');
test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="foo bar baz"', {foo: true});
test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="bar baz"', {foo: false});
test([{name: 'class', val: 'foo', mustEscape: true}, {name: 'class', val: '"<str>"', mustEscape: true}], ' class="&lt;foo&gt; &lt;str&gt;"', {foo: '<foo>'});
test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], ' class="bar baz" foo="foo"');
test([{name: 'class', val: '["bar", "baz"]', mustEscape: true}, {name: 'foo', val: '"foo"', mustEscape: true}], ' class="bar baz" foo="foo"');
test([{name: 'foo', val: '"<foo>"', mustEscape: false}], ' foo="<foo>"');
test([{name: 'foo', val: '"<foo>"', mustEscape: true}], ' foo="&lt;foo&gt;"');
test([{name: 'foo', val: 'foo', mustEscape: false}], ' foo="<foo>"', {foo: '<foo>'});
test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo="&lt;foo&gt;"', {foo: '<foo>'});
});
withOptions({terse: false, format: 'html', runtime: function (name) { return 'jade.' + name; }}, function () {
test([{name: 'foo', val: 'false', escaped: true}], '');
test([{name: 'foo', val: 'true', escaped: true}], ' foo="foo"');
test([{name: 'foo', val: false, escaped: true}], '');
test([{name: 'foo', val: true, escaped: true}], ' foo="foo"');
test([{name: 'foo', val: 'foo', escaped: true}], '', {foo: false});
test([{name: 'foo', val: 'foo', escaped: true}], ' foo="foo"', {foo: true});
test([{name: 'foo', val: 'false', mustEscape: true}], '');
test([{name: 'foo', val: 'true', mustEscape: true}], ' foo="foo"');
test([{name: 'foo', val: false, mustEscape: true}], '');
test([{name: 'foo', val: true, mustEscape: true}], ' foo="foo"');
test([{name: 'foo', val: 'foo', mustEscape: true}], '', {foo: false});
test([{name: 'foo', val: 'foo', mustEscape: true}], ' foo="foo"', {foo: true});
});

withOptions({terse: true, format: 'object', runtime: function (name) { return 'jade.' + name; }}, function () {
test([], {});
test([{name: 'foo', val: 'false', escaped: true}], {foo: false});
test([{name: 'foo', val: 'true', escaped: true}], {foo: true});
test([{name: 'foo', val: false, escaped: true}], {foo: false});
test([{name: 'foo', val: true, escaped: true}], {foo: true});
test([{name: 'foo', val: 'foo', escaped: true}], {foo: false}, {foo: false});
test([{name: 'foo', val: 'foo', escaped: true}], {foo: true}, {foo: true});
test([{name: 'foo', val: '"foo"', escaped: true}], {foo: 'foo'});
test([{name: 'foo', val: '"foo"', escaped: true}, {name: 'bar', val: '"bar"', escaped: true}], {foo: 'foo', bar: 'bar'});
test([{name: 'foo', val: 'foo', escaped: true}], {foo: 'fooo'}, {foo: 'fooo'});
test([{name: 'foo', val: 'foo', escaped: true}, {name: 'bar', val: 'bar', escaped: true}], {foo: 'fooo', bar: 'baro'}, {foo: 'fooo', bar: 'baro'});
test([{name: 'style', val: '{color: "red"}', escaped: true}], {style: 'color:red'});
test([{name: 'style', val: '{color: color}', escaped: true}], {style: 'color:red'}, {color: 'red'});
test([{name: 'class', val: '"foo"', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], {'class': 'foo bar baz'});
test([{name: 'class', val: '{foo: foo}', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], {'class': 'foo bar baz'}, {foo: true});
test([{name: 'class', val: '{foo: foo}', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], {'class': 'bar baz'}, {foo: false});
test([{name: 'class', val: 'foo', escaped: true}, {name: 'class', val: '"<str>"', escaped: true}], {'class': '&lt;foo&gt; &lt;str&gt;'}, {foo: '<foo>'});
test([{name: 'foo', val: '"foo"', escaped: true}, {name: 'class', val: '["bar", "baz"]', escaped: true}], {'class': 'bar baz', foo: 'foo'});
test([{name: 'class', val: '["bar", "baz"]', escaped: true}, {name: 'foo', val: '"foo"', escaped: true}], {'class': 'bar baz', foo: 'foo'});
test([{name: 'foo', val: '"<foo>"', escaped: false}], {foo: "<foo>"});
test([{name: 'foo', val: '"<foo>"', escaped: true}], {foo: "&lt;foo&gt;"});
test([{name: 'foo', val: 'foo', escaped: false}], {foo: "<foo>"}, {foo: '<foo>'});
test([{name: 'foo', val: 'foo', escaped: true}], {foo: "&lt;foo&gt;"}, {foo: '<foo>'});
test([{name: 'foo', val: 'false', mustEscape: true}], {foo: false});
test([{name: 'foo', val: 'true', mustEscape: true}], {foo: true});
test([{name: 'foo', val: false, mustEscape: true}], {foo: false});
test([{name: 'foo', val: true, mustEscape: true}], {foo: true});
test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: false}, {foo: false});
test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: true}, {foo: true});
test([{name: 'foo', val: '"foo"', mustEscape: true}], {foo: 'foo'});
test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'bar', val: '"bar"', mustEscape: true}], {foo: 'foo', bar: 'bar'});
test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: 'fooo'}, {foo: 'fooo'});
test([{name: 'foo', val: 'foo', mustEscape: true}, {name: 'bar', val: 'bar', mustEscape: true}], {foo: 'fooo', bar: 'baro'}, {foo: 'fooo', bar: 'baro'});
test([{name: 'style', val: '{color: "red"}', mustEscape: true}], {style: 'color:red'});
test([{name: 'style', val: '{color: color}', mustEscape: true}], {style: 'color:red'}, {color: 'red'});
test([{name: 'class', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'foo bar baz'});
test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'foo bar baz'}, {foo: true});
test([{name: 'class', val: '{foo: foo}', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'bar baz'}, {foo: false});
test([{name: 'class', val: 'foo', mustEscape: true}, {name: 'class', val: '"<str>"', mustEscape: true}], {'class': '&lt;foo&gt; &lt;str&gt;'}, {foo: '<foo>'});
test([{name: 'foo', val: '"foo"', mustEscape: true}, {name: 'class', val: '["bar", "baz"]', mustEscape: true}], {'class': 'bar baz', foo: 'foo'});
test([{name: 'class', val: '["bar", "baz"]', mustEscape: true}, {name: 'foo', val: '"foo"', mustEscape: true}], {'class': 'bar baz', foo: 'foo'});
test([{name: 'foo', val: '"<foo>"', mustEscape: false}], {foo: "<foo>"});
test([{name: 'foo', val: '"<foo>"', mustEscape: true}], {foo: "&lt;foo&gt;"});
test([{name: 'foo', val: 'foo', mustEscape: false}], {foo: "<foo>"}, {foo: '<foo>'});
test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: "&lt;foo&gt;"}, {foo: '<foo>'});
});
withOptions({terse: false, format: 'object', runtime: function (name) { return 'jade.' + name; }}, function () {
test([{name: 'foo', val: 'false', escaped: true}], {foo: false});
test([{name: 'foo', val: 'true', escaped: true}], {foo: true});
test([{name: 'foo', val: false, escaped: true}], {foo: false});
test([{name: 'foo', val: true, escaped: true}], {foo: true});
test([{name: 'foo', val: 'foo', escaped: true}], {foo: false}, {foo: false});
test([{name: 'foo', val: 'foo', escaped: true}], {foo: true}, {foo: true});
test([{name: 'foo', val: 'false', mustEscape: true}], {foo: false});
test([{name: 'foo', val: 'true', mustEscape: true}], {foo: true});
test([{name: 'foo', val: false, mustEscape: true}], {foo: false});
test([{name: 'foo', val: true, mustEscape: true}], {foo: true});
test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: false}, {foo: false});
test([{name: 'foo', val: 'foo', mustEscape: true}], {foo: true}, {foo: true});
});

0 comments on commit b5dfa06

Please sign in to comment.