1105 lines
41 KiB
JavaScript
Vendored
1105 lines
41 KiB
JavaScript
Vendored
/*
|
|
The MIT License (MIT)
|
|
|
|
Copyright (c) 2007-2017 Einar Lielmanis, Liam Newman, and contributors.
|
|
|
|
Permission is hereby granted, free of charge, to any person
|
|
obtaining a copy of this software and associated documentation files
|
|
(the "Software"), to deal in the Software without restriction,
|
|
including without limitation the rights to use, copy, modify, merge,
|
|
publish, distribute, sublicense, and/or sell copies of the Software,
|
|
and to permit persons to whom the Software is furnished to do so,
|
|
subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
*/
|
|
|
|
exports.test_data = {
|
|
default_options: [
|
|
{ name: "indent_size", value: "4" },
|
|
{ name: "indent_char", value: "' '" },
|
|
{ name: "indent_with_tabs", value: "false" },
|
|
{ name: "preserve_newlines", value: "true" },
|
|
{ name: "jslint_happy", value: "false" },
|
|
{ name: "keep_array_indentation", value: "false" },
|
|
{ name: "brace_style", value: "'collapse'" },
|
|
{ name: "extra_liners", value: "['html', 'head', '/html']" }
|
|
],
|
|
groups: [{
|
|
name: "Handle inline and block elements differently",
|
|
description: "",
|
|
matrix: [{}],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<body><h1>Block</h1></body>',
|
|
output: [
|
|
'<body>',
|
|
' <h1>Block</h1>',
|
|
'</body>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<body><i>Inline</i></body>'
|
|
}]
|
|
}, {
|
|
name: "End With Newline",
|
|
description: "",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "end_with_newline", value: "true" }
|
|
],
|
|
eof: '\n'
|
|
}, {
|
|
options: [
|
|
{ name: "end_with_newline", value: "false" }
|
|
],
|
|
eof: ''
|
|
}
|
|
|
|
],
|
|
tests: [
|
|
{ fragment: true, input: '', output: '{{eof}}' },
|
|
{ fragment: true, input: '<div></div>', output: '<div></div>{{eof}}' },
|
|
// { fragment: true, input: ' \n\n<div></div>\n\n\n\n', output: ' <div></div>{{eof}}' },
|
|
{ fragment: true, input: '\n', output: '{{eof}}' }
|
|
],
|
|
}, {
|
|
name: "Custom Extra Liners (empty)",
|
|
description: "",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "extra_liners", value: "[]" }
|
|
]
|
|
},
|
|
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',
|
|
output: '<html>\n<head>\n <meta>\n</head>\n<body>\n <div>\n <p>x</p>\n </div>\n</body>\n</html>'
|
|
}],
|
|
}, {
|
|
name: "Custom Extra Liners (default)",
|
|
description: "",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "extra_liners", value: "null" }
|
|
]
|
|
},
|
|
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html><head></head><body></body></html>',
|
|
output: '<html>\n\n<head></head>\n\n<body></body>\n\n</html>'
|
|
}],
|
|
}, {
|
|
name: "Custom Extra Liners (p, string)",
|
|
description: "",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "extra_liners", value: "'p,/p'" }
|
|
]
|
|
},
|
|
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',
|
|
output: '<html>\n<head>\n <meta>\n</head>\n<body>\n <div>\n\n <p>x\n\n </p>\n </div>\n</body>\n</html>'
|
|
}],
|
|
}, {
|
|
name: "Custom Extra Liners (p)",
|
|
description: "",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "extra_liners", value: "['p', '/p']" }
|
|
]
|
|
},
|
|
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',
|
|
output: '<html>\n<head>\n <meta>\n</head>\n<body>\n <div>\n\n <p>x\n\n </p>\n </div>\n</body>\n</html>'
|
|
}],
|
|
}, {
|
|
name: "Tests for script and style types (issue 453, 821)",
|
|
description: "Only format recognized script types",
|
|
tests: [{
|
|
input: '<script type="text/unknown"><div></div></script>',
|
|
output: [
|
|
'<script type="text/unknown">',
|
|
' <div></div>',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="text/javascript"><div></div></script>',
|
|
output: [
|
|
'<script type="text/javascript">',
|
|
' < div > < /div>',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script><div></div></script>',
|
|
output: [
|
|
'<script>',
|
|
' < div > < /div>',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script>var foo = "bar";</script>',
|
|
output: [
|
|
'<script>',
|
|
' var foo = "bar";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="text/javascript">var foo = "bar";</script>',
|
|
output: [
|
|
'<script type="text/javascript">',
|
|
' var foo = "bar";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="application/javascript">var foo = "bar";</script>',
|
|
output: [
|
|
'<script type="application/javascript">',
|
|
' var foo = "bar";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="application/javascript;version=1.8">var foo = "bar";</script>',
|
|
output: [
|
|
'<script type="application/javascript;version=1.8">',
|
|
' var foo = "bar";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="application/x-javascript">var foo = "bar";</script>',
|
|
output: [
|
|
'<script type="application/x-javascript">',
|
|
' var foo = "bar";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="application/ecmascript">var foo = "bar";</script>',
|
|
output: [
|
|
'<script type="application/ecmascript">',
|
|
' var foo = "bar";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="dojo/aspect">this.domNode.style.display="none";</script>',
|
|
output: [
|
|
'<script type="dojo/aspect">',
|
|
' this.domNode.style.display = "none";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="dojo/method">this.domNode.style.display="none";</script>',
|
|
output: [
|
|
'<script type="dojo/method">',
|
|
' this.domNode.style.display = "none";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="text/javascript1.5">var foo = "bar";</script>',
|
|
output: [
|
|
'<script type="text/javascript1.5">',
|
|
' var foo = "bar";',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="application/json">{"foo":"bar"}</script>',
|
|
output: [
|
|
'<script type="application/json">',
|
|
' {',
|
|
' "foo": "bar"',
|
|
' }',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<script type="application/ld+json">{"foo":"bar"}</script>',
|
|
output: [
|
|
'<script type="application/ld+json">',
|
|
' {',
|
|
' "foo": "bar"',
|
|
' }',
|
|
'</script>'
|
|
]
|
|
}, {
|
|
input: '<style type="text/unknown"><tag></tag></style>',
|
|
output: [
|
|
'<style type="text/unknown">',
|
|
' <tag></tag>',
|
|
'</style>'
|
|
]
|
|
}, {
|
|
input: '<style type="text/css"><tag></tag></style>',
|
|
output: [
|
|
'<style type="text/css">',
|
|
' <tag></tag>',
|
|
'</style>'
|
|
]
|
|
}, {
|
|
input: '<style><tag></tag></style>',
|
|
output: [
|
|
'<style>',
|
|
' <tag></tag>',
|
|
'</style>'
|
|
]
|
|
}, {
|
|
input: '<style>.selector {font-size:12px;}</style>',
|
|
output: [
|
|
'<style>',
|
|
' .selector {',
|
|
' font-size: 12px;',
|
|
' }',
|
|
'</style>'
|
|
]
|
|
}, {
|
|
input: '<style type="text/css">.selector {font-size:12px;}</style>',
|
|
output: [
|
|
'<style type="text/css">',
|
|
' .selector {',
|
|
' font-size: 12px;',
|
|
' }',
|
|
'</style>'
|
|
]
|
|
},
|
|
|
|
],
|
|
}, {
|
|
name: "Attribute Wrap alignment with spaces",
|
|
description: "Ensure attributes are internally aligned with spaces when the indent_character is set to tab",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-aligned'" },
|
|
{ name: "indent_with_tabs", value: "true" }
|
|
]
|
|
}],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<div><div a="1" b="2"><div>test</div></div></div>',
|
|
output: '<div>\n\t<div a="1"\n\t b="2">\n\t\t<div>test</div>\n\t</div>\n</div>'
|
|
}]
|
|
}, {
|
|
name: "Attribute Wrap de-indent",
|
|
description: "Tags de-indent when attributes are wrapped",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-aligned'" },
|
|
{ name: "indent_with_tabs", value: "false" }
|
|
]
|
|
}],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<div a="1" b="2"><div>test</div></div>',
|
|
output: '<div a="1"\n b="2">\n <div>test</div>\n</div>'
|
|
},
|
|
{
|
|
fragment: true,
|
|
input: '<p>\n <a href="/test/" target="_blank"><img src="test.jpg" /></a><a href="/test/" target="_blank"><img src="test.jpg" /></a>\n</p>',
|
|
output: '<p>\n <a href="/test/"\n target="_blank"><img src="test.jpg" /></a><a href="/test/"\n target="_blank"><img src="test.jpg" /></a>\n</p>'
|
|
},
|
|
{
|
|
fragment: true,
|
|
input: '<p>\n <span data-not-a-href="/test/" data-totally-not-a-target="_blank"><img src="test.jpg" /></span><span data-not-a-href="/test/" data-totally-not-a-target="_blank"><img src="test.jpg" /></span>\n</p>',
|
|
output: '<p>\n <span data-not-a-href="/test/"\n data-totally-not-a-target="_blank"><img src="test.jpg" /></span><span data-not-a-href="/test/"\n data-totally-not-a-target="_blank"><img src="test.jpg" /></span>\n</p>'
|
|
}
|
|
]
|
|
}, {
|
|
name: "Attribute Wrap",
|
|
description: "Wraps attributes inside of html tags",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force'" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force'" },
|
|
{ name: "wrap_line_length", value: "80" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force'" },
|
|
{ name: "wrap_attributes_indent_size", value: "8" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'auto'" },
|
|
{ name: "wrap_line_length", value: "80" },
|
|
{ name: "wrap_attributes_indent_size", value: "0" }
|
|
],
|
|
indent_attr: ' ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n'
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'auto'" },
|
|
{ name: "wrap_line_length", value: "80" },
|
|
{ name: "wrap_attributes_indent_size", value: "4" }
|
|
],
|
|
indent_attr: ' ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'auto'" },
|
|
{ name: "wrap_line_length", value: "0" }
|
|
],
|
|
indent_attr: ' ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: ' '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-aligned'" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_faligned: ' ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-aligned'" },
|
|
{ name: "wrap_line_length", value: "80" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_faligned: ' ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-aligned'" },
|
|
{ name: "wrap_attributes_indent_size", value: "8" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_faligned: ' ',
|
|
indent_attr_first: ' ',
|
|
indent_end: '',
|
|
indent_end_selfclosing: ' ',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-expand-multiline'" },
|
|
{ name: "wrap_attributes_indent_size", value: "4" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_first: '\n ',
|
|
indent_end: '\n',
|
|
indent_end_selfclosing: '\n',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-expand-multiline'" },
|
|
{ name: "wrap_attributes_indent_size", value: "4" },
|
|
{ name: "wrap_line_length", value: "80" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_first: '\n ',
|
|
indent_end: '\n',
|
|
indent_end_selfclosing: '\n',
|
|
indent_over80: '\n '
|
|
}, {
|
|
options: [
|
|
{ name: "wrap_attributes", value: "'force-expand-multiline'" },
|
|
{ name: "wrap_attributes_indent_size", value: "8" }
|
|
],
|
|
indent_attr: '\n ',
|
|
indent_attr_first: '\n ',
|
|
indent_end: '\n',
|
|
indent_end_selfclosing: '\n',
|
|
indent_over80: '\n '
|
|
}],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<div >This is some text</div>',
|
|
output: '<div>This is some text</div>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<div attr="123" >This is some text</div>',
|
|
output: '<div attr="123">This is some text</div>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<div attr0 attr1="123" data-attr2="hello t here">This is some text</div>',
|
|
output: '<div{{indent_attr_first}}attr0{{indent_attr}}attr1="123"{{indent_attr}}data-attr2="hello t here"{{indent_end}}>This is some text</div>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<div lookatthissuperduperlongattributenamewhoahcrazy0="true" attr0 attr1="123" data-attr2="hello t here" heymanimreallylongtoowhocomesupwiththesenames="false">This is some text</div>',
|
|
output: '<div{{indent_attr_first}}lookatthissuperduperlongattributenamewhoahcrazy0="true"{{indent_attr}}attr0{{indent_attr}}attr1="123"{{indent_attr}}data-attr2="hello t here"{{indent_over80}}heymanimreallylongtoowhocomesupwiththesenames="false"{{indent_end}}>This is some text</div>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<img attr0 attr1="123" data-attr2="hello t here"/>',
|
|
output: '<img{{indent_attr_first}}attr0{{indent_attr}}attr1="123"{{indent_attr}}data-attr2="hello t here"{{indent_end_selfclosing}}/>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<?xml version="1.0" encoding="UTF-8" ?><root attr1="foo" attr2="bar"/>',
|
|
output: '<?xml version="1.0" encoding="UTF-8" ?>\n<root{{indent_attr_first}}attr1="foo"{{indent_attr}}{{indent_attr_faligned}}attr2="bar"{{indent_end_selfclosing}}/>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&subset=latin" rel="stylesheet" type="text/css">',
|
|
output: '<link{{indent_attr_first}}href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&subset=latin"{{indent_over80}}{{indent_attr_faligned}}rel="stylesheet"{{indent_attr}}{{indent_attr_faligned}}type="text/css"{{indent_end}}>'
|
|
}]
|
|
}, {
|
|
name: "Handlebars Indenting Off",
|
|
description: "Test handlebar behavior when indenting is off",
|
|
template: "^^^ $$$",
|
|
options: [
|
|
{ name: "indent_handlebars", value: "false" }
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input_: '{{#if 0}}\n' +
|
|
' <div>\n' +
|
|
' </div>\n' +
|
|
'{{/if}}',
|
|
output: '{{#if 0}}\n' +
|
|
'<div>\n' +
|
|
'</div>\n' +
|
|
'{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
input_: '<div>\n' +
|
|
'{{#each thing}}\n' +
|
|
' {{name}}\n' +
|
|
'{{/each}}\n' +
|
|
'</div>',
|
|
output: '<div>\n' +
|
|
' {{#each thing}} {{name}} {{/each}}\n' +
|
|
'</div>'
|
|
}
|
|
|
|
]
|
|
}, {
|
|
name: "Handlebars Indenting On",
|
|
description: "Test handlebar formatting",
|
|
template: "^^^ $$$",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
content: '{{field}}'
|
|
}, {
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
content: '{{! comment}}'
|
|
}, {
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
content: '{{!-- comment--}}'
|
|
}, {
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
content: '{pre{{field1}} {{field2}} {{field3}}post'
|
|
}, {
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
content: '{{! \n mult-line\ncomment \n with spacing\n}}'
|
|
}, {
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
content: '{{!-- \n mult-line\ncomment \n with spacing\n--}}'
|
|
}, {
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
content: '{{!-- \n mult-line\ncomment \n{{#> component}}\n mult-line\ncomment \n with spacing\n {{/ component}}--}}'
|
|
}, {
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" },
|
|
{ name: "wrap_line_length", value: "80" }
|
|
],
|
|
content: 'content'
|
|
}],
|
|
tests: [
|
|
{ fragment: true, unchanged: '{{page-title}}' },
|
|
{ fragment: true, unchanged: '{{#if 0}}{{/if}}' },
|
|
{ fragment: true, unchanged: '{{#if 0}}^^^&content$$${{/if}}' },
|
|
{ fragment: true, unchanged: '{{#if 0}}\n{{/if}}' }, {
|
|
fragment: true,
|
|
input_: '{{#if words}}{{/if}}',
|
|
output: '{{#if words}}{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
input_: '{{#if words}}^^^&content$$${{/if}}',
|
|
output: '{{#if words}}^^^&content$$${{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
input_: '{{#if words}}^^^&content$$${{/if}}',
|
|
output: '{{#if words}}^^^&content$$${{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '{{#if 1}}\n' +
|
|
' <div>\n' +
|
|
' </div>\n' +
|
|
'{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
input_: '{{#if 1}}\n' +
|
|
'<div>\n' +
|
|
'</div>\n' +
|
|
'{{/if}}',
|
|
output: '{{#if 1}}\n' +
|
|
' <div>\n' +
|
|
' </div>\n' +
|
|
'{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div>\n' +
|
|
' {{#if 1}}\n' +
|
|
' {{/if}}\n' +
|
|
'</div>'
|
|
}, {
|
|
fragment: true,
|
|
input_: '<div>\n' +
|
|
'{{#if 1}}\n' +
|
|
'{{/if}}\n' +
|
|
'</div>',
|
|
output: '<div>\n' +
|
|
' {{#if 1}}\n' +
|
|
' {{/if}}\n' +
|
|
'</div>'
|
|
}, {
|
|
fragment: true,
|
|
input_: '{{#if}}\n' +
|
|
'{{#each}}\n' +
|
|
'{{#if}}\n' +
|
|
'^^^&content$$$\n' +
|
|
'{{/if}}\n' +
|
|
'{{#if}}\n' +
|
|
'^^^&content$$$\n' +
|
|
'{{/if}}\n' +
|
|
'{{/each}}\n' +
|
|
'{{/if}}',
|
|
output: '{{#if}}\n' +
|
|
' {{#each}}\n' +
|
|
' {{#if}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
' {{/if}}\n' +
|
|
' {{#if}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
' {{/if}}\n' +
|
|
' {{/each}}\n' +
|
|
'{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '{{#if 1}}\n' +
|
|
' <div>\n' +
|
|
' </div>\n' +
|
|
'{{/if}}'
|
|
},
|
|
|
|
// Test {{else}} aligned with {{#if}} and {{/if}}
|
|
{
|
|
fragment: true,
|
|
input_: '{{#if 1}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
' {{else}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
'{{/if}}',
|
|
output: '{{#if 1}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
'{{else}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
'{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
input_: '{{#if 1}}\n' +
|
|
' {{else}}\n' +
|
|
' {{/if}}',
|
|
output: '{{#if 1}}\n' +
|
|
'{{else}}\n' +
|
|
'{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
input_: '{{#if thing}}\n' +
|
|
'{{#if otherthing}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
' {{else}}\n' +
|
|
'^^^&content$$$\n' +
|
|
' {{/if}}\n' +
|
|
' {{else}}\n' +
|
|
'^^^&content$$$\n' +
|
|
'{{/if}}',
|
|
output: '{{#if thing}}\n' +
|
|
' {{#if otherthing}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
' {{else}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
' {{/if}}\n' +
|
|
'{{else}}\n' +
|
|
' ^^^&content$$$\n' +
|
|
'{{/if}}'
|
|
},
|
|
// Test {{}} inside of <> tags, which should be separated by spaces
|
|
// for readability, unless they are inside a string.
|
|
{
|
|
fragment: true,
|
|
input_: '<div{{somestyle}}></div>',
|
|
output: '<div {{somestyle}}></div>'
|
|
}, {
|
|
fragment: true,
|
|
input_: '<div{{#if test}}class="foo"{{/if}}>^^^&content$$$</div>',
|
|
output: '<div {{#if test}} class="foo" {{/if}}>^^^&content$$$</div>'
|
|
}, {
|
|
fragment: true,
|
|
input_: '<div{{#if thing}}{{somestyle}}class="{{class}}"{{else}}class="{{class2}}"{{/if}}>^^^&content$$$</div>',
|
|
output: '<div {{#if thing}} {{somestyle}} class="{{class}}" {{else}} class="{{class2}}" {{/if}}>^^^&content$$$</div>'
|
|
}, {
|
|
fragment: true,
|
|
input_: '<span{{#if condition}}class="foo"{{/if}}>^^^&content$$$</span>',
|
|
output: '<span {{#if condition}} class="foo" {{/if}}>^^^&content$$$</span>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div unformatted="{{#if}}^^^&content$$${{/if}}">^^^&content$$$</div>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div unformatted="{{#if }} ^^^&content$$${{/if}}">^^^&content$$$</div>'
|
|
},
|
|
|
|
// Quotes found inside of Handlebars expressions inside of quoted
|
|
// strings themselves should not be considered string delimiters.
|
|
{
|
|
fragment: true,
|
|
unchanged: '<div class="{{#if thingIs "value"}}^^^&content$$${{/if}}"></div>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div class="{{#if thingIs \\\'value\\\'}}^^^&content$$${{/if}}"></div>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div class=\\\'{{#if thingIs "value"}}^^^&content$$${{/if}}\\\'></div>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div class=\\\'{{#if thingIs \\\'value\\\'}}^^^&content$$${{/if}}\\\'></div>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<span>{{condition < 0 ? "result1" : "result2"}}</span>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<span>{{condition1 && condition2 && condition3 && condition4 < 0 ? "resForTrue" : "resForFalse"}}</span>'
|
|
}
|
|
],
|
|
}, {
|
|
name: "Handlebars Else tag indenting",
|
|
description: "Handlebar Else tags should be newlined after formatted tags",
|
|
template: "^^^ $$$",
|
|
options: [
|
|
{ name: "indent_handlebars", value: "true" }
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input_: '{{#if test}}<div></div>{{else}}<div></div>{{/if}}',
|
|
output: '{{#if test}}\n' +
|
|
' <div></div>\n' +
|
|
'{{else}}\n' +
|
|
' <div></div>\n' +
|
|
'{{/if}}'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '{{#if test}}<span></span>{{else}}<span></span>{{/if}}'
|
|
}]
|
|
}, {
|
|
name: "Unclosed html elements",
|
|
description: "Unclosed elements should not indent",
|
|
options: [],
|
|
tests: [
|
|
{ fragment: true, unchanged: '<source>\n<source>' },
|
|
{ fragment: true, unchanged: '<br>\n<br>' },
|
|
{ fragment: true, unchanged: '<input>\n<input>' },
|
|
{ fragment: true, unchanged: '<meta>\n<meta>' },
|
|
{ fragment: true, unchanged: '<link>\n<link>' },
|
|
{ fragment: true, unchanged: '<colgroup>\n <col>\n <col>\n</colgroup>' }
|
|
]
|
|
}, {
|
|
name: "Unformatted tags",
|
|
description: "Unformatted tag behavior",
|
|
options: [],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<ol>\n <li>b<pre>c</pre></li>\n</ol>',
|
|
output: [
|
|
'<ol>',
|
|
' <li>b',
|
|
' <pre>c</pre>',
|
|
' </li>',
|
|
'</ol>'
|
|
]
|
|
},
|
|
{ fragment: true, unchanged: '<ol>\n <li>b<code>c</code></li>\n</ol>' },
|
|
{ fragment: true, unchanged: '<ul>\n <li>\n <span class="octicon octicon-person"></span>\n <a href="/contact/">Kontakt</a>\n </li>\n</ul>' },
|
|
{ fragment: true, unchanged: '<div class="searchform"><input type="text" value="" name="s" id="s" /><input type="submit" id="searchsubmit" value="Search" /></div>' },
|
|
{ fragment: true, unchanged: '<div class="searchform"><input type="text" value="" name="s" id="s"><input type="submit" id="searchsubmit" value="Search"></div>' },
|
|
{ fragment: true, unchanged: '<p>\n <a href="/test/"><img src="test.jpg" /></a>\n</p>' },
|
|
{ fragment: true, unchanged: '<p>\n <a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a>\n</p>' },
|
|
{ fragment: true, unchanged: '<p>\n <a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a><a href="/test/"><img src="test.jpg" /></a>\n</p>' },
|
|
{ fragment: true, unchanged: '<p>\n <span>image: <img src="test.jpg" /></span><span>image: <img src="test.jpg" /></span>\n</p>' },
|
|
{ fragment: true, unchanged: '<p>\n <strong>image: <img src="test.jpg" /></strong><strong>image: <img src="test.jpg" /></strong>\n</p>' },
|
|
]
|
|
}, {
|
|
name: "File starting with comment",
|
|
description: "Unformatted tag behavior",
|
|
options: [],
|
|
tests: [{
|
|
fragment: true,
|
|
unchanged: [
|
|
'<!--sample comment -->',
|
|
'',
|
|
'<html>',
|
|
'<body>',
|
|
' <span>a span</span>',
|
|
'</body>',
|
|
'',
|
|
'</html>'
|
|
]
|
|
}, ]
|
|
}, {
|
|
name: "Php formatting",
|
|
description: "Php (<?php ... ?>) treated as comments.",
|
|
options: [],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<h1 class="content-page-header"><?=$view["name"]; ?></h1>',
|
|
output: '<h1 class="content-page-header">\n <?=$view["name"]; ?>\n</h1>',
|
|
}, {
|
|
fragment: true,
|
|
unchanged: [
|
|
'<?php',
|
|
'for($i = 1; $i <= 100; $i++;) {',
|
|
' #count to 100!',
|
|
' echo($i . "</br>");',
|
|
'}',
|
|
'?>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
unchanged: [
|
|
'<?php ?>',
|
|
'<!DOCTYPE html>',
|
|
'',
|
|
'<html>',
|
|
'',
|
|
'<head></head>',
|
|
'',
|
|
'<body></body>',
|
|
'',
|
|
'</html>'
|
|
]
|
|
}]
|
|
}, {
|
|
name: "Support simple language specific option inheritance/overriding",
|
|
description: "Support simple language specific option inheritance/overriding",
|
|
matrix: [{
|
|
options: [
|
|
{ name: "js", value: "{ 'indent_size': 3 }" },
|
|
{ name: "css", value: "{ 'indent_size': 5 }" }
|
|
],
|
|
h: ' ',
|
|
c: ' ',
|
|
j: ' '
|
|
},
|
|
{
|
|
options: [
|
|
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 } }" }
|
|
],
|
|
h: ' ',
|
|
c: ' ',
|
|
j: ' '
|
|
},
|
|
{
|
|
options: [
|
|
{ name: "indent_size", value: "9" },
|
|
{ name: "html", value: "{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 }, 'indent_size': 2}" },
|
|
{ name: "js", value: "{ 'indent_size': 5 }" },
|
|
{ name: "css", value: "{ 'indent_size': 3 }" }
|
|
],
|
|
h: ' ',
|
|
c: ' ',
|
|
j: ' '
|
|
}
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
unchanged: [
|
|
'<head>',
|
|
'{{h}}<script>',
|
|
'{{h}}{{h}}if (a == b) {',
|
|
'{{h}}{{h}}{{j}}test();',
|
|
'{{h}}{{h}}}',
|
|
'{{h}}</script>',
|
|
'{{h}}<style>',
|
|
'{{h}}{{h}}.selector {',
|
|
'{{h}}{{h}}{{c}}font-size: 12px;',
|
|
'{{h}}{{h}}}',
|
|
'{{h}}</style>',
|
|
'</head>',
|
|
]
|
|
}, ]
|
|
}, {
|
|
name: "underscore.js formatting",
|
|
description: "underscore.js templates (<% ... %>) treated as comments.",
|
|
options: [],
|
|
tests: [{
|
|
fragment: true,
|
|
unchanged: [
|
|
'<div class="col-sm-9">',
|
|
' <textarea id="notes" class="form-control" rows="3">',
|
|
' <%= notes %>',
|
|
' </textarea>',
|
|
'</div>'
|
|
]
|
|
}, ]
|
|
}, {
|
|
name: "Indent with tabs",
|
|
description: "Use one tab instead of several spaces for indentation",
|
|
template: "^^^ $$$",
|
|
options: [
|
|
{ name: "indent_with_tabs", value: "true" }
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input_: '<div>\n' +
|
|
'<div>\n' +
|
|
'</div>\n' +
|
|
'</div>',
|
|
output: '<div>\n' +
|
|
'\t<div>\n' +
|
|
'\t</div>\n' +
|
|
'</div>'
|
|
}]
|
|
}, {
|
|
name: "Indent without tabs",
|
|
description: "Use several spaces for indentation",
|
|
template: "^^^ $$$",
|
|
options: [
|
|
{ name: "indent_with_tabs", value: "false" }
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input_: '<div>\n' +
|
|
'<div>\n' +
|
|
'</div>\n' +
|
|
'</div>',
|
|
output: '<div>\n' +
|
|
' <div>\n' +
|
|
' </div>\n' +
|
|
'</div>'
|
|
}]
|
|
}, {
|
|
name: "Indent body inner html by default",
|
|
description: "",
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html>\n<body>\n<div></div>\n</body>\n\n</html>',
|
|
output: '<html>\n<body>\n <div></div>\n</body>\n\n</html>'
|
|
}]
|
|
}, {
|
|
name: "indent_body_inner_html set to false prevents indent of body inner html",
|
|
description: "",
|
|
options: [
|
|
{ name: 'indent_body_inner_html', value: "false" }
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
unchanged: '<html>\n<body>\n<div></div>\n</body>\n\n</html>'
|
|
}]
|
|
}, {
|
|
name: "Indent head inner html by default",
|
|
description: "",
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html>\n\n<head>\n<meta>\n</head>\n\n</html>',
|
|
output: '<html>\n\n<head>\n <meta>\n</head>\n\n</html>'
|
|
}]
|
|
}, {
|
|
name: "indent_head_inner_html set to false prevents indent of head inner html",
|
|
description: "",
|
|
options: [
|
|
{ name: 'indent_head_inner_html', value: "false" }
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
unchanged: '<html>\n\n<head>\n<meta>\n</head>\n\n</html>'
|
|
}]
|
|
}, {
|
|
name: "content_unformatted to prevent formatting content",
|
|
description: "",
|
|
options: [
|
|
{ name: 'content_unformatted', value: "['script', 'style', 'p', 'span', 'br']" }
|
|
],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html><body><h1>A</h1><script>if(1){f();}</script><style>.a{display:none;}</style></body></html>',
|
|
output: [
|
|
'<html>',
|
|
'<body>',
|
|
' <h1>A</h1>',
|
|
' <script>if(1){f();}</script>',
|
|
' <style>.a{display:none;}</style>',
|
|
'</body>',
|
|
'',
|
|
'</html>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><p>Beautify me</p></div><p><p>But not me</p></p>',
|
|
output: [
|
|
'<div>',
|
|
' <p>Beautify me</p>',
|
|
'</div>',
|
|
'<p><p>But not me</p></p>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><p\n class="beauty-me"\n>Beautify me</p></div><p><p\n class="iamalreadybeauty"\n>But not me</p></p>',
|
|
output: [
|
|
'<div>',
|
|
' <p class="beauty-me">Beautify me</p>',
|
|
'</div>',
|
|
'<p><p',
|
|
' class="iamalreadybeauty"',
|
|
'>But not me</p></p>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div><span>blabla<div>something here</div></span></div>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div><br /></div>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><pre>var a=1;\nvar b=a;</pre></div>',
|
|
output: [
|
|
'<div>',
|
|
' <pre>var a=1; var b=a;</pre>',
|
|
'</div>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><pre>\nvar a=1;\nvar b=a;\n</pre></div>',
|
|
output: [
|
|
'<div>',
|
|
' <pre>',
|
|
' var a=1; var b=a;',
|
|
' </pre>',
|
|
'</div>'
|
|
]
|
|
}]
|
|
}, {
|
|
name: "default content_unformatted",
|
|
description: "",
|
|
options: [],
|
|
tests: [{
|
|
fragment: true,
|
|
input: '<html><body><h1>A</h1><script>if(1){f();}</script><style>.a{display:none;}</style></body></html>',
|
|
output: [
|
|
'<html>',
|
|
'<body>',
|
|
' <h1>A</h1>',
|
|
' <script>',
|
|
' if (1) {',
|
|
' f();',
|
|
' }',
|
|
' </script>',
|
|
' <style>',
|
|
' .a {',
|
|
' display: none;',
|
|
' }',
|
|
' </style>',
|
|
'</body>',
|
|
'',
|
|
'</html>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><p>Beautify me</p></div><p><p>But not me</p></p>',
|
|
output: [
|
|
'<div>',
|
|
' <p>Beautify me</p>',
|
|
'</div>',
|
|
'<p>',
|
|
' <p>But not me</p>',
|
|
'</p>',
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><p\n class="beauty-me"\n>Beautify me</p></div><p><p\n class="iamalreadybeauty"\n>But not me</p></p>',
|
|
output: [
|
|
'<div>',
|
|
' <p class="beauty-me">Beautify me</p>',
|
|
'</div>',
|
|
'<p>',
|
|
' <p class="iamalreadybeauty">But not me</p>',
|
|
'</p>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div><span>blabla<div>something here</div></span></div>'
|
|
}, {
|
|
fragment: true,
|
|
unchanged: '<div><br /></div>'
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><pre>var a=1;\nvar b=a;</pre></div>',
|
|
output: [
|
|
'<div>',
|
|
' <pre>var a=1;',
|
|
'var b=a;</pre>',
|
|
'</div>'
|
|
]
|
|
}, {
|
|
fragment: true,
|
|
input: '<div><pre>\nvar a=1;\nvar b=a;\n</pre></div>',
|
|
output: [
|
|
'<div>',
|
|
' <pre>',
|
|
'var a=1;',
|
|
'var b=a;',
|
|
'</pre>',
|
|
'</div>'
|
|
]
|
|
}]
|
|
}, {
|
|
name: "New Test Suite"
|
|
}],
|
|
}; |