diff --git a/js/src/javascript/tokenizer.js b/js/src/javascript/tokenizer.js index 657955aa..d4e32354 100644 --- a/js/src/javascript/tokenizer.js +++ b/js/src/javascript/tokenizer.js @@ -87,6 +87,8 @@ punct = punct.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); punct = punct.replace(/ /g, '|'); var punct_pattern = new RegExp(punct, 'g'); +var shebang_pattern = /#![^\n\r\u2028\u2029]*(?:\r\n|[\n\r\u2028\u2029])?/g; +var include_pattern = /#include[^\n\r\u2028\u2029]*(?:\r\n|[\n\r\u2028\u2029])?/g; // words which should always start on new line. var line_starters = 'continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,import,export'.split(','); @@ -213,18 +215,23 @@ Tokenizer.prototype._read_non_javascript = function(c) { var resulting_string = ''; if (c === '#') { - c = this._input.next(); + if (this._is_first_token()) { + resulting_string = this._input.read(shebang_pattern); - if (this._is_first_token() && this._input.peek() === '!') { - // shebang - resulting_string = c; - while (this._input.hasNext() && c !== '\n') { - c = this._input.next(); - resulting_string += c; + if (resulting_string) { + return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\n'); } + } + + // handles extendscript #includes + resulting_string = this._input.read(include_pattern); + + if (resulting_string) { return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\n'); } + c = this._input.next(); + // Spidermonkey-specific sharp variables for circular references. Considered obsolete. var sharp = '#'; if (this._input.hasNext() && this._input.testChar(digit)) { diff --git a/js/test/generated/beautify-javascript-tests.js b/js/test/generated/beautify-javascript-tests.js index 0ae75186..70e6d396 100644 --- a/js/test/generated/beautify-javascript-tests.js +++ b/js/test/generated/beautify-javascript-tests.js @@ -5540,6 +5540,21 @@ function run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify, '/* comment */'); test_fragment('#'); test_fragment('#!'); + test_fragment('#include'); + test_fragment('#include "settings.jsxinc"'); + test_fragment( + '#include "settings.jsxinc"\n' + + '\n' + + '\n' + + '/* comment */'); + test_fragment( + '#include "settings.jsxinc"\n' + + '\n' + + '\n' + + '#include "settings.jsxinc"\n' + + '\n' + + '\n' + + '/* comment */'); bt('function namespace::something()'); test_fragment( '