From aa9ba6592c2d51eb4f2848e7e74f3416ffd4f3d3 Mon Sep 17 00:00:00 2001 From: Vladimir Starkov Date: Thu, 3 Dec 2015 16:08:18 +0100 Subject: [PATCH] fix french quotes close #3 --- index.js | 25 ++++++++++++------------- test.js | 11 +++++++++++ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/index.js b/index.js index 5dd386f..4a2ae8a 100644 --- a/index.js +++ b/index.js @@ -1,20 +1,19 @@ import quotesDB from 'typographic-quotes-l10n-db'; export default function typographicQuotes(input = '', {locale = 'en-us'} = {}) { + let separator = ''; const localeQuotes = quotesDB[locale]; const pattern = /(^|\s)(?:"(.*?)"|'(.*?)')(\s|$|\.|,|\?|!)/gim; + const handleQuotes = (quotes, cb) => + (match, before='', part1='', part2='', after='') => { + let text = (part1 + part2); + if (cb) { text = text.replace(pattern, cb); } + if (locale === 'fr') { separator = ' '; } + return `${before}${quotes[0]}${separator}${text}${separator}${quotes[1]}${after}`; + } - const primary = (match, before='', part1='', part2='', after='')=> { - const quotes = [localeQuotes[0], localeQuotes[1]]; - const text = (part1 + part2).replace(pattern, secondary); - return `${before}${quotes[0]}${text}${quotes[1]}${after}`; - } - - const secondary = (match, before='', part1='', part2='', after='')=> { - const quotes = [localeQuotes[2], localeQuotes[3]]; - let text = part1 + part2; - return `${before}${quotes[0]}${text}${quotes[1]}${after}`; - } - - return input.replace(pattern, primary); + return input.replace(pattern, + handleQuotes( + localeQuotes.slice(0, 2), + handleQuotes(localeQuotes.slice(2, 4)))) } diff --git a/test.js b/test.js index f79f62e..e9ac843 100644 --- a/test.js +++ b/test.js @@ -6,6 +6,11 @@ it('should fix simple quotes', ()=> { equal(quotes(`foo "foo" bar`), `foo “foo” bar`); }); +it('should fix simple quotes for French', ()=> { + let locale = 'fr'; + equal(quotes(`foo 'foo' bar`, { locale }), `foo « foo » bar`); +}); + it('should support locale', ()=> { let locale = 'ru'; equal(quotes(`foo 'foo' bar`, {locale}), `foo «foo» bar`); @@ -50,6 +55,12 @@ it('should fix nested quotes', ()=> { equal(quotes(`foo 'foo "inside" bar' bar`), `foo “foo ‘inside’ bar” bar`); }); +it('should fix nested quotes for French', ()=> { + const locale = 'fr'; + equal(quotes(`foo "foo 'inside' bar" bar`, { locale }), `foo « foo “ inside ” bar » bar`); + equal(quotes(`foo 'foo "inside" bar' bar`, { locale }), `foo « foo “ inside ” bar » bar`); +}); + it('should fix nested quotes in start', ()=> { equal(quotes(`"foo 'inside' bar" bar`), `“foo ‘inside’ bar” bar`); equal(quotes(`'foo "inside" bar' bar`), `“foo ‘inside’ bar” bar`);