js-beautify
Advanced tools
Comparing version 0.4.2 to 1.2.0
/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */ | ||
/* | ||
The MIT License (MIT) | ||
Copyright (c) 2007-2013 Einar Lielmanis 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. | ||
CSS Beautifier | ||
@@ -12,5 +37,2 @@ --------------- | ||
You are free to use this in any way you want, in case you find this useful or working for you. | ||
Usage: | ||
@@ -17,0 +39,0 @@ css_beautify(source_text); |
/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */ | ||
/* | ||
The MIT License (MIT) | ||
Copyright (c) 2007-2013 Einar Lielmanis 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. | ||
Style HTML | ||
@@ -12,5 +37,2 @@ --------------- | ||
You are free to use this in any way you want, in case you find this useful or working for you. | ||
Usage: | ||
@@ -226,3 +248,3 @@ style_html(html_source); | ||
if (content.length && content[content.length-1] !== '=' && input_char !== '>' && space) { | ||
if (content.length && content[content.length-1] !== '=' && input_char !== '>' && space) { | ||
//no space after = or before > | ||
@@ -229,0 +251,0 @@ if (this.line_char_count >= this.max_char) { |
2147
beautify.js
/*jshint curly:true, eqeqeq:true, laxbreak:true, noempty:false */ | ||
/* | ||
The MIT License (MIT) | ||
Copyright (c) 2007-2013 Einar Lielmanis 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. | ||
JS Beautifier | ||
@@ -13,4 +37,4 @@ --------------- | ||
"End braces on own line" added by Chris J. Shull, <chrisjshull@gmail.com> | ||
Parsing improvements for brace-less statements by Liam Newman <bitwiseman@gmail.com> | ||
You are free to use this in any way you want, in case you find this useful or working for you. | ||
@@ -61,576 +85,603 @@ Usage: | ||
*/ | ||
function js_beautify(js_source_text, options) { | ||
"use strict"; | ||
var beautifier = new Beautifier(js_source_text, options); | ||
return beautifier.beautify(); | ||
} | ||
function Beautifier(js_source_text, options) { | ||
"use strict"; | ||
var input, output, token_text, last_type, last_text, last_last_text, last_word, flags, flag_store, indent_string; | ||
var whitespace, wordchar, punct, parser_pos, line_starters, digits; | ||
var prefix, token_type; | ||
var wanted_newline, n_newlines, output_wrapped, output_space_before_token, whitespace_before_token; | ||
var input_length; | ||
var handlers, MODE, opt; | ||
var preindent_string = ''; | ||
whitespace = "\n\r\t ".split(''); | ||
wordchar = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$'.split(''); | ||
digits = '0123456789'.split(''); | ||
(function() { | ||
function js_beautify(js_source_text, options) { | ||
"use strict"; | ||
var beautifier = new Beautifier(js_source_text, options); | ||
return beautifier.beautify(); | ||
} | ||
punct = '+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> >>>= >>= <<= && &= | || ! !! , : ? ^ ^= |= ::'; | ||
punct += ' <%= <% %> <?= <? ?>'; // try to be a good boy and try not to break the markup language identifiers | ||
punct = punct.split(' '); | ||
function Beautifier(js_source_text, options) { | ||
"use strict"; | ||
var input, output, token_text, token_type, last_type, last_last_text, indent_string; | ||
var flags, previous_flags, flag_store; | ||
var whitespace, wordchar, punct, parser_pos, line_starters, digits; | ||
var prefix; | ||
var wanted_newline, n_newlines, output_wrapped, output_space_before_token, whitespace_before_token; | ||
var input_length; | ||
var handlers, MODE, opt; | ||
var preindent_string = ''; | ||
// words which should always start on new line. | ||
line_starters = 'continue,try,throw,return,var,if,switch,case,default,for,while,break,function'.split(','); | ||
whitespace = "\n\r\t ".split(''); | ||
wordchar = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$'.split(''); | ||
digits = '0123456789'.split(''); | ||
MODE = { | ||
BlockStatement: 'BlockStatement', // 'BLOCK' | ||
Statement: 'Statement', // 'STATEMENT' | ||
ObjectLiteral: 'ObjectLiteral', // 'OBJECT', | ||
ArrayLiteral: 'ArrayLiteral', //'[EXPRESSION]', | ||
ForInitializer: 'ForInitializer', //'(FOR-EXPRESSION)', | ||
Conditional: 'Conditional', //'(COND-EXPRESSION)', | ||
Expression: 'Expression' //'(EXPRESSION)' | ||
}; | ||
punct = '+ - * / % & ++ -- = += -= *= /= %= == === != !== > < >= <= >> << >>> >>>= >>= <<= && &= | || ! !! , : ? ^ ^= |= ::'; | ||
punct += ' <%= <% %> <?= <? ?>'; // try to be a good boy and try not to break the markup language identifiers | ||
punct = punct.split(' '); | ||
handlers = { | ||
'TK_START_EXPR': handle_start_expr, | ||
'TK_END_EXPR': handle_end_expr, | ||
'TK_START_BLOCK': handle_start_block, | ||
'TK_END_BLOCK': handle_end_block, | ||
'TK_WORD': handle_word, | ||
'TK_SEMICOLON': handle_semicolon, | ||
'TK_STRING': handle_string, | ||
'TK_EQUALS': handle_equals, | ||
'TK_OPERATOR': handle_operator, | ||
'TK_COMMA': handle_comma, | ||
'TK_BLOCK_COMMENT': handle_block_comment, | ||
'TK_INLINE_COMMENT': handle_inline_comment, | ||
'TK_COMMENT': handle_comment, | ||
'TK_DOT': handle_dot, | ||
'TK_UNKNOWN': handle_unknown | ||
}; | ||
// words which should always start on new line. | ||
line_starters = 'continue,try,throw,return,var,if,switch,case,default,for,while,break,function'.split(','); | ||
MODE = { | ||
BlockStatement: 'BlockStatement', // 'BLOCK' | ||
Statement: 'Statement', // 'STATEMENT' | ||
ObjectLiteral: 'ObjectLiteral', // 'OBJECT', | ||
ArrayLiteral: 'ArrayLiteral', //'[EXPRESSION]', | ||
ForInitializer: 'ForInitializer', //'(FOR-EXPRESSION)', | ||
Conditional: 'Conditional', //'(COND-EXPRESSION)', | ||
Expression: 'Expression' //'(EXPRESSION)' | ||
}; | ||
// Some interpreters have unexpected results with foo = baz || bar; | ||
options = options ? options : {}; | ||
opt = {}; | ||
handlers = { | ||
'TK_START_EXPR': handle_start_expr, | ||
'TK_END_EXPR': handle_end_expr, | ||
'TK_START_BLOCK': handle_start_block, | ||
'TK_END_BLOCK': handle_end_block, | ||
'TK_WORD': handle_word, | ||
'TK_SEMICOLON': handle_semicolon, | ||
'TK_STRING': handle_string, | ||
'TK_EQUALS': handle_equals, | ||
'TK_OPERATOR': handle_operator, | ||
'TK_COMMA': handle_comma, | ||
'TK_BLOCK_COMMENT': handle_block_comment, | ||
'TK_INLINE_COMMENT': handle_inline_comment, | ||
'TK_COMMENT': handle_comment, | ||
'TK_DOT': handle_dot, | ||
'TK_UNKNOWN': handle_unknown | ||
}; | ||
// compatibility | ||
if (options.space_after_anon_function !== undefined && options.jslint_happy === undefined) { | ||
options.jslint_happy = options.space_after_anon_function; | ||
} | ||
if (options.braces_on_own_line !== undefined) { //graceful handling of deprecated option | ||
opt.brace_style = options.braces_on_own_line ? "expand" : "collapse"; | ||
} | ||
opt.brace_style = options.brace_style ? options.brace_style : (opt.brace_style ? opt.brace_style : "collapse"); | ||
function create_flags(flags_base, mode) { | ||
return { | ||
mode: mode, | ||
last_text: flags_base ? flags_base.last_text : '', // last token text | ||
last_word: flags_base ? flags_base.last_word : '', // last 'TK_WORD' passed | ||
var_line: false, | ||
var_line_tainted: false, | ||
var_line_reindented: false, | ||
in_html_comment: false, | ||
multiline_array: false, | ||
if_block: false, | ||
do_block: false, | ||
do_while: false, | ||
in_case_statement: false, // switch(..){ INSIDE HERE } | ||
in_case: false, // we're on the exact line with "case 0:" | ||
case_body: false, // the indented case-action block | ||
indentation_level: (flags_base ? flags_base.indentation_level + ((flags_base.var_line && flags_base.var_line_reindented) ? 1 : 0) : 0), | ||
ternary_depth: 0 | ||
}; | ||
} | ||
opt.indent_size = options.indent_size ? parseInt(options.indent_size, 10) : 4; | ||
opt.indent_char = options.indent_char ? options.indent_char : ' '; | ||
opt.preserve_newlines = (options.preserve_newlines === undefined) ? true : options.preserve_newlines; | ||
opt.break_chained_methods = (options.break_chained_methods === undefined) ? false : options.break_chained_methods; | ||
opt.max_preserve_newlines = (options.max_preserve_newlines === undefined) ? 0 : parseInt(options.max_preserve_newlines, 10); | ||
opt.jslint_happy = (options.jslint_happy === undefined) ? false : options.jslint_happy; | ||
opt.keep_array_indentation = (options.keep_array_indentation === undefined) ? false : options.keep_array_indentation; | ||
opt.space_before_conditional= (options.space_before_conditional === undefined) ? true : options.space_before_conditional; | ||
opt.unescape_strings = (options.unescape_strings === undefined) ? false : options.unescape_strings; | ||
opt.wrap_line_length = (options.wrap_line_length === undefined) ? 0 : parseInt(options.wrap_line_length, 10); | ||
// Some interpreters have unexpected results with foo = baz || bar; | ||
options = options ? options : {}; | ||
opt = {}; | ||
//---------------------------------- | ||
indent_string = ''; | ||
while (opt.indent_size > 0) { | ||
indent_string += opt.indent_char; | ||
opt.indent_size -= 1; | ||
} | ||
// compatibility | ||
if (options.space_after_anon_function !== undefined && options.jslint_happy === undefined) { | ||
options.jslint_happy = options.space_after_anon_function; | ||
} | ||
if (options.braces_on_own_line !== undefined) { //graceful handling of deprecated option | ||
opt.brace_style = options.braces_on_own_line ? "expand" : "collapse"; | ||
} | ||
opt.brace_style = options.brace_style ? options.brace_style : (opt.brace_style ? opt.brace_style : "collapse"); | ||
while (js_source_text && (js_source_text.charAt(0) === ' ' || js_source_text.charAt(0) === '\t')) { | ||
preindent_string += js_source_text.charAt(0); | ||
js_source_text = js_source_text.substring(1); | ||
} | ||
input = js_source_text; | ||
// cache the source's length. | ||
input_length = js_source_text.length; | ||
opt.indent_size = options.indent_size ? parseInt(options.indent_size, 10) : 4; | ||
opt.indent_char = options.indent_char ? options.indent_char : ' '; | ||
opt.preserve_newlines = (options.preserve_newlines === undefined) ? true : options.preserve_newlines; | ||
opt.break_chained_methods = (options.break_chained_methods === undefined) ? false : options.break_chained_methods; | ||
opt.max_preserve_newlines = (options.max_preserve_newlines === undefined) ? 0 : parseInt(options.max_preserve_newlines, 10); | ||
opt.jslint_happy = (options.jslint_happy === undefined) ? false : options.jslint_happy; | ||
opt.keep_array_indentation = (options.keep_array_indentation === undefined) ? false : options.keep_array_indentation; | ||
opt.space_before_conditional= (options.space_before_conditional === undefined) ? true : options.space_before_conditional; | ||
opt.unescape_strings = (options.unescape_strings === undefined) ? false : options.unescape_strings; | ||
opt.wrap_line_length = (options.wrap_line_length === undefined) ? 0 : parseInt(options.wrap_line_length, 10); | ||
last_word = ''; // last 'TK_WORD' passed | ||
last_type = 'TK_START_EXPR'; // last token type | ||
last_text = ''; // last token text | ||
last_last_text = ''; // pre-last token text | ||
output = []; | ||
output_wrapped = false; | ||
output_space_before_token = false; | ||
whitespace_before_token = []; | ||
//---------------------------------- | ||
indent_string = ''; | ||
while (opt.indent_size > 0) { | ||
indent_string += opt.indent_char; | ||
opt.indent_size -= 1; | ||
} | ||
// Stack of parsing/formatting states, including MODE. | ||
// We tokenize, parse, and output in an almost purely a forward-only stream of token input | ||
// and formatted output. This makes the beautifier less accurate than full parsers | ||
// but also far more tolerant of syntax errors. | ||
// | ||
// For example, the default mode is MODE.BlockStatement. If we see a '{' we push a new frame of type | ||
// MODE.BlockStatement on the the stack, even though it could be object literal. If we later | ||
// encounter a ":", we'll switch to to MODE.ObjectLiteral. If we then see a ";", | ||
// most full parsers would die, but the beautifier gracefully falls back to | ||
// MODE.BlockStatement and continues on. | ||
flag_store = []; | ||
set_mode(MODE.BlockStatement); | ||
while (js_source_text && (js_source_text.charAt(0) === ' ' || js_source_text.charAt(0) === '\t')) { | ||
preindent_string += js_source_text.charAt(0); | ||
js_source_text = js_source_text.substring(1); | ||
} | ||
input = js_source_text; | ||
// cache the source's length. | ||
input_length = js_source_text.length; | ||
parser_pos = 0; | ||
last_type = 'TK_START_BLOCK'; // last token type | ||
last_last_text = ''; // pre-last token text | ||
output = []; | ||
output_wrapped = false; | ||
output_space_before_token = false; | ||
whitespace_before_token = []; | ||
this.beautify = function () { | ||
/*jshint onevar:true */ | ||
var t, i, keep_whitespace, sweet_code; | ||
// Stack of parsing/formatting states, including MODE. | ||
// We tokenize, parse, and output in an almost purely a forward-only stream of token input | ||
// and formatted output. This makes the beautifier less accurate than full parsers | ||
// but also far more tolerant of syntax errors. | ||
// | ||
// For example, the default mode is MODE.BlockStatement. If we see a '{' we push a new frame of type | ||
// MODE.BlockStatement on the the stack, even though it could be object literal. If we later | ||
// encounter a ":", we'll switch to to MODE.ObjectLiteral. If we then see a ";", | ||
// most full parsers would die, but the beautifier gracefully falls back to | ||
// MODE.BlockStatement and continues on. | ||
flag_store = []; | ||
set_mode(MODE.BlockStatement); | ||
while (true) { | ||
t = get_next_token(); | ||
token_text = t[0]; | ||
token_type = t[1]; | ||
parser_pos = 0; | ||
if (token_type === 'TK_EOF') { | ||
break; | ||
} | ||
this.beautify = function () { | ||
/*jshint onevar:true */ | ||
var t, i, keep_whitespace, sweet_code; | ||
keep_whitespace = opt.keep_array_indentation && is_array(flags.mode); | ||
while (true) { | ||
t = get_next_token(); | ||
token_text = t[0]; | ||
token_type = t[1]; | ||
if (keep_whitespace) { | ||
for (i = 0; i < n_newlines; i += 1) { | ||
print_newline(true); | ||
if (token_type === 'TK_EOF') { | ||
break; | ||
} | ||
} else { | ||
wanted_newline = n_newlines > 0; | ||
if (opt.max_preserve_newlines && n_newlines > opt.max_preserve_newlines) { | ||
n_newlines = opt.max_preserve_newlines; | ||
} | ||
if (opt.preserve_newlines) { | ||
if (n_newlines > 1) { | ||
print_newline(); | ||
for (i = 1; i < n_newlines; i += 1) { | ||
print_newline(true); | ||
keep_whitespace = opt.keep_array_indentation && is_array(flags.mode); | ||
if (keep_whitespace) { | ||
for (i = 0; i < n_newlines; i += 1) { | ||
print_newline(true); | ||
} | ||
} else { | ||
wanted_newline = n_newlines > 0; | ||
if (opt.max_preserve_newlines && n_newlines > opt.max_preserve_newlines) { | ||
n_newlines = opt.max_preserve_newlines; | ||
} | ||
if (opt.preserve_newlines) { | ||
if (n_newlines > 1) { | ||
print_newline(); | ||
for (i = 1; i < n_newlines; i += 1) { | ||
print_newline(true); | ||
} | ||
} | ||
} | ||
} | ||
handlers[token_type](); | ||
// The cleanest handling of inline comments is to treat them as though they aren't there. | ||
// Just continue formatting and the behavior should be logical. | ||
// Also ignore unknown tokens. Again, this should result in better behavior. | ||
if (token_type !== 'TK_INLINE_COMMENT' && token_type !== 'TK_COMMENT' && | ||
token_type !== 'TK_UNKNOWN') { | ||
last_last_text = flags.last_text; | ||
last_type = token_type; | ||
flags.last_text = token_text; | ||
} | ||
} | ||
handlers[token_type](); | ||
sweet_code = preindent_string + output.join('').replace(/[\r\n ]+$/, ''); | ||
return sweet_code; | ||
}; | ||
// The cleanest handling of inline comments is to treat them as though they aren't there. | ||
// Just continue formatting and the behavior should be logical. | ||
// Also ignore unknown tokens. Again, this should result in better behavior. | ||
if (token_type !== 'TK_INLINE_COMMENT' && token_type !== 'TK_COMMENT' && | ||
token_type !== 'TK_UNKNOWN') { | ||
last_last_text = last_text; | ||
last_type = token_type; | ||
last_text = token_text; | ||
function trim_output(eat_newlines) { | ||
eat_newlines = (eat_newlines === undefined) ? false : eat_newlines; | ||
while (output.length && (output[output.length - 1] === ' ' || output[output.length - 1] === indent_string || output[output.length - 1] === preindent_string || (eat_newlines && (output[output.length - 1] === '\n' || output[output.length - 1] === '\r')))) { | ||
output.pop(); | ||
} | ||
} | ||
sweet_code = preindent_string + output.join('').replace(/[\r\n ]+$/, ''); | ||
return sweet_code; | ||
}; | ||
function trim_output(eat_newlines) { | ||
eat_newlines = (eat_newlines === undefined) ? false : eat_newlines; | ||
while (output.length && (output[output.length - 1] === ' ' || output[output.length - 1] === indent_string || output[output.length - 1] === preindent_string || (eat_newlines && (output[output.length - 1] === '\n' || output[output.length - 1] === '\r')))) { | ||
output.pop(); | ||
function trim(s) { | ||
return s.replace(/^\s\s*|\s\s*$/, ''); | ||
} | ||
} | ||
function trim(s) { | ||
return s.replace(/^\s\s*|\s\s*$/, ''); | ||
} | ||
// we could use just string.split, but | ||
// IE doesn't like returning empty strings | ||
// we could use just string.split, but | ||
// IE doesn't like returning empty strings | ||
function split_newlines(s) { | ||
//return s.split(/\x0d\x0a|\x0a/); | ||
function split_newlines(s) { | ||
//return s.split(/\x0d\x0a|\x0a/); | ||
s = s.replace(/\x0d/g, ''); | ||
var out = [], | ||
idx = s.indexOf("\n"); | ||
while (idx !== -1) { | ||
out.push(s.substring(0, idx)); | ||
s = s.substring(idx + 1); | ||
idx = s.indexOf("\n"); | ||
} | ||
if (s.length) { | ||
out.push(s); | ||
} | ||
return out; | ||
} | ||
s = s.replace(/\x0d/g, ''); | ||
var out = [], | ||
idx = s.indexOf("\n"); | ||
while (idx !== -1) { | ||
out.push(s.substring(0, idx)); | ||
s = s.substring(idx + 1); | ||
idx = s.indexOf("\n"); | ||
function just_added_newline() { | ||
return output.length && output[output.length - 1] === "\n"; | ||
} | ||
if (s.length) { | ||
out.push(s); | ||
} | ||
return out; | ||
} | ||
function just_added_newline() { | ||
return output.length && output[output.length - 1] === "\n"; | ||
} | ||
function _last_index_of(arr, find) { | ||
var i = arr.length - 1; | ||
if (i < 0) { | ||
i += arr.length; | ||
} | ||
if (i > arr.length - 1) { | ||
i = arr.length - 1; | ||
} | ||
for (i++; i-- > 0;) { | ||
if (i in arr && arr[i] === find) { | ||
return i; | ||
function _last_index_of(arr, find) { | ||
var i = arr.length - 1; | ||
if (i < 0) { | ||
i += arr.length; | ||
} | ||
if (i > arr.length - 1) { | ||
i = arr.length - 1; | ||
} | ||
for (i++; i-- > 0;) { | ||
if (i in arr && arr[i] === find) { | ||
return i; | ||
} | ||
} | ||
return -1; | ||
} | ||
return -1; | ||
} | ||
function allow_wrap_or_preserved_newline(force_linewrap) { | ||
force_linewrap = (force_linewrap === undefined) ? false : force_linewrap; | ||
if (opt.wrap_line_length && !force_linewrap) { | ||
var current_line = ''; | ||
var proposed_line_length = 0; | ||
var start_line = _last_index_of(output, '\n') + 1; | ||
// never wrap the first token of a line. | ||
if (start_line < output.length) { | ||
current_line = output.slice(start_line).join(''); | ||
proposed_line_length = current_line.length + token_text.length + | ||
(output_space_before_token ? 1 : 0); | ||
if (proposed_line_length >= opt.wrap_line_length) { | ||
force_linewrap = true; | ||
function allow_wrap_or_preserved_newline(force_linewrap) { | ||
force_linewrap = (force_linewrap === undefined) ? false : force_linewrap; | ||
if (opt.wrap_line_length && !force_linewrap) { | ||
var current_line = ''; | ||
var proposed_line_length = 0; | ||
var start_line = _last_index_of(output, '\n') + 1; | ||
// never wrap the first token of a line. | ||
if (start_line < output.length) { | ||
current_line = output.slice(start_line).join(''); | ||
proposed_line_length = current_line.length + token_text.length + | ||
(output_space_before_token ? 1 : 0); | ||
if (proposed_line_length >= opt.wrap_line_length) { | ||
force_linewrap = true; | ||
} | ||
} | ||
} | ||
if (((opt.preserve_newlines && wanted_newline) || force_linewrap) && !just_added_newline()) { | ||
print_newline(false, true); | ||
output_wrapped = true; | ||
wanted_newline = false; | ||
} | ||
} | ||
if (((opt.preserve_newlines && wanted_newline) || force_linewrap) && !just_added_newline()) { | ||
print_newline(false, true); | ||
output_wrapped = true; | ||
wanted_newline = false; | ||
} | ||
} | ||
function print_newline(force_newline, preserve_statement_flags) { | ||
output_wrapped = false; | ||
output_space_before_token = false; | ||
function print_newline(force_newline, preserve_statement_flags) { | ||
output_wrapped = false; | ||
output_space_before_token = false; | ||
if (!preserve_statement_flags) { | ||
if (last_text !== ';') { | ||
while (flags.mode === MODE.Statement && !flags.if_block) { | ||
restore_mode(); | ||
if (!preserve_statement_flags) { | ||
if (flags.last_text !== ';') { | ||
while (flags.mode === MODE.Statement && !flags.if_block) { | ||
restore_mode(); | ||
} | ||
} | ||
} | ||
} | ||
if (flags.mode === MODE.ArrayLiteral) { | ||
flags.multiline_array = true; | ||
} | ||
if (flags.mode === MODE.ArrayLiteral) { | ||
flags.multiline_array = true; | ||
} | ||
if (!output.length) { | ||
return; // no newline on start of file | ||
} | ||
if (!output.length) { | ||
return; // no newline on start of file | ||
} | ||
if (force_newline || !just_added_newline()) { | ||
output.push("\n"); | ||
if (force_newline || !just_added_newline()) { | ||
output.push("\n"); | ||
} | ||
} | ||
} | ||
function print_token_line_indentation() { | ||
if (just_added_newline()) { | ||
if (opt.keep_array_indentation && is_array(flags.mode) && whitespace_before_token.length) { | ||
output.push(whitespace_before_token.join('') + ''); | ||
} else { | ||
if (preindent_string) { | ||
output.push(preindent_string); | ||
function print_token_line_indentation() { | ||
if (just_added_newline()) { | ||
if (opt.keep_array_indentation && is_array(flags.mode) && whitespace_before_token.length) { | ||
output.push(whitespace_before_token.join('') + ''); | ||
} else { | ||
if (preindent_string) { | ||
output.push(preindent_string); | ||
} | ||
print_indent_string(flags.indentation_level); | ||
print_indent_string(flags.var_line && flags.var_line_reindented); | ||
print_indent_string(output_wrapped); | ||
} | ||
print_indent_string(flags.indentation_level); | ||
print_indent_string(flags.var_line && flags.var_line_reindented); | ||
print_indent_string(output_wrapped); | ||
} | ||
} | ||
} | ||
function print_indent_string(level) { | ||
if (level === undefined) { | ||
level = 1; | ||
} else if (typeof level !== 'number') { | ||
level = level ? 1 : 0; | ||
} | ||
function print_indent_string(level) { | ||
if (level === undefined) { | ||
level = 1; | ||
} else if (typeof level !== 'number') { | ||
level = level ? 1 : 0; | ||
} | ||
// Never indent your first output indent at the start of the file | ||
if (last_text !== '') { | ||
for (var i = 0; i < level; i += 1) { | ||
output.push(indent_string); | ||
// Never indent your first output indent at the start of the file | ||
if (flags.last_text !== '') { | ||
for (var i = 0; i < level; i += 1) { | ||
output.push(indent_string); | ||
} | ||
} | ||
} | ||
} | ||
function print_token_space_before() { | ||
if (output_space_before_token && output.length) { | ||
var last_output = output[output.length - 1]; | ||
if (!just_added_newline() && last_output !== ' ' && last_output !== indent_string) { // prevent occassional duplicate space | ||
output.push(' '); | ||
function print_token_space_before() { | ||
if (output_space_before_token && output.length) { | ||
var last_output = output[output.length - 1]; | ||
if (!just_added_newline() && last_output !== ' ' && last_output !== indent_string) { // prevent occassional duplicate space | ||
output.push(' '); | ||
} | ||
} | ||
} | ||
} | ||
function print_token(printable_token) { | ||
printable_token = printable_token || token_text; | ||
print_token_line_indentation(); | ||
output_wrapped = false; | ||
print_token_space_before(); | ||
output_space_before_token = false; | ||
output.push(printable_token); | ||
} | ||
function print_token(printable_token) { | ||
printable_token = printable_token || token_text; | ||
print_token_line_indentation(); | ||
output_wrapped = false; | ||
print_token_space_before(); | ||
output_space_before_token = false; | ||
output.push(printable_token); | ||
} | ||
function indent() { | ||
flags.indentation_level += 1; | ||
} | ||
function set_mode(mode) { | ||
if (flags) { | ||
flag_store.push(flags); | ||
function indent() { | ||
flags.indentation_level += 1; | ||
} | ||
flags = { | ||
previous_mode: flags ? flags.mode : MODE.BlockStatement, | ||
mode: mode, | ||
var_line: false, | ||
var_line_tainted: false, | ||
var_line_reindented: false, | ||
in_html_comment: false, | ||
multiline_array: false, | ||
if_block: false, | ||
do_block: false, | ||
do_while: false, | ||
in_case_statement: false, // switch(..){ INSIDE HERE } | ||
in_case: false, // we're on the exact line with "case 0:" | ||
case_body: false, // the indented case-action block | ||
indentation_level: (flags ? flags.indentation_level + ((flags.var_line && flags.var_line_reindented) ? 1 : 0) : 0), | ||
ternary_depth: 0 | ||
}; | ||
} | ||
function is_array(mode) { | ||
return mode === MODE.ArrayLiteral; | ||
} | ||
function set_mode(mode) { | ||
if (flags) { | ||
flag_store.push(flags); | ||
previous_flags = flags; | ||
} else { | ||
previous_flags = create_flags(null, mode); | ||
} | ||
function is_expression(mode) { | ||
return in_array(mode, [MODE.ArrayLiteral, MODE.Expression, MODE.ForInitializer, MODE.Conditional]); | ||
} | ||
flags = create_flags(previous_flags, mode); | ||
} | ||
function restore_mode() { | ||
if (flag_store.length > 0) { | ||
var mode = flags.mode; | ||
flags = flag_store.pop(); | ||
flags.previous_mode = mode; | ||
function is_array(mode) { | ||
return mode === MODE.ArrayLiteral; | ||
} | ||
} | ||
function start_of_statement() { | ||
if ( | ||
(last_text === 'do' || | ||
(last_text === 'else' && token_text !== 'if') || | ||
(last_type === 'TK_END_EXPR' && (flags.previous_mode === MODE.ForInitializer || flags.previous_mode === MODE.Conditional)))) { | ||
allow_wrap_or_preserved_newline(); | ||
set_mode(MODE.Statement); | ||
indent(); | ||
output_wrapped = false; | ||
return true; | ||
function is_expression(mode) { | ||
return in_array(mode, [MODE.ArrayLiteral, MODE.Expression, MODE.ForInitializer, MODE.Conditional]); | ||
} | ||
return false; | ||
} | ||
function all_lines_start_with(lines, c) { | ||
for (var i = 0; i < lines.length; i++) { | ||
var line = trim(lines[i]); | ||
if (line.charAt(0) !== c) { | ||
return false; | ||
function restore_mode() { | ||
if (flag_store.length > 0) { | ||
previous_flags = flags; | ||
flags = flag_store.pop(); | ||
} | ||
} | ||
return true; | ||
} | ||
function is_special_word(word) { | ||
return in_array(word, ['case', 'return', 'do', 'if', 'throw', 'else']); | ||
} | ||
function in_array(what, arr) { | ||
for (var i = 0; i < arr.length; i += 1) { | ||
if (arr[i] === what) { | ||
function start_of_statement() { | ||
if ( | ||
(flags.last_text === 'do' || | ||
(flags.last_text === 'else' && token_text !== 'if') || | ||
(last_type === 'TK_END_EXPR' && (previous_flags.mode === MODE.ForInitializer || previous_flags.mode === MODE.Conditional)))) { | ||
allow_wrap_or_preserved_newline(); | ||
set_mode(MODE.Statement); | ||
indent(); | ||
output_wrapped = false; | ||
return true; | ||
} | ||
return false; | ||
} | ||
return false; | ||
} | ||
function unescape_string(s) { | ||
var esc = false, | ||
out = '', | ||
pos = 0, | ||
s_hex = '', | ||
escaped = 0, | ||
c; | ||
function all_lines_start_with(lines, c) { | ||
for (var i = 0; i < lines.length; i++) { | ||
var line = trim(lines[i]); | ||
if (line.charAt(0) !== c) { | ||
return false; | ||
} | ||
} | ||
return true; | ||
} | ||
while (esc || pos < s.length) { | ||
function is_special_word(word) { | ||
return in_array(word, ['case', 'return', 'do', 'if', 'throw', 'else']); | ||
} | ||
c = s.charAt(pos); | ||
pos++; | ||
if (esc) { | ||
esc = false; | ||
if (c === 'x') { | ||
// simple hex-escape \x24 | ||
s_hex = s.substr(pos, 2); | ||
pos += 2; | ||
} else if (c === 'u') { | ||
// unicode-escape, \u2134 | ||
s_hex = s.substr(pos, 4); | ||
pos += 4; | ||
} else { | ||
// some common escape, e.g \n | ||
out += '\\' + c; | ||
continue; | ||
function in_array(what, arr) { | ||
for (var i = 0; i < arr.length; i += 1) { | ||
if (arr[i] === what) { | ||
return true; | ||
} | ||
if (!s_hex.match(/^[0123456789abcdefABCDEF]+$/)) { | ||
// some weird escaping, bail out, | ||
// leaving whole string intact | ||
return s; | ||
} | ||
} | ||
return false; | ||
} | ||
escaped = parseInt(s_hex, 16); | ||
function unescape_string(s) { | ||
var esc = false, | ||
out = '', | ||
pos = 0, | ||
s_hex = '', | ||
escaped = 0, | ||
c; | ||
if (escaped >= 0x00 && escaped < 0x20) { | ||
// leave 0x00...0x1f escaped | ||
while (esc || pos < s.length) { | ||
c = s.charAt(pos); | ||
pos++; | ||
if (esc) { | ||
esc = false; | ||
if (c === 'x') { | ||
out += '\\x' + s_hex; | ||
// simple hex-escape \x24 | ||
s_hex = s.substr(pos, 2); | ||
pos += 2; | ||
} else if (c === 'u') { | ||
// unicode-escape, \u2134 | ||
s_hex = s.substr(pos, 4); | ||
pos += 4; | ||
} else { | ||
out += '\\u' + s_hex; | ||
// some common escape, e.g \n | ||
out += '\\' + c; | ||
continue; | ||
} | ||
continue; | ||
} else if (escaped === 0x22 || escaped === 0x27 || escaped === 0x5c) { | ||
// single-quote, apostrophe, backslash - escape these | ||
out += '\\' + String.fromCharCode(escaped); | ||
} else if (c === 'x' && escaped > 0x7e && escaped <= 0xff) { | ||
// we bail out on \x7f..\xff, | ||
// leaving whole string escaped, | ||
// as it's probably completely binary | ||
return s; | ||
if (!s_hex.match(/^[0123456789abcdefABCDEF]+$/)) { | ||
// some weird escaping, bail out, | ||
// leaving whole string intact | ||
return s; | ||
} | ||
escaped = parseInt(s_hex, 16); | ||
if (escaped >= 0x00 && escaped < 0x20) { | ||
// leave 0x00...0x1f escaped | ||
if (c === 'x') { | ||
out += '\\x' + s_hex; | ||
} else { | ||
out += '\\u' + s_hex; | ||
} | ||
continue; | ||
} else if (escaped === 0x22 || escaped === 0x27 || escaped === 0x5c) { | ||
// single-quote, apostrophe, backslash - escape these | ||
out += '\\' + String.fromCharCode(escaped); | ||
} else if (c === 'x' && escaped > 0x7e && escaped <= 0xff) { | ||
// we bail out on \x7f..\xff, | ||
// leaving whole string escaped, | ||
// as it's probably completely binary | ||
return s; | ||
} else { | ||
out += String.fromCharCode(escaped); | ||
} | ||
} else if (c === '\\') { | ||
esc = true; | ||
} else { | ||
out += String.fromCharCode(escaped); | ||
out += c; | ||
} | ||
} else if (c === '\\') { | ||
esc = true; | ||
} else { | ||
out += c; | ||
} | ||
return out; | ||
} | ||
return out; | ||
} | ||
function is_next(find) { | ||
var local_pos = parser_pos; | ||
var c = input.charAt(local_pos); | ||
while (in_array(c, whitespace) && c !== find) { | ||
local_pos++; | ||
if (local_pos >= input_length) { | ||
return false; | ||
function is_next(find) { | ||
var local_pos = parser_pos; | ||
var c = input.charAt(local_pos); | ||
while (in_array(c, whitespace) && c !== find) { | ||
local_pos++; | ||
if (local_pos >= input_length) { | ||
return false; | ||
} | ||
c = input.charAt(local_pos); | ||
} | ||
c = input.charAt(local_pos); | ||
return c === find; | ||
} | ||
return c === find; | ||
} | ||
function get_next_token() { | ||
var i, resulting_string; | ||
function get_next_token() { | ||
var i, resulting_string; | ||
n_newlines = 0; | ||
n_newlines = 0; | ||
if (parser_pos >= input_length) { | ||
return ['', 'TK_EOF']; | ||
} | ||
if (parser_pos >= input_length) { | ||
return ['', 'TK_EOF']; | ||
} | ||
wanted_newline = false; | ||
whitespace_before_token = []; | ||
wanted_newline = false; | ||
whitespace_before_token = []; | ||
var c = input.charAt(parser_pos); | ||
parser_pos += 1; | ||
var c = input.charAt(parser_pos); | ||
parser_pos += 1; | ||
while (in_array(c, whitespace)) { | ||
while (in_array(c, whitespace)) { | ||
if (c === '\n') { | ||
n_newlines += 1; | ||
whitespace_before_token = []; | ||
} else if (n_newlines) { | ||
if (c === indent_string) { | ||
whitespace_before_token.push(indent_string); | ||
} else if (c !== '\r') { | ||
whitespace_before_token.push(' '); | ||
if (c === '\n') { | ||
n_newlines += 1; | ||
whitespace_before_token = []; | ||
} else if (n_newlines) { | ||
if (c === indent_string) { | ||
whitespace_before_token.push(indent_string); | ||
} else if (c !== '\r') { | ||
whitespace_before_token.push(' '); | ||
} | ||
} | ||
} | ||
if (parser_pos >= input_length) { | ||
return ['', 'TK_EOF']; | ||
if (parser_pos >= input_length) { | ||
return ['', 'TK_EOF']; | ||
} | ||
c = input.charAt(parser_pos); | ||
parser_pos += 1; | ||
} | ||
c = input.charAt(parser_pos); | ||
parser_pos += 1; | ||
} | ||
if (in_array(c, wordchar)) { | ||
if (parser_pos < input_length) { | ||
while (in_array(input.charAt(parser_pos), wordchar)) { | ||
c += input.charAt(parser_pos); | ||
parser_pos += 1; | ||
if (parser_pos === input_length) { | ||
break; | ||
if (in_array(c, wordchar)) { | ||
if (parser_pos < input_length) { | ||
while (in_array(input.charAt(parser_pos), wordchar)) { | ||
c += input.charAt(parser_pos); | ||
parser_pos += 1; | ||
if (parser_pos === input_length) { | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
// small and surprisingly unugly hack for 1E-10 representation | ||
if (parser_pos !== input_length && c.match(/^[0-9]+[Ee]$/) && (input.charAt(parser_pos) === '-' || input.charAt(parser_pos) === '+')) { | ||
// small and surprisingly unugly hack for 1E-10 representation | ||
if (parser_pos !== input_length && c.match(/^[0-9]+[Ee]$/) && (input.charAt(parser_pos) === '-' || input.charAt(parser_pos) === '+')) { | ||
var sign = input.charAt(parser_pos); | ||
parser_pos += 1; | ||
var sign = input.charAt(parser_pos); | ||
parser_pos += 1; | ||
var t = get_next_token(); | ||
c += sign + t[0]; | ||
var t = get_next_token(); | ||
c += sign + t[0]; | ||
return [c, 'TK_WORD']; | ||
} | ||
if (c === 'in') { // hack for 'in' operator | ||
return [c, 'TK_OPERATOR']; | ||
} | ||
return [c, 'TK_WORD']; | ||
} | ||
if (c === 'in') { // hack for 'in' operator | ||
return [c, 'TK_OPERATOR']; | ||
if (c === '(' || c === '[') { | ||
return [c, 'TK_START_EXPR']; | ||
} | ||
return [c, 'TK_WORD']; | ||
} | ||
if (c === '(' || c === '[') { | ||
return [c, 'TK_START_EXPR']; | ||
} | ||
if (c === ')' || c === ']') { | ||
return [c, 'TK_END_EXPR']; | ||
} | ||
if (c === ')' || c === ']') { | ||
return [c, 'TK_END_EXPR']; | ||
} | ||
if (c === '{') { | ||
return [c, 'TK_START_BLOCK']; | ||
} | ||
if (c === '{') { | ||
return [c, 'TK_START_BLOCK']; | ||
} | ||
if (c === '}') { | ||
return [c, 'TK_END_BLOCK']; | ||
} | ||
if (c === '}') { | ||
return [c, 'TK_END_BLOCK']; | ||
} | ||
if (c === ';') { | ||
return [c, 'TK_SEMICOLON']; | ||
} | ||
if (c === ';') { | ||
return [c, 'TK_SEMICOLON']; | ||
} | ||
if (c === '/') { | ||
var comment = ''; | ||
// peek for comment /* ... */ | ||
var inline_comment = true; | ||
if (input.charAt(parser_pos) === '*') { | ||
parser_pos += 1; | ||
if (parser_pos < input_length) { | ||
while (parser_pos < input_length && !(input.charAt(parser_pos) === '*' && input.charAt(parser_pos + 1) && input.charAt(parser_pos + 1) === '/')) { | ||
c = input.charAt(parser_pos); | ||
comment += c; | ||
if (c === "\n" || c === "\r") { | ||
inline_comment = false; | ||
if (c === '/') { | ||
var comment = ''; | ||
// peek for comment /* ... */ | ||
var inline_comment = true; | ||
if (input.charAt(parser_pos) === '*') { | ||
parser_pos += 1; | ||
if (parser_pos < input_length) { | ||
while (parser_pos < input_length && !(input.charAt(parser_pos) === '*' && input.charAt(parser_pos + 1) && input.charAt(parser_pos + 1) === '/')) { | ||
c = input.charAt(parser_pos); | ||
comment += c; | ||
if (c === "\n" || c === "\r") { | ||
inline_comment = false; | ||
} | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
break; | ||
} | ||
} | ||
} | ||
parser_pos += 2; | ||
if (inline_comment && n_newlines === 0) { | ||
return ['/*' + comment + '*/', 'TK_INLINE_COMMENT']; | ||
} else { | ||
return ['/*' + comment + '*/', 'TK_BLOCK_COMMENT']; | ||
} | ||
} | ||
// peek for comment // ... | ||
if (input.charAt(parser_pos) === '/') { | ||
comment = c; | ||
while (input.charAt(parser_pos) !== '\r' && input.charAt(parser_pos) !== '\n') { | ||
comment += input.charAt(parser_pos); | ||
parser_pos += 1; | ||
@@ -641,768 +692,776 @@ if (parser_pos >= input_length) { | ||
} | ||
return [comment, 'TK_COMMENT']; | ||
} | ||
parser_pos += 2; | ||
if (inline_comment && n_newlines === 0) { | ||
return ['/*' + comment + '*/', 'TK_INLINE_COMMENT']; | ||
} else { | ||
return ['/*' + comment + '*/', 'TK_BLOCK_COMMENT']; | ||
} | ||
} | ||
// peek for comment // ... | ||
if (input.charAt(parser_pos) === '/') { | ||
comment = c; | ||
while (input.charAt(parser_pos) !== '\r' && input.charAt(parser_pos) !== '\n') { | ||
comment += input.charAt(parser_pos); | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
break; | ||
} | ||
} | ||
return [comment, 'TK_COMMENT']; | ||
} | ||
} | ||
if (c === "'" || c === '"' || // string | ||
(c === '/' && | ||
((last_type === 'TK_WORD' && is_special_word (flags.last_text)) || | ||
(last_type === 'TK_END_EXPR' && in_array(previous_flags.mode, [MODE.Conditional, MODE.ForInitializer])) || | ||
(in_array(last_type, ['TK_COMMENT', 'TK_START_EXPR', 'TK_START_BLOCK', | ||
'TK_END_BLOCK', 'TK_OPERATOR', 'TK_EQUALS', 'TK_EOF', 'TK_SEMICOLON', 'TK_COMMA' | ||
]))))) { // regexp | ||
var sep = c, | ||
esc = false, | ||
has_char_escapes = false; | ||
if (c === "'" || c === '"' || // string | ||
(c === '/' && | ||
((last_type === 'TK_WORD' && is_special_word(last_text)) || | ||
(last_type === 'TK_END_EXPR' && in_array(flags.previous_mode, [MODE.Conditional, MODE.ForInitializer])) || | ||
(in_array(last_type, ['TK_COMMENT', 'TK_START_EXPR', 'TK_START_BLOCK', | ||
'TK_END_BLOCK', 'TK_OPERATOR', 'TK_EQUALS', 'TK_EOF', 'TK_SEMICOLON', 'TK_COMMA' | ||
]))))) { // regexp | ||
var sep = c, | ||
esc = false, | ||
has_char_escapes = false; | ||
resulting_string = c; | ||
resulting_string = c; | ||
if (parser_pos < input_length) { | ||
if (sep === '/') { | ||
// | ||
// handle regexp separately... | ||
// | ||
var in_char_class = false; | ||
while (esc || in_char_class || input.charAt(parser_pos) !== sep) { | ||
resulting_string += input.charAt(parser_pos); | ||
if (!esc) { | ||
esc = input.charAt(parser_pos) === '\\'; | ||
if (input.charAt(parser_pos) === '[') { | ||
in_char_class = true; | ||
} else if (input.charAt(parser_pos) === ']') { | ||
in_char_class = false; | ||
} | ||
} else { | ||
esc = false; | ||
} | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
// incomplete string/rexp when end-of-file reached. | ||
// bail out with what had been received so far. | ||
return [resulting_string, 'TK_STRING']; | ||
} | ||
} | ||
if (parser_pos < input_length) { | ||
if (sep === '/') { | ||
// | ||
// handle regexp separately... | ||
// | ||
var in_char_class = false; | ||
while (esc || in_char_class || input.charAt(parser_pos) !== sep) { | ||
resulting_string += input.charAt(parser_pos); | ||
if (!esc) { | ||
esc = input.charAt(parser_pos) === '\\'; | ||
if (input.charAt(parser_pos) === '[') { | ||
in_char_class = true; | ||
} else if (input.charAt(parser_pos) === ']') { | ||
in_char_class = false; | ||
} else { | ||
// | ||
// and handle string also separately | ||
// | ||
while (esc || input.charAt(parser_pos) !== sep) { | ||
resulting_string += input.charAt(parser_pos); | ||
if (esc) { | ||
if (input.charAt(parser_pos) === 'x' || input.charAt(parser_pos) === 'u') { | ||
has_char_escapes = true; | ||
} | ||
esc = false; | ||
} else { | ||
esc = input.charAt(parser_pos) === '\\'; | ||
} | ||
} else { | ||
esc = false; | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
// incomplete string/rexp when end-of-file reached. | ||
// bail out with what had been received so far. | ||
return [resulting_string, 'TK_STRING']; | ||
} | ||
} | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
// incomplete string/rexp when end-of-file reached. | ||
// bail out with what had been received so far. | ||
return [resulting_string, 'TK_STRING']; | ||
} | ||
} | ||
} | ||
} else { | ||
// | ||
// and handle string also separately | ||
// | ||
while (esc || input.charAt(parser_pos) !== sep) { | ||
parser_pos += 1; | ||
resulting_string += sep; | ||
if (has_char_escapes && opt.unescape_strings) { | ||
resulting_string = unescape_string(resulting_string); | ||
} | ||
if (sep === '/') { | ||
// regexps may have modifiers /regexp/MOD , so fetch those, too | ||
while (parser_pos < input_length && in_array(input.charAt(parser_pos), wordchar)) { | ||
resulting_string += input.charAt(parser_pos); | ||
if (esc) { | ||
if (input.charAt(parser_pos) === 'x' || input.charAt(parser_pos) === 'u') { | ||
has_char_escapes = true; | ||
} | ||
esc = false; | ||
} else { | ||
esc = input.charAt(parser_pos) === '\\'; | ||
} | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
// incomplete string/rexp when end-of-file reached. | ||
// bail out with what had been received so far. | ||
return [resulting_string, 'TK_STRING']; | ||
} | ||
} | ||
} | ||
return [resulting_string, 'TK_STRING']; | ||
} | ||
parser_pos += 1; | ||
resulting_string += sep; | ||
if (c === '#') { | ||
if (has_char_escapes && opt.unescape_strings) { | ||
resulting_string = unescape_string(resulting_string); | ||
} | ||
if (sep === '/') { | ||
// regexps may have modifiers /regexp/MOD , so fetch those, too | ||
while (parser_pos < input_length && in_array(input.charAt(parser_pos), wordchar)) { | ||
resulting_string += input.charAt(parser_pos); | ||
parser_pos += 1; | ||
if (output.length === 0 && input.charAt(parser_pos) === '!') { | ||
// shebang | ||
resulting_string = c; | ||
while (parser_pos < input_length && c !== '\n') { | ||
c = input.charAt(parser_pos); | ||
resulting_string += c; | ||
parser_pos += 1; | ||
} | ||
return [trim(resulting_string) + '\n', 'TK_UNKNOWN']; | ||
} | ||
} | ||
return [resulting_string, 'TK_STRING']; | ||
} | ||
if (c === '#') { | ||
if (output.length === 0 && input.charAt(parser_pos) === '!') { | ||
// shebang | ||
resulting_string = c; | ||
while (parser_pos < input_length && c !== '\n') { | ||
c = input.charAt(parser_pos); | ||
resulting_string += c; | ||
parser_pos += 1; | ||
// Spidermonkey-specific sharp variables for circular references | ||
// https://developer.mozilla.org/En/Sharp_variables_in_JavaScript | ||
// http://mxr.mozilla.org/mozilla-central/source/js/src/jsscan.cpp around line 1935 | ||
var sharp = '#'; | ||
if (parser_pos < input_length && in_array(input.charAt(parser_pos), digits)) { | ||
do { | ||
c = input.charAt(parser_pos); | ||
sharp += c; | ||
parser_pos += 1; | ||
} while (parser_pos < input_length && c !== '#' && c !== '='); | ||
if (c === '#') { | ||
// | ||
} else if (input.charAt(parser_pos) === '[' && input.charAt(parser_pos + 1) === ']') { | ||
sharp += '[]'; | ||
parser_pos += 2; | ||
} else if (input.charAt(parser_pos) === '{' && input.charAt(parser_pos + 1) === '}') { | ||
sharp += '{}'; | ||
parser_pos += 2; | ||
} | ||
return [sharp, 'TK_WORD']; | ||
} | ||
return [trim(resulting_string) + '\n', 'TK_UNKNOWN']; | ||
} | ||
// Spidermonkey-specific sharp variables for circular references | ||
// https://developer.mozilla.org/En/Sharp_variables_in_JavaScript | ||
// http://mxr.mozilla.org/mozilla-central/source/js/src/jsscan.cpp around line 1935 | ||
var sharp = '#'; | ||
if (parser_pos < input_length && in_array(input.charAt(parser_pos), digits)) { | ||
do { | ||
c = input.charAt(parser_pos); | ||
sharp += c; | ||
parser_pos += 1; | ||
} while (parser_pos < input_length && c !== '#' && c !== '='); | ||
if (c === '#') { | ||
// | ||
} else if (input.charAt(parser_pos) === '[' && input.charAt(parser_pos + 1) === ']') { | ||
sharp += '[]'; | ||
parser_pos += 2; | ||
} else if (input.charAt(parser_pos) === '{' && input.charAt(parser_pos + 1) === '}') { | ||
sharp += '{}'; | ||
parser_pos += 2; | ||
if (c === '<' && input.substring(parser_pos - 1, parser_pos + 3) === '<!--') { | ||
parser_pos += 3; | ||
c = '<!--'; | ||
while (input.charAt(parser_pos) !== '\n' && parser_pos < input_length) { | ||
c += input.charAt(parser_pos); | ||
parser_pos++; | ||
} | ||
return [sharp, 'TK_WORD']; | ||
flags.in_html_comment = true; | ||
return [c, 'TK_COMMENT']; | ||
} | ||
} | ||
if (c === '<' && input.substring(parser_pos - 1, parser_pos + 3) === '<!--') { | ||
parser_pos += 3; | ||
c = '<!--'; | ||
while (input.charAt(parser_pos) !== '\n' && parser_pos < input_length) { | ||
c += input.charAt(parser_pos); | ||
parser_pos++; | ||
if (c === '-' && flags.in_html_comment && input.substring(parser_pos - 1, parser_pos + 2) === '-->') { | ||
flags.in_html_comment = false; | ||
parser_pos += 2; | ||
return ['-->', 'TK_COMMENT']; | ||
} | ||
flags.in_html_comment = true; | ||
return [c, 'TK_COMMENT']; | ||
} | ||
if (c === '-' && flags.in_html_comment && input.substring(parser_pos - 1, parser_pos + 2) === '-->') { | ||
flags.in_html_comment = false; | ||
parser_pos += 2; | ||
return ['-->', 'TK_COMMENT']; | ||
} | ||
if (c === '.') { | ||
return [c, 'TK_DOT']; | ||
} | ||
if (c === '.') { | ||
return [c, 'TK_DOT']; | ||
} | ||
if (in_array(c, punct)) { | ||
while (parser_pos < input_length && in_array(c + input.charAt(parser_pos), punct)) { | ||
c += input.charAt(parser_pos); | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
break; | ||
} | ||
} | ||
if (in_array(c, punct)) { | ||
while (parser_pos < input_length && in_array(c + input.charAt(parser_pos), punct)) { | ||
c += input.charAt(parser_pos); | ||
parser_pos += 1; | ||
if (parser_pos >= input_length) { | ||
break; | ||
if (c === ',') { | ||
return [c, 'TK_COMMA']; | ||
} else if (c === '=') { | ||
return [c, 'TK_EQUALS']; | ||
} else { | ||
return [c, 'TK_OPERATOR']; | ||
} | ||
} | ||
if (c === ',') { | ||
return [c, 'TK_COMMA']; | ||
} else if (c === '=') { | ||
return [c, 'TK_EQUALS']; | ||
} else { | ||
return [c, 'TK_OPERATOR']; | ||
} | ||
return [c, 'TK_UNKNOWN']; | ||
} | ||
return [c, 'TK_UNKNOWN']; | ||
} | ||
function handle_start_expr() { | ||
if (start_of_statement()) { | ||
// The conditional starts the statement if appropriate. | ||
} | ||
function handle_start_expr() { | ||
if (start_of_statement()) { | ||
// The conditional starts the statement if appropriate. | ||
} | ||
if (token_text === '[') { | ||
if (token_text === '[') { | ||
if (last_type === 'TK_WORD' || last_text === ')') { | ||
// this is array index specifier, break immediately | ||
// a[x], fn()[x] | ||
if (in_array(last_text, line_starters)) { | ||
output_space_before_token = true; | ||
if (last_type === 'TK_WORD' || flags.last_text === ')') { | ||
// this is array index specifier, break immediately | ||
// a[x], fn()[x] | ||
if (in_array (flags.last_text, line_starters)) { | ||
output_space_before_token = true; | ||
} | ||
set_mode(MODE.Expression); | ||
print_token(); | ||
return; | ||
} | ||
set_mode(MODE.Expression); | ||
print_token(); | ||
return; | ||
} | ||
if (is_array(flags.mode)) { | ||
if ((last_text === '[') || | ||
(last_last_text === ']' && last_text === ',')) { | ||
// ], [ goes to new line | ||
if (!opt.keep_array_indentation) { | ||
print_newline(); | ||
if (is_array(flags.mode)) { | ||
if ( (flags.last_text === '[') || | ||
(last_last_text === ']' && flags.last_text === ',')) { | ||
// ], [ goes to new line | ||
if (!opt.keep_array_indentation) { | ||
print_newline(); | ||
} | ||
} | ||
} | ||
} | ||
} else { | ||
if (last_text === 'for') { | ||
set_mode(MODE.ForInitializer); | ||
} else if (in_array(last_text, ['if', 'while'])) { | ||
set_mode(MODE.Conditional); | ||
} else { | ||
set_mode(MODE.Expression); | ||
if (flags.last_text === 'for') { | ||
set_mode(MODE.ForInitializer); | ||
} else if (in_array (flags.last_text, ['if', 'while'])) { | ||
set_mode(MODE.Conditional); | ||
} else { | ||
set_mode(MODE.Expression); | ||
} | ||
} | ||
} | ||
if (last_text === ';' || last_type === 'TK_START_BLOCK') { | ||
print_newline(); | ||
} else if (last_type === 'TK_END_EXPR' || last_type === 'TK_START_EXPR' || last_type === 'TK_END_BLOCK' || last_text === '.') { | ||
if (wanted_newline) { | ||
if (flags.last_text === ';' || last_type === 'TK_START_BLOCK') { | ||
print_newline(); | ||
} | ||
// do nothing on (( and )( and ][ and ]( and .( | ||
} else if (last_type !== 'TK_WORD' && last_type !== 'TK_OPERATOR') { | ||
output_space_before_token = true; | ||
} else if (last_word === 'function' || last_word === 'typeof') { | ||
// function() vs function () | ||
if (opt.jslint_happy) { | ||
} else if (last_type === 'TK_END_EXPR' || last_type === 'TK_START_EXPR' || last_type === 'TK_END_BLOCK' || flags.last_text === '.') { | ||
if (wanted_newline) { | ||
print_newline(); | ||
} | ||
// do nothing on (( and )( and ][ and ]( and .( | ||
} else if (last_type !== 'TK_WORD' && last_type !== 'TK_OPERATOR') { | ||
output_space_before_token = true; | ||
} else if (flags.last_word === 'function' || flags.last_word === 'typeof') { | ||
// function() vs function () | ||
if (opt.jslint_happy) { | ||
output_space_before_token = true; | ||
} | ||
} else if (in_array (flags.last_text, line_starters) || flags.last_text === 'catch') { | ||
if (opt.space_before_conditional) { | ||
output_space_before_token = true; | ||
} | ||
} | ||
} else if (in_array(last_text, line_starters) || last_text === 'catch') { | ||
if (opt.space_before_conditional) { | ||
output_space_before_token = true; | ||
} | ||
} | ||
// Support of this kind of newline preservation. | ||
// a = (b && | ||
// (c || d)); | ||
if (token_text === '(') { | ||
if (last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { | ||
if (flags.mode !== MODE.ObjectLiteral) { | ||
allow_wrap_or_preserved_newline(); | ||
// Support of this kind of newline preservation. | ||
// a = (b && | ||
// (c || d)); | ||
if (token_text === '(') { | ||
if (last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { | ||
if (flags.mode !== MODE.ObjectLiteral) { | ||
allow_wrap_or_preserved_newline(); | ||
} | ||
} | ||
} | ||
print_token(); | ||
if (token_text === '[') { | ||
set_mode(MODE.ArrayLiteral); | ||
indent(); | ||
} | ||
} | ||
print_token(); | ||
if (token_text === '[') { | ||
set_mode(MODE.ArrayLiteral); | ||
indent(); | ||
} | ||
} | ||
function handle_end_expr() { | ||
// statements inside expressions are not valid syntax, but... | ||
// statements must all be closed when their container closes | ||
while (flags.mode === MODE.Statement) { | ||
function handle_end_expr() { | ||
// statements inside expressions are not valid syntax, but... | ||
// statements must all be closed when their container closes | ||
while (flags.mode === MODE.Statement) { | ||
restore_mode(); | ||
} | ||
if (token_text === ']' && is_array(flags.mode) && flags.multiline_array && !opt.keep_array_indentation) { | ||
print_newline(); | ||
} | ||
restore_mode(); | ||
} | ||
print_token(); | ||
if (token_text === ']' && is_array(flags.mode) && flags.multiline_array && !opt.keep_array_indentation) { | ||
print_newline(); | ||
} | ||
restore_mode(); | ||
print_token(); | ||
// do {} while () // no statement required after | ||
if (flags.do_while && previous_flags.mode === MODE.Conditional) { | ||
previous_flags.mode = MODE.Expression; | ||
flags.do_block = false; | ||
flags.do_while = false; | ||
// do {} while () // no statement required after | ||
if (flags.do_while && flags.previous_mode === MODE.Conditional) { | ||
flags.previous_mode = MODE.Expression; | ||
flags.do_block = false; | ||
flags.do_while = false; | ||
} | ||
} | ||
} | ||
function handle_start_block() { | ||
set_mode(MODE.BlockStatement); | ||
function handle_start_block() { | ||
set_mode(MODE.BlockStatement); | ||
var empty_braces = is_next('}'); | ||
var empty_braces = is_next('}'); | ||
if (opt.brace_style === "expand-strict") { | ||
if (!empty_braces) { | ||
print_newline(); | ||
} | ||
} else if (opt.brace_style === "expand") { | ||
if (last_type !== 'TK_OPERATOR') { | ||
if (last_type === 'TK_EQUALS' || | ||
(is_special_word(last_text) && last_text !== 'else')) { | ||
output_space_before_token = true; | ||
} else { | ||
if (opt.brace_style === "expand-strict") { | ||
if (!empty_braces) { | ||
print_newline(); | ||
} | ||
} | ||
} else { // collapse | ||
if (last_type !== 'TK_OPERATOR' && last_type !== 'TK_START_EXPR') { | ||
if (last_type === 'TK_START_BLOCK') { | ||
print_newline(); | ||
} else { | ||
output_space_before_token = true; | ||
} | ||
} else { | ||
// if TK_OPERATOR or TK_START_EXPR | ||
if (is_array(flags.previous_mode) && last_text === ',') { | ||
if (last_last_text === '}') { | ||
// }, { in array context | ||
} else if (opt.brace_style === "expand") { | ||
if (last_type !== 'TK_OPERATOR') { | ||
if (last_type === 'TK_EQUALS' || | ||
(is_special_word (flags.last_text) && flags.last_text !== 'else')) { | ||
output_space_before_token = true; | ||
} else { | ||
print_newline(); // [a, b, c, { | ||
print_newline(); | ||
} | ||
} | ||
} else { // collapse | ||
if (last_type !== 'TK_OPERATOR' && last_type !== 'TK_START_EXPR') { | ||
if (last_type === 'TK_START_BLOCK') { | ||
print_newline(); | ||
} else { | ||
output_space_before_token = true; | ||
} | ||
} else { | ||
// if TK_OPERATOR or TK_START_EXPR | ||
if (is_array(previous_flags.mode) && flags.last_text === ',') { | ||
if (last_last_text === '}') { | ||
// }, { in array context | ||
output_space_before_token = true; | ||
} else { | ||
print_newline(); // [a, b, c, { | ||
} | ||
} | ||
} | ||
} | ||
print_token(); | ||
indent(); | ||
} | ||
print_token(); | ||
indent(); | ||
} | ||
function handle_end_block() { | ||
// statements must all be closed when their container closes | ||
while (flags.mode === MODE.Statement) { | ||
function handle_end_block() { | ||
// statements must all be closed when their container closes | ||
while (flags.mode === MODE.Statement) { | ||
restore_mode(); | ||
} | ||
restore_mode(); | ||
} | ||
restore_mode(); | ||
if (opt.brace_style === "expand" || opt.brace_style === "expand-strict") { | ||
if (last_text !== '{') { | ||
print_newline(); | ||
} | ||
} else { | ||
// skip {} | ||
if (last_type !== 'TK_START_BLOCK') { | ||
if (is_array(flags.mode) && opt.keep_array_indentation) { | ||
// we REALLY need a newline here, but newliner would skip that | ||
opt.keep_array_indentation = false; | ||
if (opt.brace_style === "expand" || opt.brace_style === "expand-strict") { | ||
if (last_type !== 'TK_START_BLOCK') { | ||
print_newline(); | ||
opt.keep_array_indentation = true; | ||
} | ||
} else { | ||
// skip {} | ||
if (last_type !== 'TK_START_BLOCK') { | ||
if (is_array(flags.mode) && opt.keep_array_indentation) { | ||
// we REALLY need a newline here, but newliner would skip that | ||
opt.keep_array_indentation = false; | ||
print_newline(); | ||
opt.keep_array_indentation = true; | ||
} else { | ||
print_newline(); | ||
} else { | ||
print_newline(); | ||
} | ||
} | ||
} | ||
print_token(); | ||
} | ||
print_token(); | ||
} | ||
function handle_word() { | ||
if (start_of_statement()) { | ||
// The conditional starts the statement if appropriate. | ||
} else if (wanted_newline && last_type !== 'TK_OPERATOR' && last_type !== 'TK_EQUALS' && (opt.preserve_newlines || last_text !== 'var')) { | ||
print_newline(); | ||
} | ||
function handle_word() { | ||
if (start_of_statement()) { | ||
// The conditional starts the statement if appropriate. | ||
} else if (wanted_newline && !is_expression(flags.mode) && | ||
(last_type !== 'TK_OPERATOR' || (flags.last_text === '--' || flags.last_text === '++')) && | ||
last_type !== 'TK_EQUALS' && | ||
(opt.preserve_newlines || flags.last_text !== 'var')) { | ||
if (flags.do_block && !flags.do_while) { | ||
if (token_text === 'while') { | ||
// do {} ## while () | ||
output_space_before_token = true; | ||
print_token(); | ||
output_space_before_token = true; | ||
flags.do_while = true; | ||
return; | ||
} else { | ||
// do {} should always have while as the next word. | ||
// if we don't see the expected while, recover | ||
print_newline(); | ||
flags.do_block = false; | ||
} | ||
} | ||
// if may be followed by else, or not | ||
// Bare/inline ifs are tricky | ||
// Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e(); | ||
if (flags.if_block) { | ||
if (token_text !== 'else') { | ||
while (flags.mode === MODE.Statement) { | ||
restore_mode(); | ||
if (flags.do_block && !flags.do_while) { | ||
if (token_text === 'while') { | ||
// do {} ## while () | ||
output_space_before_token = true; | ||
print_token(); | ||
output_space_before_token = true; | ||
flags.do_while = true; | ||
return; | ||
} else { | ||
// do {} should always have while as the next word. | ||
// if we don't see the expected while, recover | ||
print_newline(); | ||
flags.do_block = false; | ||
} | ||
flags.if_block = false; | ||
} | ||
} | ||
if (token_text === 'function') { | ||
if (flags.var_line && last_type !== 'TK_EQUALS') { | ||
flags.var_line_reindented = true; | ||
// if may be followed by else, or not | ||
// Bare/inline ifs are tricky | ||
// Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e(); | ||
if (flags.if_block) { | ||
if (token_text !== 'else') { | ||
while (flags.mode === MODE.Statement) { | ||
restore_mode(); | ||
} | ||
flags.if_block = false; | ||
} | ||
} | ||
if ((just_added_newline() || last_text === ';') && last_text !== '{' && last_type !== 'TK_BLOCK_COMMENT' && last_type !== 'TK_COMMENT') { | ||
// make sure there is a nice clean space of at least one blank line | ||
// before a new function definition | ||
n_newlines = just_added_newline() ? n_newlines : 0; | ||
if (!opt.preserve_newlines) { | ||
n_newlines = 1; | ||
if (token_text === 'function') { | ||
if (flags.var_line && last_type !== 'TK_EQUALS') { | ||
flags.var_line_reindented = true; | ||
} | ||
if ((just_added_newline() || flags.last_text === ';') && flags.last_text !== '{' && last_type !== 'TK_BLOCK_COMMENT' && last_type !== 'TK_COMMENT') { | ||
// make sure there is a nice clean space of at least one blank line | ||
// before a new function definition | ||
n_newlines = just_added_newline() ? n_newlines : 0; | ||
if (!opt.preserve_newlines) { | ||
n_newlines = 1; | ||
} | ||
for (var i = 0; i < 2 - n_newlines; i++) { | ||
print_newline(true); | ||
for (var i = 0; i < 2 - n_newlines; i++) { | ||
print_newline(true); | ||
} | ||
} | ||
} | ||
if (last_type === 'TK_WORD') { | ||
if (last_text === 'get' || last_text === 'set' || last_text === 'new' || last_text === 'return') { | ||
if (last_type === 'TK_WORD') { | ||
if (flags.last_text === 'get' || flags.last_text === 'set' || flags.last_text === 'new' || flags.last_text === 'return') { | ||
output_space_before_token = true; | ||
} else { | ||
print_newline(); | ||
} | ||
} else if (last_type === 'TK_OPERATOR' || flags.last_text === '=') { | ||
// foo = function | ||
output_space_before_token = true; | ||
} else if (is_expression(flags.mode)) { | ||
// (function | ||
} else { | ||
print_newline(); | ||
} | ||
} else if (last_type === 'TK_OPERATOR' || last_text === '=') { | ||
// foo = function | ||
output_space_before_token = true; | ||
} else if (is_expression(flags.mode)) { | ||
// (function | ||
} else { | ||
print_newline(); | ||
print_token(); | ||
flags.last_word = token_text; | ||
return; | ||
} | ||
print_token(); | ||
last_word = token_text; | ||
return; | ||
} | ||
if (token_text === 'case' || (token_text === 'default' && flags.in_case_statement)) { | ||
print_newline(); | ||
if (flags.case_body) { | ||
// switch cases following one another | ||
flags.indentation_level--; | ||
flags.case_body = false; | ||
if (token_text === 'case' || (token_text === 'default' && flags.in_case_statement)) { | ||
print_newline(); | ||
if (flags.case_body) { | ||
// switch cases following one another | ||
flags.indentation_level--; | ||
flags.case_body = false; | ||
} | ||
print_token(); | ||
flags.in_case = true; | ||
flags.in_case_statement = true; | ||
return; | ||
} | ||
print_token(); | ||
flags.in_case = true; | ||
flags.in_case_statement = true; | ||
return; | ||
} | ||
prefix = 'NONE'; | ||
prefix = 'NONE'; | ||
if (last_type === 'TK_END_BLOCK') { | ||
if (!in_array(token_text, ['else', 'catch', 'finally'])) { | ||
prefix = 'NEWLINE'; | ||
} else { | ||
if (opt.brace_style === "expand" || opt.brace_style === "end-expand" || opt.brace_style === "expand-strict") { | ||
if (last_type === 'TK_END_BLOCK') { | ||
if (!in_array(token_text, ['else', 'catch', 'finally'])) { | ||
prefix = 'NEWLINE'; | ||
} else { | ||
prefix = 'SPACE'; | ||
output_space_before_token = true; | ||
if (opt.brace_style === "expand" || opt.brace_style === "end-expand" || opt.brace_style === "expand-strict") { | ||
prefix = 'NEWLINE'; | ||
} else { | ||
prefix = 'SPACE'; | ||
output_space_before_token = true; | ||
} | ||
} | ||
} | ||
} else if (last_type === 'TK_SEMICOLON' && flags.mode === MODE.BlockStatement) { | ||
// TODO: Should this be for STATEMENT as well? | ||
prefix = 'NEWLINE'; | ||
} else if (last_type === 'TK_SEMICOLON' && is_expression(flags.mode)) { | ||
prefix = 'SPACE'; | ||
} else if (last_type === 'TK_STRING') { | ||
prefix = 'NEWLINE'; | ||
} else if (last_type === 'TK_WORD') { | ||
prefix = 'SPACE'; | ||
} else if (last_type === 'TK_START_BLOCK') { | ||
prefix = 'NEWLINE'; | ||
} else if (last_type === 'TK_END_EXPR') { | ||
output_space_before_token = true; | ||
prefix = 'NEWLINE'; | ||
} | ||
if (in_array(token_text, line_starters) && last_text !== ')') { | ||
if (last_text === 'else') { | ||
} else if (last_type === 'TK_SEMICOLON' && flags.mode === MODE.BlockStatement) { | ||
// TODO: Should this be for STATEMENT as well? | ||
prefix = 'NEWLINE'; | ||
} else if (last_type === 'TK_SEMICOLON' && is_expression(flags.mode)) { | ||
prefix = 'SPACE'; | ||
} else { | ||
} else if (last_type === 'TK_STRING') { | ||
prefix = 'NEWLINE'; | ||
} else if (last_type === 'TK_WORD') { | ||
prefix = 'SPACE'; | ||
} else if (last_type === 'TK_START_BLOCK') { | ||
prefix = 'NEWLINE'; | ||
} else if (last_type === 'TK_END_EXPR') { | ||
output_space_before_token = true; | ||
prefix = 'NEWLINE'; | ||
} | ||
} | ||
if (in_array(token_text, line_starters) && flags.last_text !== ')') { | ||
if (flags.last_text === 'else') { | ||
prefix = 'SPACE'; | ||
} else { | ||
prefix = 'NEWLINE'; | ||
} | ||
if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { | ||
if (flags.mode !== MODE.ObjectLiteral) { | ||
allow_wrap_or_preserved_newline(); | ||
} | ||
} | ||
if (in_array(token_text, ['else', 'catch', 'finally'])) { | ||
if (last_type !== 'TK_END_BLOCK' || opt.brace_style === "expand" || opt.brace_style === "end-expand" || opt.brace_style === "expand-strict") { | ||
print_newline(); | ||
} else { | ||
trim_output(true); | ||
output_space_before_token = true; | ||
if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { | ||
if (flags.mode !== MODE.ObjectLiteral) { | ||
allow_wrap_or_preserved_newline(); | ||
} | ||
} | ||
} else if (prefix === 'NEWLINE') { | ||
if (is_special_word(last_text)) { | ||
// no newline between 'return nnn' | ||
output_space_before_token = true; | ||
} else if (last_type !== 'TK_END_EXPR') { | ||
if ((last_type !== 'TK_START_EXPR' || token_text !== 'var') && last_text !== ':') { | ||
// no need to force newline on 'var': for (var x = 0...) | ||
if (token_text === 'if' && last_word === 'else' && last_text !== '{') { | ||
// no newline for } else if { | ||
output_space_before_token = true; | ||
} else { | ||
flags.var_line = false; | ||
flags.var_line_reindented = false; | ||
if (in_array(token_text, ['else', 'catch', 'finally'])) { | ||
if (last_type !== 'TK_END_BLOCK' || opt.brace_style === "expand" || opt.brace_style === "end-expand" || opt.brace_style === "expand-strict") { | ||
print_newline(); | ||
} else { | ||
trim_output(true); | ||
// If we trimmed and there's something other than a close block before us | ||
// put a newline back in. Handles '} // comment' scenario. | ||
if (output[output.length - 1] !== '}') { | ||
print_newline(); | ||
} | ||
output_space_before_token = true; | ||
} | ||
} else if (in_array(token_text, line_starters) && last_text !== ')') { | ||
flags.var_line = false; | ||
} else if (prefix === 'NEWLINE') { | ||
if (is_special_word (flags.last_text)) { | ||
// no newline between 'return nnn' | ||
output_space_before_token = true; | ||
} else if (last_type !== 'TK_END_EXPR') { | ||
if ((last_type !== 'TK_START_EXPR' || token_text !== 'var') && flags.last_text !== ':') { | ||
// no need to force newline on 'var': for (var x = 0...) | ||
if (token_text === 'if' && flags.last_word === 'else' && flags.last_text !== '{') { | ||
// no newline for } else if { | ||
output_space_before_token = true; | ||
} else { | ||
flags.var_line = false; | ||
flags.var_line_reindented = false; | ||
print_newline(); | ||
} | ||
} | ||
} else if (in_array(token_text, line_starters) && flags.last_text !== ')') { | ||
flags.var_line = false; | ||
flags.var_line_reindented = false; | ||
print_newline(); | ||
} | ||
} else if (is_array(flags.mode) && flags.last_text === ',' && last_last_text === '}') { | ||
print_newline(); // }, in lists get a newline treatment | ||
} else if (prefix === 'SPACE') { | ||
output_space_before_token = true; | ||
} | ||
print_token(); | ||
flags.last_word = token_text; | ||
if (token_text === 'var') { | ||
flags.var_line = true; | ||
flags.var_line_reindented = false; | ||
print_newline(); | ||
flags.var_line_tainted = false; | ||
} | ||
} else if (is_array(flags.mode) && last_text === ',' && last_last_text === '}') { | ||
print_newline(); // }, in lists get a newline treatment | ||
} else if (prefix === 'SPACE') { | ||
output_space_before_token = true; | ||
} | ||
print_token(); | ||
last_word = token_text; | ||
if (token_text === 'var') { | ||
flags.var_line = true; | ||
flags.var_line_reindented = false; | ||
flags.var_line_tainted = false; | ||
} | ||
if (token_text === 'do') { | ||
flags.do_block = true; | ||
} | ||
if (token_text === 'do') { | ||
flags.do_block = true; | ||
if (token_text === 'if') { | ||
flags.if_block = true; | ||
} | ||
} | ||
if (token_text === 'if') { | ||
flags.if_block = true; | ||
function handle_semicolon() { | ||
while (flags.mode === MODE.Statement && !flags.if_block) { | ||
restore_mode(); | ||
} | ||
print_token(); | ||
flags.var_line = false; | ||
flags.var_line_reindented = false; | ||
if (flags.mode === MODE.ObjectLiteral) { | ||
// if we're in OBJECT mode and see a semicolon, its invalid syntax | ||
// recover back to treating this as a BLOCK | ||
flags.mode = MODE.BlockStatement; | ||
} | ||
} | ||
} | ||
function handle_semicolon() { | ||
while (flags.mode === MODE.Statement && !flags.if_block) { | ||
restore_mode(); | ||
function handle_string() { | ||
if (start_of_statement()) { | ||
// The conditional starts the statement if appropriate. | ||
// One difference - strings want at least a space before | ||
output_space_before_token = true; | ||
} else if (last_type === 'TK_WORD') { | ||
output_space_before_token = true; | ||
} else if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { | ||
if (flags.mode !== MODE.ObjectLiteral) { | ||
allow_wrap_or_preserved_newline(); | ||
} | ||
} else { | ||
print_newline(); | ||
} | ||
print_token(); | ||
} | ||
print_token(); | ||
flags.var_line = false; | ||
flags.var_line_reindented = false; | ||
if (flags.mode === MODE.ObjectLiteral) { | ||
// if we're in OBJECT mode and see a semicolon, its invalid syntax | ||
// recover back to treating this as a BLOCK | ||
flags.mode = MODE.BlockStatement; | ||
} | ||
} | ||
function handle_string() { | ||
if (start_of_statement()) { | ||
// The conditional starts the statement if appropriate. | ||
// One difference - strings want at least a space before | ||
function handle_equals() { | ||
if (flags.var_line) { | ||
// just got an '=' in a var-line, different formatting/line-breaking, etc will now be done | ||
flags.var_line_tainted = true; | ||
} | ||
output_space_before_token = true; | ||
} else if (last_type === 'TK_WORD') { | ||
print_token(); | ||
output_space_before_token = true; | ||
} else if (last_type === 'TK_COMMA' || last_type === 'TK_START_EXPR' || last_type === 'TK_EQUALS' || last_type === 'TK_OPERATOR') { | ||
if (flags.mode !== MODE.ObjectLiteral) { | ||
allow_wrap_or_preserved_newline(); | ||
} | ||
} else { | ||
print_newline(); | ||
} | ||
print_token(); | ||
} | ||
function handle_equals() { | ||
if (flags.var_line) { | ||
// just got an '=' in a var-line, different formatting/line-breaking, etc will now be done | ||
flags.var_line_tainted = true; | ||
} | ||
output_space_before_token = true; | ||
print_token(); | ||
output_space_before_token = true; | ||
} | ||
function handle_comma() { | ||
if (flags.var_line) { | ||
if (is_expression(flags.mode) || last_type === 'TK_END_BLOCK') { | ||
// do not break on comma, for(var a = 1, b = 2) | ||
flags.var_line_tainted = false; | ||
} | ||
function handle_comma() { | ||
if (flags.var_line) { | ||
if (is_expression(flags.mode) || last_type === 'TK_END_BLOCK') { | ||
// do not break on comma, for(var a = 1, b = 2) | ||
flags.var_line_tainted = false; | ||
} | ||
if (flags.var_line) { | ||
flags.var_line_reindented = true; | ||
} | ||
if (flags.var_line) { | ||
flags.var_line_reindented = true; | ||
print_token(); | ||
if (flags.var_line_tainted) { | ||
flags.var_line_tainted = false; | ||
print_newline(); | ||
} else { | ||
output_space_before_token = true; | ||
} | ||
return; | ||
} | ||
print_token(); | ||
if (flags.var_line_tainted) { | ||
flags.var_line_tainted = false; | ||
print_newline(); | ||
if (last_type === 'TK_END_BLOCK' && flags.mode !== MODE.Expression) { | ||
print_token(); | ||
if (flags.mode === MODE.ObjectLiteral && flags.last_text === '}') { | ||
print_newline(); | ||
} else { | ||
output_space_before_token = true; | ||
} | ||
} else { | ||
output_space_before_token = true; | ||
if (flags.mode === MODE.ObjectLiteral) { | ||
print_token(); | ||
print_newline(); | ||
} else { | ||
// EXPR or DO_BLOCK | ||
print_token(); | ||
output_space_before_token = true; | ||
} | ||
} | ||
return; | ||
} | ||
if (last_type === 'TK_END_BLOCK' && flags.mode !== "(EXPRESSION)") { | ||
print_token(); | ||
if (flags.mode === MODE.ObjectLiteral && last_text === '}') { | ||
print_newline(); | ||
} else { | ||
function handle_operator() { | ||
var space_before = true; | ||
var space_after = true; | ||
if (is_special_word (flags.last_text)) { | ||
// "return" had a special handling in TK_WORD. Now we need to return the favor | ||
output_space_before_token = true; | ||
print_token(); | ||
return; | ||
} | ||
} else { | ||
if (flags.mode === MODE.ObjectLiteral) { | ||
// hack for actionscript's import .*; | ||
if (token_text === '*' && last_type === 'TK_DOT' && !last_last_text.match(/^\d+$/)) { | ||
print_token(); | ||
return; | ||
} | ||
if (token_text === ':' && flags.in_case) { | ||
flags.case_body = true; | ||
indent(); | ||
print_token(); | ||
print_newline(); | ||
} else { | ||
// EXPR or DO_BLOCK | ||
flags.in_case = false; | ||
return; | ||
} | ||
if (token_text === '::') { | ||
// no spaces around exotic namespacing syntax operator | ||
print_token(); | ||
output_space_before_token = true; | ||
return; | ||
} | ||
} | ||
} | ||
function handle_operator() { | ||
var space_before = true; | ||
var space_after = true; | ||
if (is_special_word(last_text)) { | ||
// "return" had a special handling in TK_WORD. Now we need to return the favor | ||
output_space_before_token = true; | ||
print_token(); | ||
return; | ||
} | ||
// http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1 | ||
// if there is a newline between -- or ++ and anything else we should preserve it. | ||
if (wanted_newline && (token_text === '--' || token_text === '++')) { | ||
print_newline(); | ||
} | ||
// hack for actionscript's import .*; | ||
if (token_text === '*' && last_type === 'TK_DOT' && !last_last_text.match(/^\d+$/)) { | ||
print_token(); | ||
return; | ||
} | ||
if (in_array(token_text, ['--', '++', '!']) || (in_array(token_text, ['-', '+']) && (in_array(last_type, ['TK_START_BLOCK', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR']) || in_array (flags.last_text, line_starters) || flags.last_text === ','))) { | ||
// unary operators (and binary +/- pretending to be unary) special cases | ||
if (token_text === ':' && flags.in_case) { | ||
flags.case_body = true; | ||
indent(); | ||
print_token(); | ||
print_newline(); | ||
flags.in_case = false; | ||
return; | ||
} | ||
space_before = false; | ||
space_after = false; | ||
if (token_text === '::') { | ||
// no spaces around exotic namespacing syntax operator | ||
print_token(); | ||
return; | ||
} | ||
if (flags.last_text === ';' && is_expression(flags.mode)) { | ||
// for (;; ++i) | ||
// ^^^ | ||
space_before = true; | ||
} | ||
if (in_array(token_text, ['--', '++', '!']) || (in_array(token_text, ['-', '+']) && (in_array(last_type, ['TK_START_BLOCK', 'TK_START_EXPR', 'TK_EQUALS', 'TK_OPERATOR']) || in_array(last_text, line_starters) || last_text === ','))) { | ||
// unary operators (and binary +/- pretending to be unary) special cases | ||
if (last_type === 'TK_WORD' && in_array (flags.last_text, line_starters)) { | ||
space_before = true; | ||
} | ||
space_before = false; | ||
space_after = false; | ||
if (last_text === ';' && is_expression(flags.mode)) { | ||
// for (;; ++i) | ||
// ^^^ | ||
space_before = true; | ||
} | ||
if (last_type === 'TK_WORD' && in_array(last_text, line_starters)) { | ||
space_before = true; | ||
} | ||
if ((flags.mode === MODE.BlockStatement || flags.mode === MODE.Statement) && (last_text === '{' || last_text === ';')) { | ||
// { foo; --i } | ||
// foo(); --bar; | ||
print_newline(); | ||
} | ||
} else if (token_text === ':') { | ||
if (flags.ternary_depth === 0) { | ||
if (flags.mode === MODE.BlockStatement) { | ||
flags.mode = MODE.ObjectLiteral; | ||
if ((flags.mode === MODE.BlockStatement || flags.mode === MODE.Statement) && (flags.last_text === '{' || flags.last_text === ';')) { | ||
// { foo; --i } | ||
// foo(); --bar; | ||
print_newline(); | ||
} | ||
space_before = false; | ||
} else { | ||
flags.ternary_depth -= 1; | ||
} else if (token_text === ':') { | ||
if (flags.ternary_depth === 0) { | ||
if (flags.mode === MODE.BlockStatement) { | ||
flags.mode = MODE.ObjectLiteral; | ||
} | ||
space_before = false; | ||
} else { | ||
flags.ternary_depth -= 1; | ||
} | ||
} else if (token_text === '?') { | ||
flags.ternary_depth += 1; | ||
} | ||
} else if (token_text === '?') { | ||
flags.ternary_depth += 1; | ||
output_space_before_token = output_space_before_token || space_before; | ||
print_token(); | ||
output_space_before_token = space_after; | ||
} | ||
output_space_before_token = output_space_before_token || space_before; | ||
print_token(); | ||
output_space_before_token = space_after; | ||
} | ||
function handle_block_comment() { | ||
var lines = split_newlines(token_text); | ||
var j; // iterator for this case | ||
function handle_block_comment() { | ||
var lines = split_newlines(token_text); | ||
var j; // iterator for this case | ||
if (all_lines_start_with(lines.slice(1), '*')) { | ||
// javadoc: reformat and reindent | ||
print_newline(false, true); | ||
print_token(lines[0]); | ||
for (j = 1; j < lines.length; j++) { | ||
if (all_lines_start_with(lines.slice(1), '*')) { | ||
// javadoc: reformat and reindent | ||
print_newline(false, true); | ||
print_token(' ' + trim(lines[j])); | ||
} | ||
print_token(lines[0]); | ||
for (j = 1; j < lines.length; j++) { | ||
print_newline(false, true); | ||
print_token(' ' + trim(lines[j])); | ||
} | ||
} else { | ||
} else { | ||
// simple block comment: leave intact | ||
if (lines.length > 1) { | ||
// multiline comment block starts with a new line | ||
print_newline(false, true); | ||
} else { | ||
// single-line /* comment */ stays where it is | ||
if (last_type === 'TK_END_BLOCK') { | ||
// simple block comment: leave intact | ||
if (lines.length > 1) { | ||
// multiline comment block starts with a new line | ||
print_newline(false, true); | ||
} else { | ||
output_space_before_token = true; | ||
// single-line /* comment */ stays where it is | ||
if (last_type === 'TK_END_BLOCK') { | ||
print_newline(false, true); | ||
} else { | ||
output_space_before_token = true; | ||
} | ||
} | ||
print_token(lines[0]); | ||
output.push("\n"); | ||
for (j = 1; j < lines.length; j++) { | ||
output.push(lines[j]); | ||
output.push("\n"); | ||
} | ||
} | ||
print_token(lines[0]); | ||
output.push("\n"); | ||
for (j = 1; j < lines.length; j++) { | ||
output.push(lines[j]); | ||
output.push("\n"); | ||
if (!is_next('\n')) { | ||
print_newline(false, true); | ||
} | ||
} | ||
if (!is_next('\n')) { | ||
print_newline(false, true); | ||
function handle_inline_comment() { | ||
output_space_before_token = true; | ||
print_token(); | ||
output_space_before_token = true; | ||
} | ||
} | ||
function handle_inline_comment() { | ||
output_space_before_token = true; | ||
print_token(); | ||
output_space_before_token = true; | ||
} | ||
function handle_comment() { | ||
if (wanted_newline) { | ||
print_newline(false, true); | ||
} | ||
if (flags.last_text === ',' && !wanted_newline) { | ||
trim_output(true); | ||
} | ||
function handle_comment() { | ||
if (wanted_newline) { | ||
output_space_before_token = true; | ||
print_token(); | ||
print_newline(false, true); | ||
} | ||
if (last_text === ',' && !wanted_newline) { | ||
trim_output(true); | ||
} | ||
output_space_before_token = true; | ||
print_token(); | ||
print_newline(false, true); | ||
} | ||
function handle_dot() { | ||
if (is_special_word (flags.last_text)) { | ||
output_space_before_token = true; | ||
} else { | ||
// allow preserved newlines before dots in general | ||
// force newlines on dots after close paren when break_chained - for bar().baz() | ||
allow_wrap_or_preserved_newline (flags.last_text === ')' && opt.break_chained_methods); | ||
} | ||
function handle_dot() { | ||
if (is_special_word(last_text)) { | ||
output_space_before_token = true; | ||
} else { | ||
// allow preserved newlines before dots in general | ||
// force newlines on dots after close paren when break_chained - for bar().baz() | ||
allow_wrap_or_preserved_newline(last_text === ')' && opt.break_chained_methods); | ||
print_token(); | ||
} | ||
print_token(); | ||
function handle_unknown() { | ||
print_token(); | ||
if (token_text[token_text.length - 1] === '\n') { | ||
print_newline(); | ||
} | ||
} | ||
} | ||
function handle_unknown() { | ||
print_token(); | ||
if (token_text[token_text.length - 1] === '\n') { | ||
print_newline(); | ||
} | ||
if (typeof define === "function") { | ||
// Add support for require.js | ||
define(function(require, exports, module) { | ||
exports.js_beautify = js_beautify; | ||
}); | ||
} else if (typeof exports !== "undefined") { | ||
// Add support for CommonJS. Just put this file somewhere on your require.paths | ||
// and you will be able to `var js_beautify = require("beautify").js_beautify`. | ||
exports.js_beautify = js_beautify; | ||
} else if (typeof window !== "undefined") { | ||
// If we're running a web page and don't have either of the above, add our one global | ||
window.js_beautify = js_beautify; | ||
} | ||
} | ||
// Add support for CommonJS. Just put this file somewhere on your require.paths | ||
// and you will be able to `var js_beautify = require("beautify").js_beautify`. | ||
if (typeof exports !== "undefined") { | ||
exports.js_beautify = js_beautify; | ||
} | ||
}()); |
32
cli.js
#!/usr/bin/env node | ||
/* | ||
The MIT License (MIT) | ||
Copyright (c) 2007-2013 Einar Lielmanis 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. | ||
Js-Beautify Command-line for node.js | ||
------------------------------------- | ||
Written by Daniel Stockman (daniel.stockman@gmail.com) | ||
*/ | ||
var debug = process.env.DEBUG_JSBEAUTIFY || process.env.JSBEAUTIFY_DEBUG | ||
@@ -4,0 +36,0 @@ ? function () { console.error.apply(console, arguments); } |
{ | ||
"name": "js-beautify", | ||
"version": "0.4.2", | ||
"version": "1.2.0", | ||
"description": "jsbeautifier.org for node", | ||
@@ -8,5 +8,5 @@ "main": "index.js", | ||
"bin": { | ||
"css-beautify": "./cli.js", | ||
"html-beautify": "./cli.js", | ||
"js-beautify": "./cli.js" | ||
"css-beautify": "./bin/css-beautify.js", | ||
"html-beautify": "./bin/html-beautify.js", | ||
"js-beautify": "./bin/js-beautify.js" | ||
}, | ||
@@ -17,3 +17,3 @@ "directories": { | ||
"scripts": { | ||
"test": "node ./tests/beautify-tests.js" | ||
"test": "node ./tests/node-beautify-tests.js" | ||
}, | ||
@@ -39,2 +39,4 @@ "bugs": "https://github.com/einars/js-beautify/issues", | ||
"Daniel Stockman <daniel.stockman@gmail.com>", | ||
"Harutyun Amirjanyan <amirjanyan@gmail.com>", | ||
"Nochum Sossonko <nsossonko@hotmail.com>", | ||
"Liam Newman <bitwiseman@gmail.com>" | ||
@@ -46,3 +48,6 @@ ], | ||
"nopt": "~2.1.1" | ||
}, | ||
"devDependencies": { | ||
"jshint": "1.1.0" | ||
} | ||
} |
# JS Beautifier | ||
[![Build Status](https://secure.travis-ci.org/einars/js-beautify.png?branch=master)](http://travis-ci.org/einars/js-beautify) | ||
[![NPM version](https://badge.fury.io/js/js-beautify.png)](http://badge.fury.io/js/js-beautify) | ||
@@ -163,2 +165,4 @@ ...or, more specifically, all of the code powering | ||
Python version flourished by Stefano Sanfilippo <a.little.coder@gmail.com> | ||
General maintenance and expansion by Liam Newman <bitwiseman@gmail.com> | ||
Command-line for node.js by Daniel Stockman <daniel.stockman@gmail.com> | ||
@@ -165,0 +169,0 @@ Thanks to Jason Diamond, Patrick Hof, Nochum Sossonko, Andreas Schneider, Dave |
/*global js_beautify: true */ | ||
/*jshint node:true */ | ||
/*jshint */ | ||
var isNode = (typeof module !== 'undefined' && module.exports); | ||
if (isNode) { | ||
var SanityTest = require('./sanitytest'), | ||
Urlencoded = require('../unpackers/urlencode_unpacker'), | ||
js_beautify = require('../beautify').js_beautify; | ||
} | ||
function run_beautifier_tests(test_obj, Urlencoded, js_beautify) | ||
{ | ||
var opts = { | ||
indent_size: 4, | ||
indent_char: ' ', | ||
preserve_newlines: true, | ||
jslint_happy: false, | ||
keep_array_indentation: false, | ||
brace_style: 'collapse', | ||
space_before_conditional: true, | ||
break_chained_methods: false | ||
}; | ||
var opts = { | ||
indent_size: 4, | ||
indent_char: ' ', | ||
preserve_newlines: true, | ||
jslint_happy: false, | ||
keep_array_indentation: false, | ||
brace_style: 'collapse', | ||
space_before_conditional: true, | ||
break_chained_methods: false | ||
}; | ||
function test_beautifier(input) | ||
{ | ||
return js_beautify(input, opts); | ||
} | ||
function test_beautifier(input) | ||
{ | ||
return js_beautify(input, opts); | ||
} | ||
var sanitytest; | ||
var sanitytest; | ||
// test the input on beautifier with the current flag settings | ||
// does not check the indentation / surroundings as bt() does | ||
function test_fragment(input, expected) | ||
{ | ||
expected = expected || input; | ||
sanitytest.expect(input, expected); | ||
} | ||
// test the input on beautifier with the current flag settings | ||
// does not check the indentation / surroundings as bt() does | ||
function test_fragment(input, expected) | ||
{ | ||
expected = expected || input; | ||
sanitytest.expect(input, expected); | ||
} | ||
// test the input on beautifier with the current flag settings | ||
// test both the input as well as { input } wrapping | ||
function bt(input, expectation) | ||
{ | ||
var wrapped_input, wrapped_expectation; | ||
// test the input on beautifier with the current flag settings | ||
// test both the input as well as { input } wrapping | ||
function bt(input, expectation) | ||
{ | ||
var wrapped_input, wrapped_expectation; | ||
expectation = expectation || input; | ||
test_fragment(input, expectation); | ||
expectation = expectation || input; | ||
test_fragment(input, expectation); | ||
// test also the returned indentation | ||
// e.g if input = "asdf();" | ||
// then test that this remains properly formatted as well: | ||
// { | ||
// asdf(); | ||
// indent; | ||
// } | ||
// test also the returned indentation | ||
// e.g if input = "asdf();" | ||
// then test that this remains properly formatted as well: | ||
// { | ||
// asdf(); | ||
// indent; | ||
// } | ||
if (opts.indent_size === 4 && input) { | ||
wrapped_input = '{\n' + input.replace(/^(.+)$/mg, ' $1') + '\n foo = bar;\n}'; | ||
wrapped_expectation = '{\n' + expectation.replace(/^(.+)$/mg, ' $1') + '\n foo = bar;\n}'; | ||
test_fragment(wrapped_input, wrapped_expectation); | ||
if (opts.indent_size === 4 && input) { | ||
wrapped_input = '{\n' + input.replace(/^(.+)$/mg, ' $1') + '\n foo = bar;\n}'; | ||
wrapped_expectation = '{\n' + expectation.replace(/^(.+)$/mg, ' $1') + '\n foo = bar;\n}'; | ||
test_fragment(wrapped_input, wrapped_expectation); | ||
} | ||
} | ||
} | ||
// test the input on beautifier with the current flag settings, | ||
// but dont't | ||
function bt_braces(input, expectation) | ||
{ | ||
var braces_ex = opts.brace_style; | ||
opts.brace_style = 'expand'; | ||
bt(input, expectation); | ||
opts.brace_style = braces_ex; | ||
} | ||
// test the input on beautifier with the current flag settings, | ||
// but dont't | ||
function bt_braces(input, expectation) | ||
{ | ||
var braces_ex = opts.brace_style; | ||
opts.brace_style = 'expand'; | ||
bt(input, expectation); | ||
opts.brace_style = braces_ex; | ||
} | ||
function beautifier_tests() | ||
{ | ||
sanitytest = test_obj; | ||
sanitytest.test_function(test_beautifier, 'js_beautify'); | ||
function run_beautifier_tests(test_obj) | ||
{ | ||
sanitytest = test_obj || new SanityTest(); | ||
sanitytest.test_function(test_beautifier, 'js_beautify'); | ||
opts.indent_size = 4; | ||
opts.indent_char = ' '; | ||
opts.preserve_newlines = true; | ||
opts.jslint_happy = false; | ||
opts.keep_array_indentation = false; | ||
opts.brace_style = "collapse"; | ||
opts.indent_size = 4; | ||
opts.indent_char = ' '; | ||
opts.preserve_newlines = true; | ||
opts.jslint_happy = false; | ||
opts.keep_array_indentation = false; | ||
opts.brace_style = "collapse"; | ||
bt(''); | ||
bt('return .5'); | ||
test_fragment(' return .5'); | ||
test_fragment(' return .5;\n a();'); | ||
bt('a = 1', 'a = 1'); | ||
bt('a=1', 'a = 1'); | ||
bt("a();\n\nb();", "a();\n\nb();"); | ||
bt('var a = 1 var b = 2', "var a = 1\nvar b = 2"); | ||
bt('var a=1, b=c[d], e=6;', 'var a = 1,\n b = c[d],\n e = 6;'); | ||
bt('var a,\n b,\n c;'); | ||
bt('a = " 12345 "'); | ||
bt("a = ' 12345 '"); | ||
bt('if (a == 1) b = 2;', "if (a == 1) b = 2;"); | ||
bt('if(1){2}else{3}', "if (1) {\n 2\n} else {\n 3\n}"); | ||
bt('if(1||2);', 'if (1 || 2);'); | ||
bt('(a==1)||(b==2)', '(a == 1) || (b == 2)'); | ||
bt('var a = 1 if (2) 3;', "var a = 1\nif (2) 3;"); | ||
bt('a = a + 1'); | ||
bt('a = a == 1'); | ||
bt('/12345[^678]*9+/.match(a)'); | ||
bt('a /= 5'); | ||
bt('a = 0.5 * 3'); | ||
bt('a *= 10.55'); | ||
bt('a < .5'); | ||
bt('a <= .5'); | ||
bt('a<.5', 'a < .5'); | ||
bt('a<=.5', 'a <= .5'); | ||
bt('a = 0xff;'); | ||
bt('a=0xff+4', 'a = 0xff + 4'); | ||
bt('a = [1, 2, 3, 4]'); | ||
bt('F*(g/=f)*g+b', 'F * (g /= f) * g + b'); | ||
bt('a.b({c:d})', "a.b({\n c: d\n})"); | ||
bt('a.b\n(\n{\nc:\nd\n}\n)', "a.b({\n c: d\n})"); | ||
bt('a=!b', 'a = !b'); | ||
bt('a?b:c', 'a ? b : c'); | ||
bt('a?1:2', 'a ? 1 : 2'); | ||
bt('a?(b):c', 'a ? (b) : c'); | ||
bt('x={a:1,b:w=="foo"?x:y,c:z}', 'x = {\n a: 1,\n b: w == "foo" ? x : y,\n c: z\n}'); | ||
bt('x=a?b?c?d:e:f:g;', 'x = a ? b ? c ? d : e : f : g;'); | ||
bt('x=a?b?c?d:{e1:1,e2:2}:f:g;', 'x = a ? b ? c ? d : {\n e1: 1,\n e2: 2\n} : f : g;'); | ||
bt('function void(void) {}'); | ||
bt('if(!a)foo();', 'if (!a) foo();'); | ||
bt('a=~a', 'a = ~a'); | ||
bt('a;/*comment*/b;', "a; /*comment*/\nb;"); | ||
bt('a;/* comment */b;', "a; /* comment */\nb;"); | ||
test_fragment('a;/*\ncomment\n*/b;', "a;\n/*\ncomment\n*/\nb;"); // simple comments don't get touched at all | ||
bt('a;/**\n* javadoc\n*/b;', "a;\n/**\n * javadoc\n */\nb;"); | ||
test_fragment('a;/**\n\nno javadoc\n*/b;', "a;\n/**\n\nno javadoc\n*/\nb;"); | ||
bt('a;/*\n* javadoc\n*/b;', "a;\n/*\n * javadoc\n */\nb;"); // comment blocks detected and reindented even w/o javadoc starter | ||
bt('if(a)break;', "if (a) break;"); | ||
bt('if(a){break}', "if (a) {\n break\n}"); | ||
bt('if((a))foo();', 'if ((a)) foo();'); | ||
bt('for(var i=0;;) a', 'for (var i = 0;;) a'); | ||
bt('for(var i=0;;)\na', 'for (var i = 0;;)\n a'); | ||
bt('a++;', 'a++;'); | ||
bt('for(;;i++)a()', 'for (;; i++) a()'); | ||
bt('for(;;i++)\na()', 'for (;; i++)\n a()'); | ||
bt('for(;;++i)a', 'for (;; ++i) a'); | ||
bt('return(1)', 'return (1)'); | ||
bt('try{a();}catch(b){c();}finally{d();}', "try {\n a();\n} catch (b) {\n c();\n} finally {\n d();\n}"); | ||
bt('(xx)()'); // magic function call | ||
bt('a[1]()'); // another magic function call | ||
bt('if(a){b();}else if(c) foo();', "if (a) {\n b();\n} else if (c) foo();"); | ||
bt('switch(x) {case 0: case 1: a(); break; default: break}', "switch (x) {\n case 0:\n case 1:\n a();\n break;\n default:\n break\n}"); | ||
bt('switch(x){case -1:break;case !y:break;}', 'switch (x) {\n case -1:\n break;\n case !y:\n break;\n}'); | ||
bt('a !== b'); | ||
bt('if (a) b(); else c();', "if (a) b();\nelse c();"); | ||
bt("// comment\n(function something() {})"); // typical greasemonkey start | ||
bt("{\n\n x();\n\n}"); // was: duplicating newlines | ||
bt('if (a in b) foo();'); | ||
bt('var a, b;'); | ||
// bt('var a, b'); | ||
bt('{a:1, b:2}', "{\n a: 1,\n b: 2\n}"); | ||
bt('a={1:[-1],2:[+1]}', 'a = {\n 1: [-1],\n 2: [+1]\n}'); | ||
bt('var l = {\'a\':\'1\', \'b\':\'2\'}', "var l = {\n 'a': '1',\n 'b': '2'\n}"); | ||
bt('if (template.user[n] in bk) foo();'); | ||
bt('{{}/z/}', "{\n {}\n /z/\n}"); | ||
bt('return 45', "return 45"); | ||
bt('If[1]', "If[1]"); | ||
bt('Then[1]', "Then[1]"); | ||
bt('a = 1e10', "a = 1e10"); | ||
bt('a = 1.3e10', "a = 1.3e10"); | ||
bt('a = 1.3e-10', "a = 1.3e-10"); | ||
bt('a = -1.3e-10', "a = -1.3e-10"); | ||
bt('a = 1e-10', "a = 1e-10"); | ||
bt('a = e - 10', "a = e - 10"); | ||
bt('a = 11-10', "a = 11 - 10"); | ||
bt("a = 1;// comment", "a = 1; // comment"); | ||
bt("a = 1; // comment", "a = 1; // comment"); | ||
bt("a = 1;\n // comment", "a = 1;\n// comment"); | ||
bt('a = [-1, -1, -1]'); | ||
bt(''); | ||
bt('return .5'); | ||
test_fragment(' return .5'); | ||
test_fragment(' return .5;\n a();'); | ||
bt('a = 1', 'a = 1'); | ||
bt('a=1', 'a = 1'); | ||
bt("a();\n\nb();", "a();\n\nb();"); | ||
bt('var a = 1 var b = 2', "var a = 1\nvar b = 2"); | ||
bt('var a=1, b=c[d], e=6;', 'var a = 1,\n b = c[d],\n e = 6;'); | ||
bt('var a,\n b,\n c;'); | ||
bt('a = " 12345 "'); | ||
bt("a = ' 12345 '"); | ||
bt('if (a == 1) b = 2;', "if (a == 1) b = 2;"); | ||
bt('if(1){2}else{3}', "if (1) {\n 2\n} else {\n 3\n}"); | ||
bt('if(1||2);', 'if (1 || 2);'); | ||
bt('(a==1)||(b==2)', '(a == 1) || (b == 2)'); | ||
bt('var a = 1 if (2) 3;', "var a = 1\nif (2) 3;"); | ||
bt('a = a + 1'); | ||
bt('a = a == 1'); | ||
bt('/12345[^678]*9+/.match(a)'); | ||
bt('a /= 5'); | ||
bt('a = 0.5 * 3'); | ||
bt('a *= 10.55'); | ||
bt('a < .5'); | ||
bt('a <= .5'); | ||
bt('a<.5', 'a < .5'); | ||
bt('a<=.5', 'a <= .5'); | ||
bt('a = 0xff;'); | ||
bt('a=0xff+4', 'a = 0xff + 4'); | ||
bt('a = [1, 2, 3, 4]'); | ||
bt('F*(g/=f)*g+b', 'F * (g /= f) * g + b'); | ||
bt('a.b({c:d})', "a.b({\n c: d\n})"); | ||
bt('a.b\n(\n{\nc:\nd\n}\n)', "a.b({\n c: d\n})"); | ||
bt('a=!b', 'a = !b'); | ||
bt('a?b:c', 'a ? b : c'); | ||
bt('a?1:2', 'a ? 1 : 2'); | ||
bt('a?(b):c', 'a ? (b) : c'); | ||
bt('x={a:1,b:w=="foo"?x:y,c:z}', 'x = {\n a: 1,\n b: w == "foo" ? x : y,\n c: z\n}'); | ||
bt('x=a?b?c?d:e:f:g;', 'x = a ? b ? c ? d : e : f : g;'); | ||
bt('x=a?b?c?d:{e1:1,e2:2}:f:g;', 'x = a ? b ? c ? d : {\n e1: 1,\n e2: 2\n} : f : g;'); | ||
bt('function void(void) {}'); | ||
bt('if(!a)foo();', 'if (!a) foo();'); | ||
bt('a=~a', 'a = ~a'); | ||
bt('a;/*comment*/b;', "a; /*comment*/\nb;"); | ||
bt('a;/* comment */b;', "a; /* comment */\nb;"); | ||
test_fragment('a;/*\ncomment\n*/b;', "a;\n/*\ncomment\n*/\nb;"); // simple comments don't get touched at all | ||
bt('a;/**\n* javadoc\n*/b;', "a;\n/**\n * javadoc\n */\nb;"); | ||
test_fragment('a;/**\n\nno javadoc\n*/b;', "a;\n/**\n\nno javadoc\n*/\nb;"); | ||
bt('a;/*\n* javadoc\n*/b;', "a;\n/*\n * javadoc\n */\nb;"); // comment blocks detected and reindented even w/o javadoc starter | ||
bt('if(a)break;', "if (a) break;"); | ||
bt('if(a){break}', "if (a) {\n break\n}"); | ||
bt('if((a))foo();', 'if ((a)) foo();'); | ||
bt('for(var i=0;;) a', 'for (var i = 0;;) a'); | ||
bt('for(var i=0;;)\na', 'for (var i = 0;;)\n a'); | ||
bt('a++;', 'a++;'); | ||
bt('for(;;i++)a()', 'for (;; i++) a()'); | ||
bt('for(;;i++)\na()', 'for (;; i++)\n a()'); | ||
bt('for(;;++i)a', 'for (;; ++i) a'); | ||
bt('return(1)', 'return (1)'); | ||
bt('try{a();}catch(b){c();}finally{d();}', "try {\n a();\n} catch (b) {\n c();\n} finally {\n d();\n}"); | ||
bt('(xx)()'); // magic function call | ||
bt('a[1]()'); // another magic function call | ||
bt('if(a){b();}else if(c) foo();', "if (a) {\n b();\n} else if (c) foo();"); | ||
bt('switch(x) {case 0: case 1: a(); break; default: break}', "switch (x) {\n case 0:\n case 1:\n a();\n break;\n default:\n break\n}"); | ||
bt('switch(x){case -1:break;case !y:break;}', 'switch (x) {\n case -1:\n break;\n case !y:\n break;\n}'); | ||
bt('a !== b'); | ||
bt('if (a) b(); else c();', "if (a) b();\nelse c();"); | ||
bt("// comment\n(function something() {})"); // typical greasemonkey start | ||
bt("{\n\n x();\n\n}"); // was: duplicating newlines | ||
bt('if (a in b) foo();'); | ||
bt('var a, b;'); | ||
// bt('var a, b'); | ||
bt('{a:1, b:2}', "{\n a: 1,\n b: 2\n}"); | ||
bt('a={1:[-1],2:[+1]}', 'a = {\n 1: [-1],\n 2: [+1]\n}'); | ||
bt('var l = {\'a\':\'1\', \'b\':\'2\'}', "var l = {\n 'a': '1',\n 'b': '2'\n}"); | ||
bt('if (template.user[n] in bk) foo();'); | ||
bt('{{}/z/}', "{\n {}\n /z/\n}"); | ||
bt('return 45', "return 45"); | ||
bt('If[1]', "If[1]"); | ||
bt('Then[1]', "Then[1]"); | ||
bt('a = 1e10', "a = 1e10"); | ||
bt('a = 1.3e10', "a = 1.3e10"); | ||
bt('a = 1.3e-10', "a = 1.3e-10"); | ||
bt('a = -1.3e-10', "a = -1.3e-10"); | ||
bt('a = 1e-10', "a = 1e-10"); | ||
bt('a = e - 10', "a = e - 10"); | ||
bt('a = 11-10', "a = 11 - 10"); | ||
bt("a = 1;// comment", "a = 1; // comment"); | ||
bt("a = 1; // comment", "a = 1; // comment"); | ||
bt("a = 1;\n // comment", "a = 1;\n// comment"); | ||
bt('a = [-1, -1, -1]'); | ||
// The exact formatting these should have is open for discussion, but they are at least reasonable | ||
bt('a = [ // comment\n -1, -1, -1\n]'); | ||
bt('var a = [ // comment\n -1, -1, -1\n]'); | ||
bt('a = [ // comment\n -1, // comment\n -1, -1\n]'); | ||
bt('var a = [ // comment\n -1, // comment\n -1, -1\n]'); | ||
// The exact formatting these should have is open for discussion, but they are at least reasonable | ||
bt('a = [ // comment\n -1, -1, -1\n]'); | ||
bt('var a = [ // comment\n -1, -1, -1\n]'); | ||
bt('a = [ // comment\n -1, // comment\n -1, -1\n]'); | ||
bt('var a = [ // comment\n -1, // comment\n -1, -1\n]'); | ||
bt('o = [{a:b},{c:d}]', 'o = [{\n a: b\n }, {\n c: d\n }\n]'); | ||
bt('o = [{a:b},{c:d}]', 'o = [{\n a: b\n }, {\n c: d\n }\n]'); | ||
bt("if (a) {\n do();\n}"); // was: extra space appended | ||
bt("if (a) {\n do();\n}"); // was: extra space appended | ||
bt("if (a) {\n// comment\n}else{\n// comment\n}", "if (a) {\n // comment\n} else {\n // comment\n}"); // if/else statement with empty body | ||
bt("if (a) {\n// comment\n// comment\n}", "if (a) {\n // comment\n // comment\n}"); // multiple comments indentation | ||
bt("if (a) b() else c();", "if (a) b()\nelse c();"); | ||
bt("if (a) b() else if c() d();", "if (a) b()\nelse if c() d();"); | ||
bt("if (a) {\n// comment\n}else{\n// comment\n}", "if (a) {\n // comment\n} else {\n // comment\n}"); // if/else statement with empty body | ||
bt("if (a) {\n// comment\n// comment\n}", "if (a) {\n // comment\n // comment\n}"); // multiple comments indentation | ||
bt("if (a) b() else c();", "if (a) b()\nelse c();"); | ||
bt("if (a) b() else if c() d();", "if (a) b()\nelse if c() d();"); | ||
bt("{}"); | ||
bt("{\n\n}"); | ||
bt("do { a(); } while ( 1 );", "do {\n a();\n} while (1);"); | ||
bt("do {} while (1);"); | ||
bt("do {\n} while (1);", "do {} while (1);"); | ||
bt("do {\n\n} while (1);"); | ||
bt("var a = x(a, b, c)"); | ||
bt("delete x if (a) b();", "delete x\nif (a) b();"); | ||
bt("delete x[x] if (a) b();", "delete x[x]\nif (a) b();"); | ||
bt("for(var a=1,b=2)d", "for (var a = 1, b = 2) d"); | ||
bt("for(var a=1,b=2,c=3) d", "for (var a = 1, b = 2, c = 3) d"); | ||
bt("for(var a=1,b=2,c=3;d<3;d++)\ne", "for (var a = 1, b = 2, c = 3; d < 3; d++)\n e"); | ||
bt("function x(){(a||b).c()}", "function x() {\n (a || b).c()\n}"); | ||
bt("function x(){return - 1}", "function x() {\n return -1\n}"); | ||
bt("function x(){return ! a}", "function x() {\n return !a\n}"); | ||
bt("{}"); | ||
bt("{\n\n}"); | ||
bt("do { a(); } while ( 1 );", "do {\n a();\n} while (1);"); | ||
bt("do {} while (1);"); | ||
bt("do {\n} while (1);", "do {} while (1);"); | ||
bt("do {\n\n} while (1);"); | ||
bt("var a = x(a, b, c)"); | ||
bt("delete x if (a) b();", "delete x\nif (a) b();"); | ||
bt("delete x[x] if (a) b();", "delete x[x]\nif (a) b();"); | ||
bt("for(var a=1,b=2)d", "for (var a = 1, b = 2) d"); | ||
bt("for(var a=1,b=2,c=3) d", "for (var a = 1, b = 2, c = 3) d"); | ||
bt("for(var a=1,b=2,c=3;d<3;d++)\ne", "for (var a = 1, b = 2, c = 3; d < 3; d++)\n e"); | ||
bt("function x(){(a||b).c()}", "function x() {\n (a || b).c()\n}"); | ||
bt("function x(){return - 1}", "function x() {\n return -1\n}"); | ||
bt("function x(){return ! a}", "function x() {\n return !a\n}"); | ||
// a common snippet in jQuery plugins | ||
bt("settings = $.extend({},defaults,settings);", "settings = $.extend({}, defaults, settings);"); | ||
// a common snippet in jQuery plugins | ||
bt("settings = $.extend({},defaults,settings);", "settings = $.extend({}, defaults, settings);"); | ||
bt('{xxx;}()', '{\n xxx;\n}()'); | ||
bt('{xxx;}()', '{\n xxx;\n}()'); | ||
bt("a = 'a'\nb = 'b'"); | ||
bt("a = /reg/exp"); | ||
bt("a = /reg/"); | ||
bt('/abc/.test()'); | ||
bt('/abc/i.test()'); | ||
bt("{/abc/i.test()}", "{\n /abc/i.test()\n}"); | ||
bt('var x=(a)/a;', 'var x = (a) / a;'); | ||
bt("a = 'a'\nb = 'b'"); | ||
bt("a = /reg/exp"); | ||
bt("a = /reg/"); | ||
bt('/abc/.test()'); | ||
bt('/abc/i.test()'); | ||
bt("{/abc/i.test()}", "{\n /abc/i.test()\n}"); | ||
bt('var x=(a)/a;', 'var x = (a) / a;'); | ||
bt('x != -1', 'x != -1'); | ||
bt('x != -1', 'x != -1'); | ||
bt('for (; s-->0;)t', 'for (; s-- > 0;) t'); | ||
bt('for (; s++>0;)u', 'for (; s++ > 0;) u'); | ||
bt('a = s++>s--;', 'a = s++ > s--;'); | ||
bt('a = s++>--s;', 'a = s++ > --s;'); | ||
bt('for (; s-->0;)t', 'for (; s-- > 0;) t'); | ||
bt('for (; s++>0;)u', 'for (; s++ > 0;) u'); | ||
bt('a = s++>s--;', 'a = s++ > s--;'); | ||
bt('a = s++>--s;', 'a = s++ > --s;'); | ||
bt('{x=#1=[]}', '{\n x = #1=[]\n}'); | ||
bt('{a:#1={}}', '{\n a: #1={}\n}'); | ||
bt('{a:#1#}', '{\n a: #1#\n}'); | ||
bt('{x=#1=[]}', '{\n x = #1=[]\n}'); | ||
bt('{a:#1={}}', '{\n a: #1={}\n}'); | ||
bt('{a:#1#}', '{\n a: #1#\n}'); | ||
test_fragment('"incomplete-string'); | ||
test_fragment("'incomplete-string"); | ||
test_fragment('/incomplete-regex'); | ||
test_fragment('"incomplete-string'); | ||
test_fragment("'incomplete-string"); | ||
test_fragment('/incomplete-regex'); | ||
test_fragment('{a:1},{a:2}', '{\n a: 1\n}, {\n a: 2\n}'); | ||
test_fragment('var ary=[{a:1}, {a:2}];', 'var ary = [{\n a: 1\n }, {\n a: 2\n }\n];'); | ||
test_fragment('{a:1},{a:2}', '{\n a: 1\n}, {\n a: 2\n}'); | ||
test_fragment('var ary=[{a:1}, {a:2}];', 'var ary = [{\n a: 1\n }, {\n a: 2\n }\n];'); | ||
test_fragment('{a:#1', '{\n a: #1'); // incomplete | ||
test_fragment('{a:#', '{\n a: #'); // incomplete | ||
test_fragment('{a:#1', '{\n a: #1'); // incomplete | ||
test_fragment('{a:#', '{\n a: #'); // incomplete | ||
test_fragment('}}}', '}\n}\n}'); // incomplete | ||
test_fragment('}}}', '}\n}\n}'); // incomplete | ||
test_fragment('<!--\nvoid();\n// -->', '<!--\nvoid();\n// -->'); | ||
test_fragment('<!--\nvoid();\n// -->', '<!--\nvoid();\n// -->'); | ||
test_fragment('a=/regexp', 'a = /regexp'); // incomplete regexp | ||
test_fragment('a=/regexp', 'a = /regexp'); // incomplete regexp | ||
bt('{a:#1=[],b:#1#,c:#999999#}', '{\n a: #1=[],\n b: #1#,\n c: #999999#\n}'); | ||
bt('{a:#1=[],b:#1#,c:#999999#}', '{\n a: #1=[],\n b: #1#,\n c: #999999#\n}'); | ||
bt("a = 1e+2"); | ||
bt("a = 1e-2"); | ||
bt("do{x()}while(a>1)", "do {\n x()\n} while (a > 1)"); | ||
bt("a = 1e+2"); | ||
bt("a = 1e-2"); | ||
bt("do{x()}while(a>1)", "do {\n x()\n} while (a > 1)"); | ||
bt("x(); /reg/exp.match(something)", "x();\n/reg/exp.match(something)"); | ||
bt("x(); /reg/exp.match(something)", "x();\n/reg/exp.match(something)"); | ||
test_fragment("something();(", "something();\n("); | ||
test_fragment("#!she/bangs, she bangs\nf=1", "#!she/bangs, she bangs\n\nf = 1"); | ||
test_fragment("#!she/bangs, she bangs\n\nf=1", "#!she/bangs, she bangs\n\nf = 1"); | ||
test_fragment("#!she/bangs, she bangs\n\n/* comment */", "#!she/bangs, she bangs\n\n/* comment */"); | ||
test_fragment("#!she/bangs, she bangs\n\n\n/* comment */", "#!she/bangs, she bangs\n\n\n/* comment */"); | ||
test_fragment("#", "#"); | ||
test_fragment("#!", "#!"); | ||
test_fragment("something();(", "something();\n("); | ||
test_fragment("#!she/bangs, she bangs\nf=1", "#!she/bangs, she bangs\n\nf = 1"); | ||
test_fragment("#!she/bangs, she bangs\n\nf=1", "#!she/bangs, she bangs\n\nf = 1"); | ||
test_fragment("#!she/bangs, she bangs\n\n/* comment */", "#!she/bangs, she bangs\n\n/* comment */"); | ||
test_fragment("#!she/bangs, she bangs\n\n\n/* comment */", "#!she/bangs, she bangs\n\n\n/* comment */"); | ||
test_fragment("#", "#"); | ||
test_fragment("#!", "#!"); | ||
bt("function namespace::something()"); | ||
bt("function namespace::something()"); | ||
test_fragment("<!--\nsomething();\n-->", "<!--\nsomething();\n-->"); | ||
test_fragment("<!--\nif(i<0){bla();}\n-->", "<!--\nif (i < 0) {\n bla();\n}\n-->"); | ||
test_fragment("<!--\nsomething();\n-->", "<!--\nsomething();\n-->"); | ||
test_fragment("<!--\nif(i<0){bla();}\n-->", "<!--\nif (i < 0) {\n bla();\n}\n-->"); | ||
bt('{foo();--bar;}', '{\n foo();\n --bar;\n}'); | ||
bt('{foo();++bar;}', '{\n foo();\n ++bar;\n}'); | ||
bt('{--bar;}', '{\n --bar;\n}'); | ||
bt('{++bar;}', '{\n ++bar;\n}'); | ||
bt('{foo();--bar;}', '{\n foo();\n --bar;\n}'); | ||
bt('{foo();++bar;}', '{\n foo();\n ++bar;\n}'); | ||
bt('{--bar;}', '{\n --bar;\n}'); | ||
bt('{++bar;}', '{\n ++bar;\n}'); | ||
// Handling of newlines around unary ++ and -- operators | ||
bt('{foo\n++bar;}', '{\n foo\n ++bar;\n}'); | ||
bt('{foo++\nbar;}', '{\n foo++\n bar;\n}'); | ||
// regexps | ||
bt('a(/abc\\/\\/def/);b()', "a(/abc\\/\\/def/);\nb()"); | ||
bt('a(/a[b\\[\\]c]d/);b()', "a(/a[b\\[\\]c]d/);\nb()"); | ||
test_fragment('a(/a[b\\[', "a(/a[b\\["); // incomplete char class | ||
// allow unescaped / in char classes | ||
bt('a(/[a/b]/);b()', "a(/[a/b]/);\nb()"); | ||
// This is invalid, but harder to guard against. Issue #203. | ||
bt('{foo\n++\nbar;}', '{\n foo\n ++\n bar;\n}'); | ||
bt('a=[[1,2],[4,5],[7,8]]', "a = [\n [1, 2],\n [4, 5],\n [7, 8]\n]"); | ||
bt('a=[a[1],b[4],c[d[7]]]', "a = [a[1], b[4], c[d[7]]]"); | ||
bt('[1,2,[3,4,[5,6],7],8]', "[1, 2, [3, 4, [5, 6], 7], 8]"); | ||
bt('[[["1","2"],["3","4"]],[["5","6","7"],["8","9","0"]],[["1","2","3"],["4","5","6","7"],["8","9","0"]]]', | ||
'[\n [\n ["1", "2"],\n ["3", "4"]\n ],\n [\n ["5", "6", "7"],\n ["8", "9", "0"]\n ],\n [\n ["1", "2", "3"],\n ["4", "5", "6", "7"],\n ["8", "9", "0"]\n ]\n]'); | ||
// regexps | ||
bt('a(/abc\\/\\/def/);b()', "a(/abc\\/\\/def/);\nb()"); | ||
bt('a(/a[b\\[\\]c]d/);b()', "a(/a[b\\[\\]c]d/);\nb()"); | ||
test_fragment('a(/a[b\\[', "a(/a[b\\["); // incomplete char class | ||
// allow unescaped / in char classes | ||
bt('a(/[a/b]/);b()', "a(/[a/b]/);\nb()"); | ||
bt('{[x()[0]];indent;}', '{\n [x()[0]];\n indent;\n}'); | ||
bt('a=[[1,2],[4,5],[7,8]]', "a = [\n [1, 2],\n [4, 5],\n [7, 8]\n]"); | ||
bt('a=[a[1],b[4],c[d[7]]]', "a = [a[1], b[4], c[d[7]]]"); | ||
bt('[1,2,[3,4,[5,6],7],8]', "[1, 2, [3, 4, [5, 6], 7], 8]"); | ||
bt('return ++i', 'return ++i'); | ||
bt('return !!x', 'return !!x'); | ||
bt('return !x', 'return !x'); | ||
bt('return [1,2]', 'return [1, 2]'); | ||
bt('return;', 'return;'); | ||
bt('return\nfunc', 'return\nfunc'); | ||
bt('catch(e)', 'catch (e)'); | ||
bt('[[["1","2"],["3","4"]],[["5","6","7"],["8","9","0"]],[["1","2","3"],["4","5","6","7"],["8","9","0"]]]', | ||
'[\n [\n ["1", "2"],\n ["3", "4"]\n ],\n [\n ["5", "6", "7"],\n ["8", "9", "0"]\n ],\n [\n ["1", "2", "3"],\n ["4", "5", "6", "7"],\n ["8", "9", "0"]\n ]\n]'); | ||
bt('var a=1,b={foo:2,bar:3},{baz:4,wham:5},c=4;', 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n }, {\n baz: 4,\n wham: 5\n }, c = 4;'); | ||
bt('var a=1,b={foo:2,bar:3},{baz:4,wham:5},\nc=4;', 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n }, {\n baz: 4,\n wham: 5\n },\n c = 4;'); | ||
bt('{[x()[0]];indent;}', '{\n [x()[0]];\n indent;\n}'); | ||
// inline comment | ||
bt('function x(/*int*/ start, /*string*/ foo)', 'function x( /*int*/ start, /*string*/ foo)'); | ||
bt('return ++i', 'return ++i'); | ||
bt('return !!x', 'return !!x'); | ||
bt('return !x', 'return !x'); | ||
bt('return [1,2]', 'return [1, 2]'); | ||
bt('return;', 'return;'); | ||
bt('return\nfunc', 'return\nfunc'); | ||
bt('catch(e)', 'catch (e)'); | ||
// javadoc comment | ||
bt('/**\n* foo\n*/', '/**\n * foo\n */'); | ||
bt('{\n/**\n* foo\n*/\n}', '{\n /**\n * foo\n */\n}'); | ||
bt('var a=1,b={foo:2,bar:3},{baz:4,wham:5},c=4;', 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n }, {\n baz: 4,\n wham: 5\n }, c = 4;'); | ||
bt('var a=1,b={foo:2,bar:3},{baz:4,wham:5},\nc=4;', 'var a = 1,\n b = {\n foo: 2,\n bar: 3\n }, {\n baz: 4,\n wham: 5\n },\n c = 4;'); | ||
bt('var a,b,c=1,d,e,f=2;', 'var a, b, c = 1,\n d, e, f = 2;'); | ||
bt('var a,b,c=[],d,e,f=2;', 'var a, b, c = [],\n d, e, f = 2;'); | ||
// inline comment | ||
bt('function x(/*int*/ start, /*string*/ foo)', 'function x( /*int*/ start, /*string*/ foo)'); | ||
bt('do/regexp/;\nwhile(1);', 'do /regexp/;\nwhile (1);'); // hmmm | ||
// javadoc comment | ||
bt('/**\n* foo\n*/', '/**\n * foo\n */'); | ||
bt('{\n/**\n* foo\n*/\n}', '{\n /**\n * foo\n */\n}'); | ||
bt('var a = a,\na;\nb = {\nb\n}', 'var a = a,\n a;\nb = {\n b\n}'); | ||
bt('var a,b,c=1,d,e,f=2;', 'var a, b, c = 1,\n d, e, f = 2;'); | ||
bt('var a,b,c=[],d,e,f=2;', 'var a, b, c = [],\n d, e, f = 2;'); | ||
bt('var a = a,\n /* c */\n b;'); | ||
bt('var a = a,\n // c\n b;'); | ||
bt('do/regexp/;\nwhile(1);', 'do /regexp/;\nwhile (1);'); // hmmm | ||
bt('foo.("bar");'); // weird element referencing | ||
bt('var a = a,\na;\nb = {\nb\n}', 'var a = a,\n a;\nb = {\n b\n}'); | ||
bt('var a = a,\n /* c */\n b;'); | ||
bt('var a = a,\n // c\n b;'); | ||
bt('if (a) a()\nelse b()\nnewline()'); | ||
bt('if (a) a()\nnewline()'); | ||
bt('a=typeof(x)', 'a = typeof(x)'); | ||
bt('foo.("bar");'); // weird element referencing | ||
bt('var a = function() {\n return null;\n},\n b = false;'); | ||
bt('var a = function() {\n func1()\n}'); | ||
bt('var a = function() {\n func1()\n}\nvar b = function() {\n func2()\n}'); | ||
bt('if (a) a()\nelse b()\nnewline()'); | ||
bt('if (a) a()\nnewline()'); | ||
bt('a=typeof(x)', 'a = typeof(x)'); | ||
bt('var a = function() {\n return null;\n},\n b = false;'); | ||
bt('var a = function() {\n func1()\n}'); | ||
bt('var a = function() {\n func1()\n}\nvar b = function() {\n func2()\n}'); | ||
opts.jslint_happy = true; | ||
bt('a=typeof(x)', 'a = typeof (x)'); | ||
bt('x();\n\nfunction(){}', 'x();\n\nfunction () {}'); | ||
bt('function () {\n var a, b, c, d, e = [],\n f;\n}'); | ||
test_fragment("// comment 1\n(function()", "// comment 1\n(function ()"); // typical greasemonkey start | ||
bt('var o1=$.extend(a);function(){alert(x);}', 'var o1 = $.extend(a);\n\nfunction () {\n alert(x);\n}'); | ||
opts.jslint_happy = false; | ||
opts.jslint_happy = true; | ||
test_fragment("// comment 2\n(function()", "// comment 2\n(function()"); // typical greasemonkey start | ||
bt("var a2, b2, c2, d2 = 0, c = function() {}, d = '';", "var a2, b2, c2, d2 = 0,\n c = function() {}, d = '';"); | ||
bt("var a2, b2, c2, d2 = 0, c = function() {},\nd = '';", "var a2, b2, c2, d2 = 0,\n c = function() {},\n d = '';"); | ||
bt('var o2=$.extend(a);function(){alert(x);}', 'var o2 = $.extend(a);\n\nfunction() {\n alert(x);\n}'); | ||
bt('a=typeof(x)', 'a = typeof (x)'); | ||
bt('x();\n\nfunction(){}', 'x();\n\nfunction () {}'); | ||
bt('function () {\n var a, b, c, d, e = [],\n f;\n}'); | ||
test_fragment("// comment 1\n(function()", "// comment 1\n(function ()"); // typical greasemonkey start | ||
bt('var o1=$.extend(a);function(){alert(x);}', 'var o1 = $.extend(a);\n\nfunction () {\n alert(x);\n}'); | ||
bt('{"x":[{"a":1,"b":3},7,8,8,8,8,{"b":99},{"a":11}]}', '{\n "x": [{\n "a": 1,\n "b": 3\n },\n 7, 8, 8, 8, 8, {\n "b": 99\n }, {\n "a": 11\n }\n ]\n}'); | ||
opts.jslint_happy = false; | ||
bt('{"1":{"1a":"1b"},"2"}', '{\n "1": {\n "1a": "1b"\n },\n "2"\n}'); | ||
bt('{a:{a:b},c}', '{\n a: {\n a: b\n },\n c\n}'); | ||
test_fragment("// comment 2\n(function()", "// comment 2\n(function()"); // typical greasemonkey start | ||
bt("var a2, b2, c2, d2 = 0, c = function() {}, d = '';", "var a2, b2, c2, d2 = 0,\n c = function() {}, d = '';"); | ||
bt("var a2, b2, c2, d2 = 0, c = function() {},\nd = '';", "var a2, b2, c2, d2 = 0,\n c = function() {},\n d = '';"); | ||
bt('var o2=$.extend(a);function(){alert(x);}', 'var o2 = $.extend(a);\n\nfunction() {\n alert(x);\n}'); | ||
bt('{[y[a]];keep_indent;}', '{\n [y[a]];\n keep_indent;\n}'); | ||
bt('{"x":[{"a":1,"b":3},7,8,8,8,8,{"b":99},{"a":11}]}', '{\n "x": [{\n "a": 1,\n "b": 3\n },\n 7, 8, 8, 8, 8, {\n "b": 99\n }, {\n "a": 11\n }\n ]\n}'); | ||
bt('if (x) {y} else { if (x) {y}}', 'if (x) {\n y\n} else {\n if (x) {\n y\n }\n}'); | ||
bt('{"1":{"1a":"1b"},"2"}', '{\n "1": {\n "1a": "1b"\n },\n "2"\n}'); | ||
bt('{a:{a:b},c}', '{\n a: {\n a: b\n },\n c\n}'); | ||
bt('if (foo) one()\ntwo()\nthree()'); | ||
bt('if (1 + foo() && bar(baz()) / 2) one()\ntwo()\nthree()'); | ||
bt('if (1 + foo() && bar(baz()) / 2) one();\ntwo();\nthree();'); | ||
bt('{[y[a]];keep_indent;}', '{\n [y[a]];\n keep_indent;\n}'); | ||
opts.indent_size = 1; | ||
opts.indent_char = ' '; | ||
bt('{ one_char() }', "{\n one_char()\n}"); | ||
bt('if (x) {y} else { if (x) {y}}', 'if (x) {\n y\n} else {\n if (x) {\n y\n }\n}'); | ||
bt('var a,b=1,c=2', 'var a, b = 1,\n c = 2'); | ||
bt('if (foo) one()\ntwo()\nthree()'); | ||
bt('if (1 + foo() && bar(baz()) / 2) one()\ntwo()\nthree()'); | ||
bt('if (1 + foo() && bar(baz()) / 2) one();\ntwo();\nthree();'); | ||
opts.indent_size = 4; | ||
opts.indent_char = ' '; | ||
bt('{ one_char() }', "{\n one_char()\n}"); | ||
opts.indent_size = 1; | ||
opts.indent_char = ' '; | ||
bt('{ one_char() }', "{\n one_char()\n}"); | ||
opts.indent_size = 1; | ||
opts.indent_char = "\t"; | ||
bt('{ one_char() }', "{\n\tone_char()\n}"); | ||
bt('x = a ? b : c; x;', 'x = a ? b : c;\nx;'); | ||
bt('var a,b=1,c=2', 'var a, b = 1,\n c = 2'); | ||
opts.indent_size = 4; | ||
opts.indent_char = ' '; | ||
opts.indent_size = 4; | ||
opts.indent_char = ' '; | ||
bt('{ one_char() }', "{\n one_char()\n}"); | ||
opts.preserve_newlines = false; | ||
opts.indent_size = 1; | ||
opts.indent_char = "\t"; | ||
bt('{ one_char() }', "{\n\tone_char()\n}"); | ||
bt('x = a ? b : c; x;', 'x = a ? b : c;\nx;'); | ||
bt('var\na=dont_preserve_newlines;', 'var a = dont_preserve_newlines;'); | ||
opts.indent_size = 4; | ||
opts.indent_char = ' '; | ||
// make sure the blank line between function definitions stays | ||
// even when preserve_newlines = false | ||
bt('function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'); | ||
bt('function foo() {\n return 1;\n}\nfunction foo() {\n return 1;\n}', | ||
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}' | ||
); | ||
bt('function foo() {\n return 1;\n}\n\n\nfunction foo() {\n return 1;\n}', | ||
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}' | ||
); | ||
opts.preserve_newlines = false; | ||
opts.preserve_newlines = true; | ||
bt('var\na=do_preserve_newlines;', 'var\na = do_preserve_newlines;'); | ||
bt('// a\n// b\n\n// c\n// d'); | ||
bt('if (foo) // comment\n{\n bar();\n}'); | ||
bt('var\na=dont_preserve_newlines;', 'var a = dont_preserve_newlines;'); | ||
// make sure the blank line between function definitions stays | ||
// even when preserve_newlines = false | ||
bt('function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}'); | ||
bt('function foo() {\n return 1;\n}\nfunction foo() {\n return 1;\n}', | ||
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}' | ||
); | ||
bt('function foo() {\n return 1;\n}\n\n\nfunction foo() {\n return 1;\n}', | ||
'function foo() {\n return 1;\n}\n\nfunction foo() {\n return 1;\n}' | ||
); | ||
opts.keep_array_indentation = true; | ||
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f']"); | ||
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']"); | ||
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']"); | ||
opts.preserve_newlines = true; | ||
bt('var\na=do_preserve_newlines;', 'var\na = do_preserve_newlines;'); | ||
bt('// a\n// b\n\n// c\n// d'); | ||
bt('if (foo) // comment\n{\n bar();\n}'); | ||
bt('var x = [{}\n]', 'var x = [{}\n]'); | ||
bt('var x = [{foo:bar}\n]', 'var x = [{\n foo: bar\n }\n]'); | ||
bt("a = ['something',\n 'completely',\n 'different'];\nif (x);"); | ||
bt("a = ['a','b','c']", "a = ['a', 'b', 'c']"); | ||
bt("a = ['a', 'b','c']", "a = ['a', 'b', 'c']"); | ||
opts.keep_array_indentation = true; | ||
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f']"); | ||
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']"); | ||
bt("a = ['a', 'b', 'c',\n 'd', 'e', 'f',\n 'g', 'h', 'i']"); | ||
bt("x = [{'a':0}]", "x = [{\n 'a': 0\n }]"); | ||
bt('{a([[a1]], {b;});}', '{\n a([[a1]], {\n b;\n });\n}'); | ||
bt('var x = [{}\n]', 'var x = [{}\n]'); | ||
bt('var x = [{foo:bar}\n]', 'var x = [{\n foo: bar\n }\n]'); | ||
bt("a = ['something',\n 'completely',\n 'different'];\nif (x);"); | ||
bt("a = ['a','b','c']", "a = ['a', 'b', 'c']"); | ||
bt("a = ['a', 'b','c']", "a = ['a', 'b', 'c']"); | ||
bt('a = //comment\n/regex/;'); | ||
bt("x = [{'a':0}]", "x = [{\n 'a': 0\n }]"); | ||
test_fragment('/*\n * X\n */'); | ||
test_fragment('/*\r\n * X\r\n */', '/*\n * X\n */'); | ||
bt('{a([[a1]], {b;});}', '{\n a([[a1]], {\n b;\n });\n}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}'); | ||
bt('a = //comment\n/regex/;'); | ||
test_fragment('/*\n * X\n */'); | ||
test_fragment('/*\r\n * X\r\n */', '/*\n * X\n */'); | ||
opts.brace_style = 'expand'; | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}'); | ||
test_fragment('if (foo) {', 'if (foo)\n{'); | ||
test_fragment('foo {', 'foo\n{'); | ||
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report. | ||
test_fragment('return /* inline */ {', 'return /* inline */ {'); | ||
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway. | ||
test_fragment('return;\n{', 'return;\n{'); | ||
bt("throw {}"); | ||
bt("throw {\n foo;\n}"); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}'); | ||
bt('var foo = {}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}'); | ||
test_fragment('if (foo) {', 'if (foo)\n{'); | ||
test_fragment('foo {', 'foo\n{'); | ||
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report. | ||
test_fragment('return /* inline */ {', 'return /* inline */ {'); | ||
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway. | ||
test_fragment('return;\n{', 'return;\n{'); | ||
opts.brace_style = 'expand'; | ||
bt('//case 1\nif (a == 1)\n{}\n//case 2\nelse if (a == 2)\n{}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}'); | ||
test_fragment('if (foo) {', 'if (foo)\n{'); | ||
test_fragment('foo {', 'foo\n{'); | ||
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report. | ||
test_fragment('return /* inline */ {', 'return /* inline */ {'); | ||
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway. | ||
test_fragment('return;\n{', 'return;\n{'); | ||
bt("throw {}"); | ||
bt("throw {\n foo;\n}"); | ||
opts.brace_style = 'collapse'; | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}'); | ||
bt('var foo = {}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a)\n{\n b;\n}\nelse\n{\n c;\n}'); | ||
test_fragment('if (foo) {', 'if (foo)\n{'); | ||
test_fragment('foo {', 'foo\n{'); | ||
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report. | ||
test_fragment('return /* inline */ {', 'return /* inline */ {'); | ||
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway. | ||
test_fragment('return;\n{', 'return;\n{'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}'); | ||
test_fragment('if (foo) {', 'if (foo) {'); | ||
test_fragment('foo {', 'foo {'); | ||
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report. | ||
test_fragment('return /* inline */ {', 'return /* inline */ {'); | ||
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway. | ||
test_fragment('return;\n{', 'return; {'); | ||
bt('if (foo) bar();\nelse break'); | ||
bt('function x() {\n foo();\n}zzz', 'function x() {\n foo();\n}\nzzz'); | ||
bt('a: do {} while (); xxx', 'a: do {} while ();\nxxx'); | ||
opts.brace_style = 'collapse'; | ||
bt('var a = new function();'); | ||
test_fragment('new function'); | ||
bt('//case 1\nif (a == 1) {}\n//case 2\nelse if (a == 2) {}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n} else {\n c;\n}'); | ||
test_fragment('if (foo) {', 'if (foo) {'); | ||
test_fragment('foo {', 'foo {'); | ||
test_fragment('return {', 'return {'); // return needs the brace. maybe something else as well: feel free to report. | ||
test_fragment('return /* inline */ {', 'return /* inline */ {'); | ||
// test_fragment('return\n{', 'return\n{'); // can't support this?, but that's an improbable and extreme case anyway. | ||
test_fragment('return;\n{', 'return; {'); | ||
opts.brace_style = "end-expand"; | ||
bt('if (foo) bar();\nelse break'); | ||
bt('function x() {\n foo();\n}zzz', 'function x() {\n foo();\n}\nzzz'); | ||
bt('a: do {} while (); xxx', 'a: do {} while ();\nxxx'); | ||
bt('if(1){2}else{3}', "if (1) {\n 2\n}\nelse {\n 3\n}"); | ||
bt('try{a();}catch(b){c();}finally{d();}', "try {\n a();\n}\ncatch (b) {\n c();\n}\nfinally {\n d();\n}"); | ||
bt('if(a){b();}else if(c) foo();', "if (a) {\n b();\n}\nelse if (c) foo();"); | ||
bt("if (a) {\n// comment\n}else{\n// comment\n}", "if (a) {\n // comment\n}\nelse {\n // comment\n}"); // if/else statement with empty body | ||
bt('if (x) {y} else { if (x) {y}}', 'if (x) {\n y\n}\nelse {\n if (x) {\n y\n }\n}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n}\nelse {\n c;\n}'); | ||
bt('var a = new function();'); | ||
test_fragment('new function'); | ||
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo) {\n bar();\n}', ' /*\n * xx\n */\n // xx\n if (foo) {\n bar();\n }'); | ||
opts.brace_style = "end-expand"; | ||
bt('if (foo) {}\nelse /regex/.test();'); | ||
bt('if (foo) /regex/.test();'); | ||
bt('//case 1\nif (a == 1) {}\n//case 2\nelse if (a == 2) {}'); | ||
bt('if(1){2}else{3}', "if (1) {\n 2\n}\nelse {\n 3\n}"); | ||
bt('try{a();}catch(b){c();}finally{d();}', "try {\n a();\n}\ncatch (b) {\n c();\n}\nfinally {\n d();\n}"); | ||
bt('if(a){b();}else if(c) foo();', "if (a) {\n b();\n}\nelse if (c) foo();"); | ||
bt("if (a) {\n// comment\n}else{\n// comment\n}", "if (a) {\n // comment\n}\nelse {\n // comment\n}"); // if/else statement with empty body | ||
bt('if (x) {y} else { if (x) {y}}', 'if (x) {\n y\n}\nelse {\n if (x) {\n y\n }\n}'); | ||
bt('if (a)\n{\nb;\n}\nelse\n{\nc;\n}', 'if (a) {\n b;\n}\nelse {\n c;\n}'); | ||
bt('a = <?= external() ?> ;'); // not the most perfect thing in the world, but you're the weirdo beaufifying php mix-ins with javascript beautifier | ||
bt('a = <%= external() %> ;'); | ||
test_fragment(' /*\n* xx\n*/\n// xx\nif (foo) {\n bar();\n}', ' /*\n * xx\n */\n // xx\n if (foo) {\n bar();\n }'); | ||
bt('// func-comment\n\nfunction foo() {}\n\n// end-func-comment'); | ||
bt('if (foo) {}\nelse /regex/.test();'); | ||
bt('if (foo) /regex/.test();'); | ||
test_fragment('roo = {\n /*\n ****\n FOO\n ****\n */\n BAR: 0\n};'); | ||
bt('a = <?= external() ?> ;'); // not the most perfect thing in the world, but you're the weirdo beaufifying php mix-ins with javascript beautifier | ||
bt('a = <%= external() %> ;'); | ||
bt('"foo""bar""baz"', '"foo"\n"bar"\n"baz"'); | ||
bt("'foo''bar''baz'", "'foo'\n'bar'\n'baz'"); | ||
bt('// func-comment\n\nfunction foo() {}\n\n// end-func-comment'); | ||
test_fragment('roo = {\n /*\n ****\n FOO\n ****\n */\n BAR: 0\n};'); | ||
test_fragment("if (zz) {\n // ....\n}\n(function"); | ||
bt('"foo""bar""baz"', '"foo"\n"bar"\n"baz"'); | ||
bt("'foo''bar''baz'", "'foo'\n'bar'\n'baz'"); | ||
bt("{\n get foo() {}\n}"); | ||
bt("{\n var a = get\n foo();\n}"); | ||
bt("{\n set foo() {}\n}"); | ||
bt("{\n var a = set\n foo();\n}"); | ||
bt("var x = {\n get function()\n}"); | ||
bt("var x = {\n set function()\n}"); | ||
bt("var x = set\n\nfunction() {}", "var x = set\n\n function() {}"); | ||
bt('<!-- foo\nbar();\n-->'); | ||
bt('<!-- dont crash'); | ||
bt('for () /abc/.test()'); | ||
bt('if (k) /aaa/m.test(v) && l();'); | ||
bt('switch (true) {\n case /swf/i.test(foo):\n bar();\n}'); | ||
bt('createdAt = {\n type: Date,\n default: Date.now\n}'); | ||
bt('switch (createdAt) {\n case a:\n Date,\n default:\n Date.now\n}'); | ||
opts.space_before_conditional = false; | ||
bt('if(a) b()'); | ||
opts.space_before_conditional = true; | ||
test_fragment("if (zz) {\n // ....\n}\n(function"); | ||
bt("{\n get foo() {}\n}"); | ||
bt("{\n var a = get\n foo();\n}"); | ||
bt("{\n set foo() {}\n}"); | ||
bt("{\n var a = set\n foo();\n}"); | ||
bt("var x = {\n get function()\n}"); | ||
bt("var x = {\n set function()\n}"); | ||
bt("var x = set\n\nfunction() {}", "var x = set\n\n function() {}"); | ||
opts.preserve_newlines = true; | ||
bt('var a = 42; // foo\n\nvar b;'); | ||
bt('var a = 42; // foo\n\n\nvar b;'); | ||
bt("var a = 'foo' +\n 'bar';"); | ||
bt("var a = \"foo\" +\n \"bar\";"); | ||
bt('<!-- foo\nbar();\n-->'); | ||
bt('<!-- dont crash'); | ||
bt('for () /abc/.test()'); | ||
bt('if (k) /aaa/m.test(v) && l();'); | ||
bt('switch (true) {\n case /swf/i.test(foo):\n bar();\n}'); | ||
bt('createdAt = {\n type: Date,\n default: Date.now\n}'); | ||
bt('switch (createdAt) {\n case a:\n Date,\n default:\n Date.now\n}'); | ||
opts.space_before_conditional = false; | ||
bt('if(a) b()'); | ||
opts.space_before_conditional = true; | ||
opts.unescape_strings = false; | ||
test_fragment('"\\x22\\x27", \'\\x22\\x27\', "\\x5c", \'\\x5c\', "\\xff and \\xzz", "unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"'); | ||
opts.unescape_strings = true; | ||
test_fragment('"\\x20\\x40\\x4a"', '" @J"'); | ||
test_fragment('"\\xff\\x40\\x4a"'); | ||
test_fragment('"\\u0072\\u016B\\u0137\\u012B\\u0074\\u0069\\u0073"', '"rūķītis"'); | ||
test_fragment('"Google Chrome est\\u00E1 actualizado."', '"Google Chrome está actualizado."'); | ||
/* | ||
bt('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff and \\xzz","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"', | ||
'"\\"\'", \'"\\\'\', "\\\\", \'\\\\\', "\\xff and \\xzz", "unicode \\u0000 \\" \' \\\\ \\uffff \\uzzzz"'); | ||
*/ | ||
opts.unescape_strings = false; | ||
bt('foo = {\n x: y, // #44\n w: z // #44\n}'); | ||
bt('return function();'); | ||
bt('var a = function();'); | ||
bt('var a = 5 + function();'); | ||
opts.preserve_newlines = true; | ||
bt('var a = 42; // foo\n\nvar b;'); | ||
bt('var a = 42; // foo\n\n\nvar b;'); | ||
bt("var a = 'foo' +\n 'bar';"); | ||
bt("var a = \"foo\" +\n \"bar\";"); | ||
bt('3.*7;', '3. * 7;'); | ||
bt('import foo.*;', 'import foo.*;'); // actionscript's import | ||
test_fragment('function f(a: a, b: b)'); // actionscript | ||
opts.unescape_strings = false; | ||
test_fragment('"\\x22\\x27", \'\\x22\\x27\', "\\x5c", \'\\x5c\', "\\xff and \\xzz", "unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"'); | ||
opts.unescape_strings = true; | ||
test_fragment('"\\x20\\x40\\x4a"', '" @J"'); | ||
test_fragment('"\\xff\\x40\\x4a"'); | ||
test_fragment('"\\u0072\\u016B\\u0137\\u012B\\u0074\\u0069\\u0073"', '"rūķītis"'); | ||
test_fragment('"Google Chrome est\\u00E1 actualizado."', '"Google Chrome está actualizado."'); | ||
/* | ||
bt('"\\x22\\x27",\'\\x22\\x27\',"\\x5c",\'\\x5c\',"\\xff and \\xzz","unicode \\u0000 \\u0022 \\u0027 \\u005c \\uffff \\uzzzz"', | ||
'"\\"\'", \'"\\\'\', "\\\\", \'\\\\\', "\\xff and \\xzz", "unicode \\u0000 \\" \' \\\\ \\uffff \\uzzzz"'); | ||
*/ | ||
opts.unescape_strings = false; | ||
bt('foo = {\n x: y, // #44\n w: z // #44\n}'); | ||
bt('{\n foo // something\n ,\n bar // something\n baz\n}'); | ||
bt('function a(a) {} function b(b) {} function c(c) {}', 'function a(a) {}\nfunction b(b) {}\nfunction c(c) {}'); | ||
bt('foo(a, function() {})'); | ||
bt('return function();'); | ||
bt('var a = function();'); | ||
bt('var a = 5 + function();'); | ||
bt('foo(a, /regex/)'); | ||
bt('3.*7;', '3. * 7;'); | ||
bt('import foo.*;', 'import foo.*;'); // actionscript's import | ||
test_fragment('function f(a: a, b: b)'); // actionscript | ||
bt('/* foo */\n"x"'); | ||
bt('{\n foo // something\n ,\n bar // something\n baz\n}'); | ||
bt('function a(a) {} function b(b) {} function c(c) {}', 'function a(a) {}\nfunction b(b) {}\nfunction c(c) {}'); | ||
bt('foo(a, function() {})'); | ||
opts.break_chained_methods = false; | ||
opts.preserve_newlines = false; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar().baz().cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()'); | ||
bt('foo(a, /regex/)'); | ||
opts.break_chained_methods = false; | ||
opts.preserve_newlines = true; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz().cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()'); | ||
bt('/* foo */\n"x"'); | ||
opts.break_chained_methods = true; | ||
opts.preserve_newlines = false; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()'); | ||
opts.break_chained_methods = false; | ||
opts.preserve_newlines = false; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar().baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar().baz().cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()'); | ||
opts.break_chained_methods = true; | ||
opts.preserve_newlines = true; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()'); | ||
opts.break_chained_methods = false; | ||
opts.preserve_newlines = true; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat);\nfoo.bar().baz().cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz().cucumber(fat)\nfoo.bar().baz().cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz().cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()'); | ||
opts.break_chained_methods = false; | ||
opts.break_chained_methods = true; | ||
opts.preserve_newlines = false; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo.bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this.something = foo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this.something.xxx = foo.moo.bar()'); | ||
opts.preserve_newlines = false; | ||
opts.wrap_line_length = 0; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();'); | ||
opts.break_chained_methods = true; | ||
opts.preserve_newlines = true; | ||
bt('foo\n.bar()\n.baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat);\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('foo\n.bar()\n.baz().cucumber(fat)\n foo.bar().baz().cucumber(fat)', 'foo\n .bar()\n .baz()\n .cucumber(fat)\nfoo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this\n.something = foo.bar()\n.baz().cucumber(fat)', 'this\n .something = foo.bar()\n .baz()\n .cucumber(fat)'); | ||
bt('this.something.xxx = foo.moo.bar()'); | ||
bt('this\n.something\n.xxx = foo.moo\n.bar()', 'this\n .something\n .xxx = foo.moo\n .bar()'); | ||
opts.wrap_line_length = 70; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();'); | ||
opts.break_chained_methods = false; | ||
opts.wrap_line_length = 40; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat &&\n' + | ||
' "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_.okay();'); | ||
opts.preserve_newlines = false; | ||
opts.wrap_line_length = 0; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();'); | ||
opts.wrap_line_length = 41; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_.okay();'); | ||
opts.wrap_line_length = 70; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_.okay();'); | ||
opts.wrap_line_length = 45; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
' if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' + | ||
'}', | ||
/* expected */ | ||
'{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
' if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_.okay();\n' + | ||
'}'); | ||
opts.wrap_line_length = 40; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat &&\n' + | ||
' "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_.okay();'); | ||
opts.preserve_newlines = true; | ||
opts.wrap_line_length = 0; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.wrap_line_length = 41; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_.okay();'); | ||
opts.wrap_line_length = 70; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.wrap_line_length = 45; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
' if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' + | ||
'}', | ||
/* expected */ | ||
'{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
' if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_.okay();\n' + | ||
'}'); | ||
opts.preserve_newlines = true; | ||
opts.wrap_line_length = 0; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.wrap_line_length = 40; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat &&\n' + | ||
' "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.wrap_line_length = 70; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.wrap_line_length = 41; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.wrap_line_length = 45; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
' if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' + | ||
'}', | ||
/* expected */ | ||
'{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
' if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_\n' + | ||
' .okay();\n' + | ||
'}'); | ||
opts.wrap_line_length = 40; | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat &&\n' + | ||
' "sassy") || (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.wrap_line_length = 0; | ||
opts.wrap_line_length = 41; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
'if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();', | ||
/* expected */ | ||
'foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
'Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
'if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_\n' + | ||
' .okay();'); | ||
opts.preserve_newlines = false; | ||
bt('if (foo) // comment\n bar();'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n /asdf/;'); | ||
opts.wrap_line_length = 45; | ||
// NOTE: wrap is only best effort - line continues until next wrap point is found. | ||
//.............---------1---------2---------3---------4---------5---------6---------7 | ||
//.............1234567890123456789012345678901234567890123456789012345678901234567890 | ||
test_fragment('{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") || (leans\n&& mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n.but_this_can\n' + | ||
' if (wraps_can_occur && inside_an_if_block) that_is_\n.okay();\n' + | ||
'}', | ||
/* expected */ | ||
'{\n' + | ||
' foo.bar().baz().cucumber((fat && "sassy") ||\n' + | ||
' (leans && mean));\n' + | ||
' Test_very_long_variable_name_this_should_never_wrap\n' + | ||
' .but_this_can\n' + | ||
' if (wraps_can_occur &&\n' + | ||
' inside_an_if_block) that_is_\n' + | ||
' .okay();\n' + | ||
'}'); | ||
// these aren't ready yet. | ||
//bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();'); | ||
opts.wrap_line_length = 0; | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();', 'if (foo) if (bar) if (baz) whee();\na();'); | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();', 'if (foo) if (bar) if (baz) whee();\n else a();'); | ||
bt('if (foo)\nbar();\nelse\ncar();', 'if (foo) bar();\nelse car();'); | ||
opts.preserve_newlines = false; | ||
bt('if (foo) // comment\n bar();'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n /asdf/;'); | ||
bt('if (foo) if (bar) if (baz) whee();\na();'); | ||
bt('if (foo) a()\nif (bar) if (baz) whee();\na();'); | ||
bt('if (options)\n' + | ||
' for (var p in options)\n' + | ||
' this[p] = options[p];', | ||
'if (options) for (var p in options) this[p] = options[p];'); | ||
// these aren't ready yet. | ||
//bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();'); | ||
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
// This is not valid syntax, but still want to behave reasonably and not side-effect | ||
bt('(if(a) b())(if(a) b())', | ||
'(\nif (a) b())(\nif (a) b())'); | ||
bt('(if(a) b())\n\n\n(if(a) b())', | ||
'(\nif (a) b())\n(\nif (a) b())'); | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();', 'if (foo) if (bar) if (baz) whee();\na();'); | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();', 'if (foo) if (bar) if (baz) whee();\n else a();'); | ||
bt('if (foo)\nbar();\nelse\ncar();', 'if (foo) bar();\nelse car();'); | ||
bt('if (foo) if (bar) if (baz) whee();\na();'); | ||
bt('if (foo) a()\nif (bar) if (baz) whee();\na();'); | ||
bt('if (options)\n' + | ||
' for (var p in options)\n' + | ||
' this[p] = options[p];', | ||
'if (options) for (var p in options) this[p] = options[p];'); | ||
bt('function f(a, b, c,\nd, e) {}', | ||
'function f(a, b, c, d, e) {}'); | ||
bt("if\n(a)\nb();", "if (a) b();"); | ||
bt('var a =\nfoo', 'var a = foo'); | ||
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}"); | ||
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}"); | ||
bt('var a = /*i*/ "b";'); | ||
bt('var a = /*i*/\n"b";', 'var a = /*i*/ "b";'); | ||
bt('var a = /*i*/\nb;', 'var a = /*i*/ b;'); | ||
bt('{\n\n\n"x"\n}', '{\n "x"\n}'); | ||
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a && b || c || d && e) e = f'); | ||
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a && (b || c || d) && e) e = f'); | ||
test_fragment('\n\n"x"', '"x"'); | ||
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\n\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
opts.preserve_newlines = true; | ||
bt('if (foo) // comment\n bar();'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n /asdf/;'); | ||
// This is not valid syntax, but still want to behave reasonably and not side-effect | ||
bt('(if(a) b())(if(a) b())', | ||
'(\nif (a) b())(\nif (a) b())'); | ||
bt('(if(a) b())\n\n\n(if(a) b())', | ||
'(\nif (a) b())\n(\nif (a) b())'); | ||
// these aren't ready yet. | ||
// bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();'); | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();', 'if (foo)\n if (bar)\n if (baz)\n whee();\na();'); | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();', 'if (foo)\n if (bar)\n if (baz)\n whee();\n else\n a();'); | ||
bt('if (foo) bar();\nelse\ncar();', 'if (foo) bar();\nelse\n car();'); | ||
bt('if (foo) if (bar) if (baz) whee();\na();'); | ||
bt('if (foo) a()\nif (bar) if (baz) whee();\na();'); | ||
bt('if (options)\n' + | ||
' for (var p in options)\n' + | ||
' this[p] = options[p];'); | ||
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\n\n\n\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
// This is not valid syntax, but still want to behave reasonably and not side-effect | ||
bt('(if(a) b())(if(a) b())', | ||
'(\nif (a) b())(\nif (a) b())'); | ||
bt('(if(a) b())\n\n\n(if(a) b())', | ||
'(\nif (a) b())\n\n\n(\nif (a) b())'); | ||
bt("if\n(a)\nb();", "if (a) b();"); | ||
bt('var a =\nfoo', 'var a = foo'); | ||
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}"); | ||
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}"); | ||
bt('var a = /*i*/ "b";'); | ||
bt('var a = /*i*/\n"b";', 'var a = /*i*/ "b";'); | ||
bt('var a = /*i*/\nb;', 'var a = /*i*/ b;'); | ||
bt('{\n\n\n"x"\n}', '{\n "x"\n}'); | ||
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a && b || c || d && e) e = f'); | ||
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a && (b || c || d) && e) e = f'); | ||
test_fragment('\n\n"x"', '"x"'); | ||
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;', | ||
'a = 1;\nb = 2;'); | ||
opts.preserve_newlines = true; | ||
bt('if (foo) // comment\n bar();'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n (bar());'); | ||
bt('if (foo) // comment\n /asdf/;'); | ||
bt("if\n(a)\nb();", "if (a)\n b();"); | ||
bt('var a =\nfoo', 'var a =\n foo'); | ||
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}"); | ||
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}"); | ||
bt('var a = /*i*/ "b";'); | ||
bt('var a = /*i*/\n"b";', 'var a = /*i*/\n "b";'); | ||
bt('var a = /*i*/\nb;', 'var a = /*i*/\n b;'); | ||
bt('{\n\n\n"x"\n}', '{\n\n\n "x"\n}'); | ||
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a &&\n b ||\n c || d &&\n e) e = f'); | ||
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a &&\n (b ||\n c || d) &&\n e) e = f'); | ||
test_fragment('\n\n"x"', '"x"'); | ||
Urlencoded.run_tests(sanitytest); | ||
// these aren't ready yet. | ||
// bt('if (foo) // comment\n bar() /*i*/ + baz() /*j\n*/ + asdf();'); | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\na();', 'if (foo)\n if (bar)\n if (baz)\n whee();\na();'); | ||
bt('if\n(foo)\nif\n(bar)\nif\n(baz)\nwhee();\nelse\na();', 'if (foo)\n if (bar)\n if (baz)\n whee();\n else\n a();'); | ||
bt('if (foo) bar();\nelse\ncar();', 'if (foo) bar();\nelse\n car();'); | ||
return sanitytest; | ||
} | ||
bt('if (foo) if (bar) if (baz) whee();\na();'); | ||
bt('if (foo) a()\nif (bar) if (baz) whee();\na();'); | ||
bt('if (options)\n' + | ||
' for (var p in options)\n' + | ||
' this[p] = options[p];'); | ||
if (isNode) { | ||
module.exports = run_beautifier_tests; | ||
bt('function f(a, b, c,\nd, e) {}', | ||
'function f(a, b, c,\n d, e) {}'); | ||
// http://nodejs.org/api/modules.html#modules_accessing_the_main_module | ||
if (require.main === module) { | ||
console.log(run_beautifier_tests().results_raw()); | ||
bt('function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
bt('function f(a,b) {if(a) b()}\n\n\n\nfunction g(a,b) {if(!a) b()}', | ||
'function f(a, b) {\n if (a) b()\n}\n\n\n\nfunction g(a, b) {\n if (!a) b()\n}'); | ||
// This is not valid syntax, but still want to behave reasonably and not side-effect | ||
bt('(if(a) b())(if(a) b())', | ||
'(\nif (a) b())(\nif (a) b())'); | ||
bt('(if(a) b())\n\n\n(if(a) b())', | ||
'(\nif (a) b())\n\n\n(\nif (a) b())'); | ||
bt("if\n(a)\nb();", "if (a)\n b();"); | ||
bt('var a =\nfoo', 'var a =\n foo'); | ||
bt('var a = {\n"a":1,\n"b":2}', "var a = {\n \"a\": 1,\n \"b\": 2\n}"); | ||
bt("var a = {\n'a':1,\n'b':2}", "var a = {\n 'a': 1,\n 'b': 2\n}"); | ||
bt('var a = /*i*/ "b";'); | ||
bt('var a = /*i*/\n"b";', 'var a = /*i*/\n "b";'); | ||
bt('var a = /*i*/\nb;', 'var a = /*i*/\n b;'); | ||
bt('{\n\n\n"x"\n}', '{\n\n\n "x"\n}'); | ||
bt('if(a &&\nb\n||\nc\n||d\n&&\ne) e = f', 'if (a &&\n b ||\n c || d &&\n e) e = f'); | ||
bt('if(a &&\n(b\n||\nc\n||d)\n&&\ne) e = f', 'if (a &&\n (b ||\n c || d) &&\n e) e = f'); | ||
test_fragment('\n\n"x"', '"x"'); | ||
// this beavior differs between js and python, defaults to unlimited in js, 10 in python | ||
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;', | ||
'a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;'); | ||
opts.max_preserve_newlines = 8; | ||
bt('a = 1;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nb = 2;', | ||
'a = 1;\n\n\n\n\n\n\n\nb = 2;'); | ||
Urlencoded.run_tests(sanitytest); | ||
return sanitytest; | ||
} | ||
return beautifier_tests(); | ||
} | ||
if (typeof exports !== "undefined") { | ||
exports.run_beautifier_tests = run_beautifier_tests; | ||
} |
@@ -32,2 +32,5 @@ // | ||
this.get_exitcode = function() { | ||
return n_succeeded === 0 || n_failed !== 0 ? 1 : 0; | ||
}; | ||
@@ -34,0 +37,0 @@ this.expect = function(parameters, expected_value) { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
159396
18
3250
0
171
1
1