diff options
author | kzc <zaxxon2011@gmail.com> | 2016-04-25 00:42:18 -0400 |
---|---|---|
committer | Richard van Velzen <rvanvelzen@experty.com> | 2016-05-04 20:02:29 +0200 |
commit | f39fd3d58384d9bafbd18d3c1ec927940eeba458 (patch) | |
tree | 9fce3733db15d020f9d5dfe5323930327a06f1e1 | |
parent | 65887d9a56d8f3eb1e75cd924b4fd2c9065d0e11 (diff) | |
download | tracifyjs-f39fd3d58384d9bafbd18d3c1ec927940eeba458.tar.gz tracifyjs-f39fd3d58384d9bafbd18d3c1ec927940eeba458.zip |
Handle CR line endings in comments.
Fixes #1050
-rw-r--r-- | lib/parse.js | 14 | ||||
-rw-r--r-- | test/mocha/line-endings.js | 34 |
2 files changed, 46 insertions, 2 deletions
diff --git a/lib/parse.js b/lib/parse.js index 18d071f3..be103b67 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -255,6 +255,16 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { return S.text.substr(S.pos, str.length) == str; }; + function find_eol() { + var text = S.text; + for (var i = S.pos, n = S.text.length; i < n; ++i) { + var ch = text[i]; + if (ch == '\n' || ch == '\r') + return i; + } + return -1; + }; + function find(what, signal_eof) { var pos = S.text.indexOf(what, S.pos); if (signal_eof && pos == -1) throw EX_EOF; @@ -410,7 +420,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { function skip_line_comment(type) { var regex_allowed = S.regex_allowed; - var i = find("\n"), ret; + var i = find_eol(), ret; if (i == -1) { ret = S.text.substr(S.pos); S.pos = S.text.length; @@ -427,7 +437,7 @@ function tokenizer($TEXT, filename, html5_comments, shebang) { var skip_multiline_comment = with_eof_error("Unterminated multiline comment", function(){ var regex_allowed = S.regex_allowed; var i = find("*/", true); - var text = S.text.substring(S.pos, i); + var text = S.text.substring(S.pos, i).replace(/\r\n|\r/g, '\n'); var a = text.split("\n"), n = a.length; // update stream position S.pos = i + 2; diff --git a/test/mocha/line-endings.js b/test/mocha/line-endings.js new file mode 100644 index 00000000..8fd56a19 --- /dev/null +++ b/test/mocha/line-endings.js @@ -0,0 +1,34 @@ +var Uglify = require('../../'); +var assert = require("assert"); + +describe("line-endings", function() { + var options = { + fromString: true, + mangle: false, + compress: false, + output: { + beautify: false, + comments: /^!/, + } + }; + var expected_code = '/*!one\n2\n3*/\nfunction f(x){if(x)return 3}'; + + it("Should parse LF line endings", function() { + var js = '/*!one\n2\n3*///comment\nfunction f(x) {\n if (x)\n//comment\n return 3;\n}\n'; + var result = Uglify.minify(js, options); + assert.strictEqual(result.code, expected_code); + }); + + it("Should parse CR/LF line endings", function() { + var js = '/*!one\r\n2\r\n3*///comment\r\nfunction f(x) {\r\n if (x)\r\n//comment\r\n return 3;\r\n}\r\n'; + var result = Uglify.minify(js, options); + assert.strictEqual(result.code, expected_code); + }); + + it("Should parse CR line endings", function() { + var js = '/*!one\r2\r3*///comment\rfunction f(x) {\r if (x)\r//comment\r return 3;\r}\r'; + var result = Uglify.minify(js, options); + assert.strictEqual(result.code, expected_code); + }); +}); + |