From 21f039e775660a07f4570181acd40639105d498f Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 9 Oct 2014 14:24:04 +1100 Subject: [PATCH] add support for unicode regexes - closes #11 --- README.md | 2 ++ lib/6to5/transform.js | 3 ++- lib/6to5/transformers/unicode-regex.js | 15 +++++++++++++++ package.json | 3 ++- test/fixtures/unicode-regex/basic/actual.js | 2 ++ test/fixtures/unicode-regex/basic/expected.js | 2 ++ 6 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 lib/6to5/transformers/unicode-regex.js create mode 100644 test/fixtures/unicode-regex/basic/actual.js create mode 100644 test/fixtures/unicode-regex/basic/expected.js diff --git a/README.md b/README.md index 9d5ab54abc..2fb2812cfc 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ It's as easy as: - [Rest parameters](FEATURES.md#rest-parameters) - [Spread](FEATURES.md#spread) - [Template literals](FEATURES.md#template-literals) + - [Unicode Regex](FEATURES.md#unicode-regex) To be implemented: @@ -243,6 +244,7 @@ limitations in ES5 implementations. | Rest parameters | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | | Spread | ✓ | ✓ | ✓ | ✓ | ✓ | | | Template literals | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Unicode regex | ✓ | ✓ | | ✓ | ✓ | | #### Performance diff --git a/lib/6to5/transform.js b/lib/6to5/transform.js index 4551c97844..4c185f21af 100644 --- a/lib/6to5/transform.js +++ b/lib/6to5/transform.js @@ -107,5 +107,6 @@ transform.transformers = { blockBinding: require("./transformers/block-binding"), modules: require("./transformers/modules"), restParameters: require("./transformers/rest-parameters"), - forOf: require("./transformers/for-of") + forOf: require("./transformers/for-of"), + unicodeRegex: require("./transformers/unicode-regex") }; diff --git a/lib/6to5/transformers/unicode-regex.js b/lib/6to5/transformers/unicode-regex.js new file mode 100644 index 0000000000..116bd07d60 --- /dev/null +++ b/lib/6to5/transformers/unicode-regex.js @@ -0,0 +1,15 @@ +var regexpu = require("regexpu"); +var b = require("ast-types").builders; +var _ = require("lodash"); + +exports.Literal = function (node) { + var regex = node.regex; + if (!regex) return; + + var flags = regex.flags.split("") + if (!_.contains(regex.flags, "u")) return; + _.pull(flags, "u"); + + var pattern = regexpu.rewritePattern(regex.pattern, regex.flags); + return b.literal(new RegExp(pattern, flags.join(""))); +}; diff --git a/package.json b/package.json index 973399efb8..6d9e4707bc 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "lodash": "2.4.1", "mkdirp": "0.5.0", "es6-shim": "^0.18.0", - "es6-symbol": "^0.1.1" + "es6-symbol": "^0.1.1", + "regexpu": "^0.2.2" }, "devDependencies": { "es6-transpiler": "0.7.17", diff --git a/test/fixtures/unicode-regex/basic/actual.js b/test/fixtures/unicode-regex/basic/actual.js new file mode 100644 index 0000000000..0b4203cf17 --- /dev/null +++ b/test/fixtures/unicode-regex/basic/actual.js @@ -0,0 +1,2 @@ +var string = 'foo💩bar'; +var match = string.match(/foo(.)bar/u); diff --git a/test/fixtures/unicode-regex/basic/expected.js b/test/fixtures/unicode-regex/basic/expected.js new file mode 100644 index 0000000000..eb14360984 --- /dev/null +++ b/test/fixtures/unicode-regex/basic/expected.js @@ -0,0 +1,2 @@ +var string = 'foo\uD83D\uDCA9bar'; +var match = string.match(/foo((?:[\0-\t\x0B\f\x0E-\u2027\u202A-\uD7FF\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF]))bar/);