From fa0581cace74de4b5a31e2643167ca0f7274e2c4 Mon Sep 17 00:00:00 2001 From: pswai Date: Thu, 6 Nov 2014 17:22:02 +0800 Subject: [PATCH 1/7] Extracts string for 'translatePlural' filter --- lib/extract.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/extract.js b/lib/extract.js index c33c67f..c878446 100644 --- a/lib/extract.js +++ b/lib/extract.js @@ -16,6 +16,17 @@ var mkAttrRegex = function (startDelim, endDelim) { return new RegExp(start + '\\s*(\'|"|")(.*?)\\1\\s*\\|\\s*translate\\s*(' + end + '|\\|)', 'g'); }; +var mkPluralAttrRegex = function (startDelim, endDelim) { + var start = startDelim.replace(escapeRegex, '\\$&'); + var end = endDelim.replace(escapeRegex, '\\$&'); + + if (start === '' && end === '') { + start = '^'; + } + + return new RegExp(start + '\\s*(\'|"|")(.*?)\\1\\s*\\|\\s*translatePlural:.*:\\1(.*?)\\1\\s*(' + end + '|\\|)', 'g'); +}; + var noDelimRegex = mkAttrRegex('', ''); function walkJs(node, fn, parentComment) { @@ -64,6 +75,7 @@ var Extractor = (function () { this.options.markerNames.unshift(this.options.markerName); this.strings = {}; this.attrRegex = mkAttrRegex(this.options.startDelim, this.options.endDelim); + this.pluralAttrRegex = mkPluralAttrRegex(this.options.startDelim, this.options.endDelim); } Extractor.isValidStrategy = function (strategy) { @@ -71,6 +83,7 @@ var Extractor = (function () { }; Extractor.mkAttrRegex = mkAttrRegex; + Extractor.mkPluralAttrRegex = mkPluralAttrRegex; Extractor.prototype.addString = function (file, string, plural, extractedComment) { string = string.trim(); @@ -221,6 +234,11 @@ var Extractor = (function () { var str = matches[2].replace(/\\\'/g, '\''); this.addString(filename, str); } + while (matches = this.pluralAttrRegex.exec(src)) { + var str = matches[2].replace(/\\\'/g, '\''); + var plural = matches[3].replace(/\\\'/g, '\''); + this.addString(filename, str, plural); + } }; Extractor.prototype.isSupportedByStrategy = function (strategy, extension) { From 4de90388dc5025063fab2d8c7ce851bc52cb7328 Mon Sep 17 00:00:00 2001 From: pswai Date: Thu, 6 Nov 2014 17:45:21 +0800 Subject: [PATCH 2/7] fix jshint error --- lib/extract.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/extract.js b/lib/extract.js index c878446..d7d8528 100644 --- a/lib/extract.js +++ b/lib/extract.js @@ -230,12 +230,13 @@ var Extractor = (function () { }); var matches; + var str; while (matches = this.attrRegex.exec(src)) { - var str = matches[2].replace(/\\\'/g, '\''); + str = matches[2].replace(/\\\'/g, '\''); this.addString(filename, str); } while (matches = this.pluralAttrRegex.exec(src)) { - var str = matches[2].replace(/\\\'/g, '\''); + str = matches[2].replace(/\\\'/g, '\''); var plural = matches[3].replace(/\\\'/g, '\''); this.addString(filename, str, plural); } From 611d4fa4271934ebf94eb541ae5173067e27ad92 Mon Sep 17 00:00:00 2001 From: pswai Date: Thu, 6 Nov 2014 17:45:35 +0800 Subject: [PATCH 3/7] add unit test for translatePlural filter regex --- test/extract_regex.js | 221 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) diff --git a/test/extract_regex.js b/test/extract_regex.js index 0910901..18ffef2 100644 --- a/test/extract_regex.js +++ b/test/extract_regex.js @@ -1,5 +1,6 @@ var assert = require('assert'); var mkAttrRegex = require('../lib/extract').mkAttrRegex; +var mkPluralAttrRegex = require('../lib/extract').mkPluralAttrRegex; describe('Extract: Filter regex', function () { var regex = null; @@ -202,3 +203,223 @@ describe('Extract: Filter regex', function () { assert.equal(matches, null); }); }); + +describe('Extract: Filter regex for translatePlural', function () { + var regex = null; + + beforeEach(function () { + regex = mkPluralAttrRegex('{{', '}}'); + }); + + it('Matches a simple string', function () { + var matches; + var hit = false; + + while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}}')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Matches a simple string with multiple filters', function () { + var matches; + var hit = false; + + while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'|lowercase}}')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Matches double quotes', function () { + var matches; + var hit = false; + + while (matches = regex.exec('{{"1 cat"|translatePlural:n:"{} cats"}}')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Matches double quotes with multiple filters', function () { + var matches; + var hit = false; + + while (matches = regex.exec('{{"1 cat"|translatePlural:n:"{} cats"|lowercase}}')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Matches multiple strings', function () { + var matches; + var hit = 0; + + while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}} {{"1 dog"|translatePlural:n:"{} dogs"}}')) { + if (hit === 0) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + } else if (hit === 1) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 dog'); + assert.equal(matches[3], '{} dogs'); + } + hit++; + } + assert.equal(hit, 2); + }); + + it('Matches multiple strings with multiple filters', function () { + var matches; + var hit = 0; + + while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'|lowercase}} {{"1 dog"|translatePlural:n:"{} dogs"|uppercase}}')) { + if (hit === 0) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + } else if (hit === 1) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 dog'); + assert.equal(matches[3], '{} dogs'); + } + hit++; + } + assert.equal(hit, 2); + }); + + it('Matches encoded quotes', function () { + var matches; + var hit = 0; + + while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}} {{"1 dog"|translatePlural:n:"{} dogs"}}')) { + if (hit === 0) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + } else if (hit === 1) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 dog'); + assert.equal(matches[3], '{} dogs'); + } + hit++; + } + assert.equal(hit, 2); + }); + + it('Matches encoded quotes with multiple filters', function () { + var matches; + var hit = 0; + + while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}} {{"1 dog"|translatePlural:n:"{} dogs"|lowercase}}')) { + if (hit === 0) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + } else if (hit === 1) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 dog'); + assert.equal(matches[3], '{} dogs'); + } + hit++; + } + assert.equal(hit, 2); + }); + + it('Matches spaces', function () { + var matches; + var hit = false; + + while (matches = regex.exec('{{ \'1 cat\' | translatePlural:n:\'{} cats\' }}')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Matches spaces with multiple filters', function () { + var matches; + var hit = false; + + while (matches = regex.exec('{{ \'1 cat\' | translatePlural:n:\'{} cats\' | lowercase }}')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Can customize delimiters', function () { + var matches; + var regex = mkPluralAttrRegex('[[', ']]'); + var hit = false; + + while (matches = regex.exec('[[\'1 cat\'|translatePlural:n:\'{} cats\']]')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Can customize delimiters with multiple filters', function () { + var matches; + var regex = mkPluralAttrRegex('[[', ']]'); + var hit = false; + + while (matches = regex.exec('[[\'1 cat\'|translatePlural:n:\'{} cats\'|lowercase]]')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Can be used without delimiters', function () { + var matches; + var regex = mkPluralAttrRegex('', ''); + var hit = false; + + while (matches = regex.exec('\'1 cat\'|translatePlural:n:\'{} cats\' | translate')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + }); + + it('Can be used without delimiters with multiple filters', function () { + var matches; + var regex = mkPluralAttrRegex('', ''); + var hit = false; + + while (matches = regex.exec('\'1 cat\'|translatePlural:n:\'{} cats\' | translate | lowercase')) { + assert.equal(matches.length, 5); + assert.equal(matches[2], '1 cat'); + assert.equal(matches[3], '{} cats'); + hit = true; + } + assert(hit); + matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\' | translate}}'); + assert.equal(matches, null); + }); +}); From 6d2f6e09599319d385bcdc54432888e14d55cfaa Mon Sep 17 00:00:00 2001 From: PSWai Date: Thu, 6 Nov 2014 23:01:05 +0800 Subject: [PATCH 4/7] Add fixture test --- lib/extract.js | 5 +++++ test/extract.coffee | 21 ++++++++++++++++++++- test/fixtures/filter-plural.html | 6 ++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/filter-plural.html diff --git a/lib/extract.js b/lib/extract.js index d7d8528..d64e60d 100644 --- a/lib/extract.js +++ b/lib/extract.js @@ -28,6 +28,7 @@ var mkPluralAttrRegex = function (startDelim, endDelim) { }; var noDelimRegex = mkAttrRegex('', ''); +var noDelimPluralRegex = mkPluralAttrRegex('', ''); function walkJs(node, fn, parentComment) { fn(node, parentComment); @@ -216,6 +217,10 @@ var Extractor = (function () { plural = node.attr('translate-plural'); extractedComment = node.attr('translate-comment'); self.addString(filename, str, plural, extractedComment); + } else if (matches = noDelimPluralRegex.exec(node.attr(attr))) { + str = matches[2].replace(/\\\'/g, '\''); + plural = matches[3].replace(/\\\'/g, '\''); + self.addString(filename, str, plural); } else if (matches = noDelimRegex.exec(node.attr(attr))) { str = matches[2].replace(/\\\'/g, '\''); self.addString(filename, str); diff --git a/test/extract.coffee b/test/extract.coffee index 2c26acc..66c1d8b 100644 --- a/test/extract.coffee +++ b/test/extract.coffee @@ -506,4 +506,23 @@ describe 'Extract', -> ] catalog = testExtract(files) - assert.equal(catalog.items.length, 0) \ No newline at end of file + assert.equal(catalog.items.length, 0) + + it 'Extracts filter strings for translatePlural', -> + files = [ + 'test/fixtures/filter-plural.html' + ] + catalog = testExtract(files) + + assert.equal(catalog.items.length, 2) + assert.equal(catalog.items[0].msgid, 'One file selected') + assert.equal(catalog.items[0].msgid_plural, '{} files selected') + assert.equal(catalog.items[0].msgstr.length, 2) + assert.equal(catalog.items[0].references.length, 1) + assert.equal(catalog.items[0].references[0], 'test/fixtures/filter-plural.html') + + assert.equal(catalog.items[1].msgid, 'You have an unread message') + assert.equal(catalog.items[1].msgid_plural, 'You have {} unread messages') + assert.equal(catalog.items[1].msgstr.length, 2) + assert.equal(catalog.items[1].references.length, 1) + assert.equal(catalog.items[1].references[0], 'test/fixtures/filter-plural.html') diff --git a/test/fixtures/filter-plural.html b/test/fixtures/filter-plural.html new file mode 100644 index 0000000..ebbdb79 --- /dev/null +++ b/test/fixtures/filter-plural.html @@ -0,0 +1,6 @@ + + + +

{{'You have an unread message' | translatePlural:apples.length:'You have {} unread messages'}}

+ + From 4e3d616578d056b8429810df6c5a78af65292068 Mon Sep 17 00:00:00 2001 From: pswai Date: Fri, 7 Nov 2014 10:50:31 +0800 Subject: [PATCH 5/7] Merge plural regex with singular regex --- lib/extract.js | 32 ++------ test/extract_regex.js | 179 +++++++++++++++++++++++++++--------------- 2 files changed, 121 insertions(+), 90 deletions(-) diff --git a/lib/extract.js b/lib/extract.js index d64e60d..72bca24 100644 --- a/lib/extract.js +++ b/lib/extract.js @@ -13,22 +13,10 @@ var mkAttrRegex = function (startDelim, endDelim) { start = '^'; } - return new RegExp(start + '\\s*(\'|"|")(.*?)\\1\\s*\\|\\s*translate\\s*(' + end + '|\\|)', 'g'); -}; - -var mkPluralAttrRegex = function (startDelim, endDelim) { - var start = startDelim.replace(escapeRegex, '\\$&'); - var end = endDelim.replace(escapeRegex, '\\$&'); - - if (start === '' && end === '') { - start = '^'; - } - - return new RegExp(start + '\\s*(\'|"|")(.*?)\\1\\s*\\|\\s*translatePlural:.*:\\1(.*?)\\1\\s*(' + end + '|\\|)', 'g'); + return new RegExp(start + '\\s*(\'|"|")(.*?)\\1\\s*\\|\\s*translate(Plural:.*:\\1(.*?)\\1)?\\s*(' + end + '|\\|)', 'g'); }; var noDelimRegex = mkAttrRegex('', ''); -var noDelimPluralRegex = mkPluralAttrRegex('', ''); function walkJs(node, fn, parentComment) { fn(node, parentComment); @@ -76,7 +64,6 @@ var Extractor = (function () { this.options.markerNames.unshift(this.options.markerName); this.strings = {}; this.attrRegex = mkAttrRegex(this.options.startDelim, this.options.endDelim); - this.pluralAttrRegex = mkPluralAttrRegex(this.options.startDelim, this.options.endDelim); } Extractor.isValidStrategy = function (strategy) { @@ -84,7 +71,6 @@ var Extractor = (function () { }; Extractor.mkAttrRegex = mkAttrRegex; - Extractor.mkPluralAttrRegex = mkPluralAttrRegex; Extractor.prototype.addString = function (file, string, plural, extractedComment) { string = string.trim(); @@ -217,13 +203,10 @@ var Extractor = (function () { plural = node.attr('translate-plural'); extractedComment = node.attr('translate-comment'); self.addString(filename, str, plural, extractedComment); - } else if (matches = noDelimPluralRegex.exec(node.attr(attr))) { - str = matches[2].replace(/\\\'/g, '\''); - plural = matches[3].replace(/\\\'/g, '\''); - self.addString(filename, str, plural); } else if (matches = noDelimRegex.exec(node.attr(attr))) { str = matches[2].replace(/\\\'/g, '\''); - self.addString(filename, str); + plural = (typeof matches[4] === 'string') ? matches[4].replace(/\\\'/g, '\'') : undefined; + self.addString(filename, str, plural); } } @@ -235,14 +218,9 @@ var Extractor = (function () { }); var matches; - var str; while (matches = this.attrRegex.exec(src)) { - str = matches[2].replace(/\\\'/g, '\''); - this.addString(filename, str); - } - while (matches = this.pluralAttrRegex.exec(src)) { - str = matches[2].replace(/\\\'/g, '\''); - var plural = matches[3].replace(/\\\'/g, '\''); + var str = matches[2].replace(/\\\'/g, '\''); + var plural = (typeof matches[4] === 'string') ? matches[4].replace(/\\\'/g, '\'') : undefined; this.addString(filename, str, plural); } }; diff --git a/test/extract_regex.js b/test/extract_regex.js index 18ffef2..b22d11d 100644 --- a/test/extract_regex.js +++ b/test/extract_regex.js @@ -1,6 +1,5 @@ var assert = require('assert'); var mkAttrRegex = require('../lib/extract').mkAttrRegex; -var mkPluralAttrRegex = require('../lib/extract').mkPluralAttrRegex; describe('Extract: Filter regex', function () { var regex = null; @@ -14,8 +13,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('{{\'Hello\'|translate}}')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -26,8 +28,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('{{\'Hello\'|translate|lowercase}}')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -38,8 +43,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('{{"Hello"|translate}}')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -50,8 +58,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('{{\'Hello\'|translate|lowercase}}')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -63,11 +74,17 @@ describe('Extract: Filter regex', function () { while (matches = regex.exec('{{\'Hello\'|translate}} {{"Second"|translate}}')) { if (hit === 0) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } else if (hit === 1) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Second'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } hit++; } @@ -80,11 +97,17 @@ describe('Extract: Filter regex', function () { while (matches = regex.exec('{{\'Hello\'|translate|lowercase}} {{"Second"|translate|uppercase}}')) { if (hit === 0) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } else if (hit === 1) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Second'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } hit++; } @@ -97,11 +120,17 @@ describe('Extract: Filter regex', function () { while (matches = regex.exec('{{\'Hello\'|translate}} {{"Second"|translate}}')) { if (hit === 0) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } else if (hit === 1) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Second'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } hit++; } @@ -114,11 +143,17 @@ describe('Extract: Filter regex', function () { while (matches = regex.exec('{{\'Hello\'|translate}} {{"Second"|translate|lowercase}}')) { if (hit === 0) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } else if (hit === 1) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Second'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); } hit++; } @@ -130,8 +165,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('{{ "Hello" | translate }}')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -142,8 +180,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('{{ "Hello" | translate | lowercase }}')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -155,8 +196,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('[[\'Hello\'|translate]]')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -168,8 +212,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('[[\'Hello\'|translate|lowercase]]')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -181,8 +228,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('\'Hello\' | translate')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -194,8 +244,11 @@ describe('Extract: Filter regex', function () { var hit = false; while (matches = regex.exec('\'Hello\' | translate | lowercase')) { - assert.equal(matches.length, 4); + assert.equal(matches.length, 6); assert.equal(matches[2], 'Hello'); + // Assert no plural is matched + assert.equal(matches[3], undefined); + assert.equal(matches[4], undefined); hit = true; } assert(hit); @@ -208,7 +261,7 @@ describe('Extract: Filter regex for translatePlural', function () { var regex = null; beforeEach(function () { - regex = mkPluralAttrRegex('{{', '}}'); + regex = mkAttrRegex('{{', '}}'); }); it('Matches a simple string', function () { @@ -216,9 +269,9 @@ describe('Extract: Filter regex for translatePlural', function () { var hit = false; while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}}')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -229,9 +282,9 @@ describe('Extract: Filter regex for translatePlural', function () { var hit = false; while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'|lowercase}}')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -242,9 +295,9 @@ describe('Extract: Filter regex for translatePlural', function () { var hit = false; while (matches = regex.exec('{{"1 cat"|translatePlural:n:"{} cats"}}')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -255,9 +308,9 @@ describe('Extract: Filter regex for translatePlural', function () { var hit = false; while (matches = regex.exec('{{"1 cat"|translatePlural:n:"{} cats"|lowercase}}')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -269,13 +322,13 @@ describe('Extract: Filter regex for translatePlural', function () { while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}} {{"1 dog"|translatePlural:n:"{} dogs"}}')) { if (hit === 0) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); } else if (hit === 1) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 dog'); - assert.equal(matches[3], '{} dogs'); + assert.equal(matches[4], '{} dogs'); } hit++; } @@ -288,13 +341,13 @@ describe('Extract: Filter regex for translatePlural', function () { while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'|lowercase}} {{"1 dog"|translatePlural:n:"{} dogs"|uppercase}}')) { if (hit === 0) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); } else if (hit === 1) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 dog'); - assert.equal(matches[3], '{} dogs'); + assert.equal(matches[4], '{} dogs'); } hit++; } @@ -307,13 +360,13 @@ describe('Extract: Filter regex for translatePlural', function () { while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}} {{"1 dog"|translatePlural:n:"{} dogs"}}')) { if (hit === 0) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); } else if (hit === 1) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 dog'); - assert.equal(matches[3], '{} dogs'); + assert.equal(matches[4], '{} dogs'); } hit++; } @@ -326,13 +379,13 @@ describe('Extract: Filter regex for translatePlural', function () { while (matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\'}} {{"1 dog"|translatePlural:n:"{} dogs"|lowercase}}')) { if (hit === 0) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); } else if (hit === 1) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 dog'); - assert.equal(matches[3], '{} dogs'); + assert.equal(matches[4], '{} dogs'); } hit++; } @@ -344,9 +397,9 @@ describe('Extract: Filter regex for translatePlural', function () { var hit = false; while (matches = regex.exec('{{ \'1 cat\' | translatePlural:n:\'{} cats\' }}')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -357,9 +410,9 @@ describe('Extract: Filter regex for translatePlural', function () { var hit = false; while (matches = regex.exec('{{ \'1 cat\' | translatePlural:n:\'{} cats\' | lowercase }}')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -367,13 +420,13 @@ describe('Extract: Filter regex for translatePlural', function () { it('Can customize delimiters', function () { var matches; - var regex = mkPluralAttrRegex('[[', ']]'); + var regex = mkAttrRegex('[[', ']]'); var hit = false; while (matches = regex.exec('[[\'1 cat\'|translatePlural:n:\'{} cats\']]')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -381,13 +434,13 @@ describe('Extract: Filter regex for translatePlural', function () { it('Can customize delimiters with multiple filters', function () { var matches; - var regex = mkPluralAttrRegex('[[', ']]'); + var regex = mkAttrRegex('[[', ']]'); var hit = false; while (matches = regex.exec('[[\'1 cat\'|translatePlural:n:\'{} cats\'|lowercase]]')) { - assert.equal(matches.length, 5); + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -395,13 +448,13 @@ describe('Extract: Filter regex for translatePlural', function () { it('Can be used without delimiters', function () { var matches; - var regex = mkPluralAttrRegex('', ''); + var regex = mkAttrRegex('', ''); var hit = false; - while (matches = regex.exec('\'1 cat\'|translatePlural:n:\'{} cats\' | translate')) { - assert.equal(matches.length, 5); + while (matches = regex.exec('\'1 cat\' | translatePlural:n:\'{} cats\'')) { + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); @@ -409,17 +462,17 @@ describe('Extract: Filter regex for translatePlural', function () { it('Can be used without delimiters with multiple filters', function () { var matches; - var regex = mkPluralAttrRegex('', ''); + var regex = mkAttrRegex('', ''); var hit = false; - while (matches = regex.exec('\'1 cat\'|translatePlural:n:\'{} cats\' | translate | lowercase')) { - assert.equal(matches.length, 5); + while (matches = regex.exec('\'1 cat\' | translatePlural:n:\'{} cats\' | lowercase')) { + assert.equal(matches.length, 6); assert.equal(matches[2], '1 cat'); - assert.equal(matches[3], '{} cats'); + assert.equal(matches[4], '{} cats'); hit = true; } assert(hit); - matches = regex.exec('{{\'1 cat\'|translatePlural:n:\'{} cats\' | translate}}'); + matches = regex.exec('{{\'1 cat\' | translatePlural:n:\'{} cats\'}}'); assert.equal(matches, null); }); }); From eee23a2f9f18b5da674342009f80adc1546b3325 Mon Sep 17 00:00:00 2001 From: pswai Date: Fri, 7 Nov 2014 11:51:19 +0800 Subject: [PATCH 6/7] Add test for plural filter with no delimiter --- test/extract.coffee | 17 ++++++++++++----- test/fixtures/filter-plural.html | 3 ++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/test/extract.coffee b/test/extract.coffee index 66c1d8b..43b5bcf 100644 --- a/test/extract.coffee +++ b/test/extract.coffee @@ -514,15 +514,22 @@ describe 'Extract', -> ] catalog = testExtract(files) - assert.equal(catalog.items.length, 2) - assert.equal(catalog.items[0].msgid, 'One file selected') - assert.equal(catalog.items[0].msgid_plural, '{} files selected') + # Notes on the ordering: Strings seem to be sorted alphabetically + assert.equal(catalog.items.length, 3) + assert.equal(catalog.items[0].msgid, '1 coin') + assert.equal(catalog.items[0].msgid_plural, '{} coins') assert.equal(catalog.items[0].msgstr.length, 2) assert.equal(catalog.items[0].references.length, 1) assert.equal(catalog.items[0].references[0], 'test/fixtures/filter-plural.html') - assert.equal(catalog.items[1].msgid, 'You have an unread message') - assert.equal(catalog.items[1].msgid_plural, 'You have {} unread messages') + assert.equal(catalog.items[1].msgid, 'One file selected') + assert.equal(catalog.items[1].msgid_plural, '{} files selected') assert.equal(catalog.items[1].msgstr.length, 2) assert.equal(catalog.items[1].references.length, 1) assert.equal(catalog.items[1].references[0], 'test/fixtures/filter-plural.html') + + assert.equal(catalog.items[2].msgid, 'You have an unread message') + assert.equal(catalog.items[2].msgid_plural, 'You have {} unread messages') + assert.equal(catalog.items[2].msgstr.length, 2) + assert.equal(catalog.items[2].references.length, 1) + assert.equal(catalog.items[2].references[0], 'test/fixtures/filter-plural.html') diff --git a/test/fixtures/filter-plural.html b/test/fixtures/filter-plural.html index ebbdb79..e18bf2f 100644 --- a/test/fixtures/filter-plural.html +++ b/test/fixtures/filter-plural.html @@ -1,6 +1,7 @@ - + +

{{'You have an unread message' | translatePlural:apples.length:'You have {} unread messages'}}

From 97d34c20b3d4efcc2b62fc959895e1d66f045304 Mon Sep 17 00:00:00 2001 From: pswai Date: Fri, 7 Nov 2014 11:51:37 +0800 Subject: [PATCH 7/7] Fix a bug that some attributes are not matched --- lib/extract.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/extract.js b/lib/extract.js index 72bca24..e94aadf 100644 --- a/lib/extract.js +++ b/lib/extract.js @@ -208,6 +208,10 @@ var Extractor = (function () { plural = (typeof matches[4] === 'string') ? matches[4].replace(/\\\'/g, '\'') : undefined; self.addString(filename, str, plural); } + + // Regex with global modifier keeps lastIndex + // Reset it to make sure all strings are checked from index 0 + noDelimRegex.lastIndex = 0; } if (typeof node.attr('data-translate') !== 'undefined') {