From 911377e283fadabd06ac637ed1d92d0d69687b89 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Fri, 23 Sep 2016 14:34:51 +0200 Subject: [PATCH 1/2] Load sprintf as a separate module This requires the npm module instead of inlining it and updates sprintf.js from 0.7-beta1 to version 1.0.3. A few changes to the tests were required to accomodate for the version bump. --- jed.js | 161 +------------------------------------------------- package.json | 10 ++-- test/tests.js | 8 +-- 3 files changed, 12 insertions(+), 167 deletions(-) diff --git a/jed.js b/jed.js index bda163b..a35fb9f 100644 --- a/jed.js +++ b/jed.js @@ -329,165 +329,8 @@ in order to offer easy upgrades -- jsgettext.berlios.de // We _slightly_ modify the normal sprintf behavior to more gracefully handle // undefined values. - /** - sprintf() for JavaScript 0.7-beta1 - http://www.diveintojavascript.com/projects/javascript-sprintf - - Copyright (c) Alexandru Marasteanu - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of sprintf() for JavaScript nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - var sprintf = (function() { - function get_type(variable) { - return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); - } - function str_repeat(input, multiplier) { - for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} - return output.join(''); - } - - var str_format = function() { - if (!str_format.cache.hasOwnProperty(arguments[0])) { - str_format.cache[arguments[0]] = str_format.parse(arguments[0]); - } - return str_format.format.call(null, str_format.cache[arguments[0]], arguments); - }; - - str_format.format = function(parse_tree, argv) { - var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; - for (i = 0; i < tree_length; i++) { - node_type = get_type(parse_tree[i]); - if (node_type === 'string') { - output.push(parse_tree[i]); - } - else if (node_type === 'array') { - match = parse_tree[i]; // convenience purposes only - if (match[2]) { // keyword argument - arg = argv[cursor]; - for (k = 0; k < match[2].length; k++) { - if (!arg.hasOwnProperty(match[2][k])) { - throw(sprintf('[sprintf] property "%s" does not exist', match[2][k])); - } - arg = arg[match[2][k]]; - } - } - else if (match[1]) { // positional argument (explicit) - arg = argv[match[1]]; - } - else { // positional argument (implicit) - arg = argv[cursor++]; - } - - if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) { - throw(sprintf('[sprintf] expecting number but found %s', get_type(arg))); - } - - // Jed EDIT - if ( typeof arg == 'undefined' || arg === null ) { - arg = ''; - } - // Jed EDIT - - switch (match[8]) { - case 'b': arg = arg.toString(2); break; - case 'c': arg = String.fromCharCode(arg); break; - case 'd': arg = parseInt(arg, 10); break; - case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; - case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; - case 'o': arg = arg.toString(8); break; - case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; - case 'u': arg = Math.abs(arg); break; - case 'x': arg = arg.toString(16); break; - case 'X': arg = arg.toString(16).toUpperCase(); break; - } - arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); - pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; - pad_length = match[6] - String(arg).length; - pad = match[6] ? str_repeat(pad_character, pad_length) : ''; - output.push(match[5] ? arg + pad : pad + arg); - } - } - return output.join(''); - }; - - str_format.cache = {}; - - str_format.parse = function(fmt) { - var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; - while (_fmt) { - if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { - parse_tree.push(match[0]); - } - else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { - parse_tree.push('%'); - } - else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) { - if (match[2]) { - arg_names |= 1; - var field_list = [], replacement_field = match[2], field_match = []; - if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { - if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { - field_list.push(field_match[1]); - } - else { - throw('[sprintf] huh?'); - } - } - } - else { - throw('[sprintf] huh?'); - } - match[2] = field_list; - } - else { - arg_names |= 2; - } - if (arg_names === 3) { - throw('[sprintf] mixing positional and named placeholders is not (yet) supported'); - } - parse_tree.push(match); - } - else { - throw('[sprintf] huh?'); - } - _fmt = _fmt.substring(match[0].length); - } - return parse_tree; - }; - - return str_format; - })(); - - var vsprintf = function(fmt, argv) { - argv.unshift(fmt); - return sprintf.apply(null, argv); - }; + var sprintf = require("sprintf-js").sprintf, + vsprintf = require("sprintf-js").vsprintf; Jed.parse_plural = function ( plural_forms, n ) { plural_forms = plural_forms.replace(/n/g, n); diff --git a/package.json b/package.json index 0e37bc7..b874566 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,12 @@ "gettext", "internationalization" ], - "dependencies" : {}, - "devDependencies" : { - "mocha" : "*", - "expect.js" : "*", + "dependencies": { + "sprintf-js": "^1.0.3" + }, + "devDependencies": { + "mocha": "*", + "expect.js": "*", "serve": "*" }, "license": "MIT" diff --git a/test/tests.js b/test/tests.js index 7ebc8c0..4b44078 100644 --- a/test/tests.js +++ b/test/tests.js @@ -704,7 +704,7 @@ "thing%1$sbob" : "thing[one]bob", "thing%1$s%2$sbob" : "thing[one][two]bob", "thing%1$sasdf%2$sasdf" : "thing[one]asdf[two]asdf", - "%1$s%2$s%3$s" : "[one][two]", + "%1$s%2$s%3$s" : "[one][two]undefined", "tom%1$saDick" : "tom[one]aDick" }; var args = ["[one]", "[two]"]; @@ -729,9 +729,9 @@ "%%" : "%", "tom%%dick" : "tom%dick", "thing%1$sbob" : "thing[one]bob", - "thing%1$s%2$sbob" : "thing[one]bob", - "thing%1$sasdf%2$sasdf" : "thing[one]asdfasdf", - "%1$s%2$s%3$s" : "[one]" + "thing%1$s%2$sbob" : "thing[one]undefinedbob", + "thing%1$sasdf%2$sasdf" : "thing[one]asdfundefinedasdf", + "%1$s%2$s%3$s" : "[one]undefinedundefined" }; var arg = "[one]"; From 8370e629cffe246385315eb59ac565f51be980b2 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Fri, 23 Sep 2016 14:39:11 +0200 Subject: [PATCH 2/2] Remove comment about undefined values --- jed.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/jed.js b/jed.js index a35fb9f..37531a1 100644 --- a/jed.js +++ b/jed.js @@ -326,9 +326,6 @@ in order to offer easy upgrades -- jsgettext.berlios.de // This is not internally used, so you can remove it if you have this // available somewhere else, or want to use a different system. - // We _slightly_ modify the normal sprintf behavior to more gracefully handle - // undefined values. - var sprintf = require("sprintf-js").sprintf, vsprintf = require("sprintf-js").vsprintf;