diff --git a/.gitignore b/.gitignore index bc55255..159e4fc 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules misc/coverage.html ctest/sauce* *.sheetjs +*.tgz diff --git a/bits/00_header.js b/bits/00_header.js index 2829d16..2cd78d2 100644 --- a/bits/00_header.js +++ b/bits/00_header.js @@ -10,7 +10,6 @@ var PRINTJ/*:PRINTJModule*/ = /*::(*/{}/*:: :any)*/; export const version = PRINTJ.version; #else var PRINTJ/*:PRINTJModule*/; -#include "05_polyfill.js" (function (factory/*:(a:any)=>void*/)/*:void*/ { /*jshint ignore:start */ /*eslint-disable */ diff --git a/bits/01_version.js b/bits/01_version.js index eafee04..aafa57c 100644 --- a/bits/01_version.js +++ b/bits/01_version.js @@ -1 +1 @@ -PRINTJ.version = '1.2.0'; +PRINTJ.version = '1.2.1'; diff --git a/bits/05_polyfill.js b/bits/05_polyfill.js deleted file mode 100644 index 6275ed3..0000000 --- a/bits/05_polyfill.js +++ /dev/null @@ -1,38 +0,0 @@ -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat -if (!String.prototype.repeat) { - String.prototype.repeat = function(count) { - 'use strict'; - if (this == null) { - throw new TypeError('can\'t convert ' + this + ' to object'); - } - var str = '' + this; - count = +count; - if (count != count) { - count = 0; - } - if (count < 0) { - throw new RangeError('repeat count must be non-negative'); - } - if (count == Infinity) { - throw new RangeError('repeat count must be less than infinity'); - } - count = Math.floor(count); - if (str.length == 0 || count == 0) { - return ''; - } - // Ensuring count is a 31-bit integer allows us to heavily optimize the - // main part. But anyway, most current (August 2014) browsers can't handle - // strings 1 << 28 chars or longer, so: - if (str.length * count >= 1 << 28) { - throw new RangeError('repeat count must not overflow maximum string size'); - } - var maxCount = str.length * count; - count = Math.floor(Math.log(count) / Math.log(2)); - while (count) { - str += str; - count--; - } - str += str.substring(0, maxCount - str.length); - return str; - } -} diff --git a/ctest/printj.js b/ctest/printj.js index a2a38d6..ff000bb 100644 --- a/ctest/printj.js +++ b/ctest/printj.js @@ -25,7 +25,7 @@ var PRINTJ; /*jshint ignore:end */ }(function(PRINTJ) { -PRINTJ.version = '1.1.2'; +PRINTJ.version = '1.2.1'; function tokenize(fmt) { var out = []; @@ -149,14 +149,6 @@ function tokenize(fmt) { return out; } -//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") -var padstr = { - " ": " ", - "0": "000000000000000000000000000000000", - "7": "777777777777777777777777777777777", - "f": "fffffffffffffffffffffffffffffffff" -}; - /*global process:true, util:true, require:true */ if(typeof process !== 'undefined' && !!process.versions && !!process.versions.node) util=require("util"); var u_inspect = (typeof util != 'undefined') ? util.inspect : JSON.stringify; @@ -208,7 +200,7 @@ function doit(t, args) { /* only valid flag is "-" for left justification */ O = String(arg); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* first char of string or convert */ @@ -223,7 +215,7 @@ function doit(t, args) { case "string": O = arg.charAt(0); break; default: O = String(arg).charAt(0); } - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* int diDuUoOxXbB */ @@ -308,10 +300,10 @@ function doit(t, args) { /* boolean (extension) */ case /*Y*/ 89: case /*y*/ 121: - O = Boolean(arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); + O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; } @@ -373,16 +365,16 @@ function doit(t, args) { if(radix == 16 || radix == -16) { O = (Vnum>>>0).toString(16); Vnum = Math.floor((Vnum - (Vnum >>> 0)) / Math.pow(2,32)); - O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? padstr[ "0"].substr(0,8 - O.length) : "") + O; - O = (16 - O.length >= 0 ? padstr[ "f"].substr(0,16 - O.length) : "") + O; + O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? "0".repeat(8 - O.length) : "") + O; + O = (16 - O.length >= 0 ? "f".repeat(16 - O.length) : "") + O; if(radix == 16) O = O.toUpperCase(); } else if(radix == 8) { O = (Vnum>>>0).toString(8); - O = (10 - O.length >= 0 ? padstr[ "0"].substr(0,10 - O.length) : "") + O; + O = (10 - O.length >= 0 ? "0".repeat(10 - O.length) : "") + O; Vnum = Math.floor((Vnum - ((Vnum >>> 0)&0x3FFFFFFF)) / Math.pow(2,30)); O = (Vnum>>>0).toString(8) + O.substr(O.length - 10); O = O.substr(O.length - 20); - O = "1" + (21 - O.length >= 0 ? padstr[ "7"].substr(0,21 - O.length) : "") + O; + O = "1" + (21 - O.length >= 0 ? "7".repeat(21 - O.length) : "") + O; } else { Vnum = (-Vnum) % 1e16; var d1 = [1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6]; @@ -403,8 +395,8 @@ function doit(t, args) { if(prec ===0 && O == "0" && !(radix == 8 && alt)) O = ""; /* bail out */ else { if(O.length < prec + (O.substr(0,1) == "-" ? 1 : 0)) { - if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? padstr[ "0"].substr(0,prec - O.length) : "") + O; - else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? padstr[ "0"].substr(0,prec + 1 - O.length) : "") + O.substr(1); + if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? "0".repeat(prec - O.length) : "") + O; + else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? "0".repeat(prec + 1 - O.length) : "") + O.substr(1); } /* add prefix for # form */ @@ -425,10 +417,10 @@ function doit(t, args) { if(width > 0) { if(O.length < width) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && prec < 0 && O.length > 0) { - if(prec > O.length) O = ((prec - O.length) >= 0 ? padstr[ "0"].substr(0,(prec - O.length)) : "") + O; - pad = ((width - O.length) >= 0 ? padstr[ (prec > 0 ? " " : "0")].substr(0,(width - O.length)) : ""); + if(prec > O.length) O = ((prec - O.length) >= 0 ? "0".repeat((prec - O.length)) : "") + O; + pad = ((width - O.length) >= 0 ? (prec > 0 ? " " : "0").repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -436,7 +428,7 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } } @@ -483,8 +475,8 @@ function doit(t, args) { O = Vnum.toExponential(20); E = +O.substr(O.indexOf("e")+1); O = O.charAt(0) + O.substr(2,O.indexOf("e")-2); - O = O + (E - O.length + 1 >= 0 ? padstr[ "0"].substr(0,E - O.length + 1) : ""); - if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? padstr[ "0"].substr(0,prec) : ""); + O = O + (E - O.length + 1 >= 0 ? "0".repeat(E - O.length + 1) : ""); + if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); break; /* e/E exponential */ @@ -498,7 +490,7 @@ function doit(t, args) { /* a/A hex */ case 4: - if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? "0".repeat(prec) : ""):"")+"p+0"; break;} O = Vnum.toString(16); /* First char 0-9 */ var ac = O.charCodeAt(0); @@ -545,11 +537,11 @@ function doit(t, args) { if(prec > 0) { O = O.substr(0, prec + 2); if(O.length < prec + 2) { - if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : "") + O.substr(1); - else O += ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : ""); + if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : "") + O.substr(1); + else O += ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : ""); } } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); - } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); else if(alt) O = O + "."; O = "0x" + O + "p" + (E>=0 ? "+" + E : E); break; @@ -566,9 +558,9 @@ function doit(t, args) { /* width */ if(width > O.length) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && O.length > 0 && isf) { - pad = ((width - O.length) >= 0 ? padstr[ "0"].substr(0,(width - O.length)) : ""); + pad = ((width - O.length) >= 0 ? "0".repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -576,7 +568,7 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } if(c < 96) O = O.toUpperCase(); diff --git a/ctest/shim.js b/ctest/shim.js index e3d7840..4493b85 100644 --- a/ctest/shim.js +++ b/ctest/shim.js @@ -235,3 +235,42 @@ if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) { return target; }; } + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat +if (!String.prototype.repeat) { + String.prototype.repeat = function(count) { + 'use strict'; + if (this == null) { + throw new TypeError('can\'t convert ' + this + ' to object'); + } + var str = '' + this; + count = +count; + if (count != count) { + count = 0; + } + if (count < 0) { + throw new RangeError('repeat count must be non-negative'); + } + if (count == Infinity) { + throw new RangeError('repeat count must be less than infinity'); + } + count = Math.floor(count); + if (str.length == 0 || count == 0) { + return ''; + } + // Ensuring count is a 31-bit integer allows us to heavily optimize the + // main part. But anyway, most current (August 2014) browsers can't handle + // strings 1 << 28 chars or longer, so: + if (str.length * count >= 1 << 28) { + throw new RangeError('repeat count must not overflow maximum string size'); + } + var maxCount = str.length * count; + count = Math.floor(Math.log(count) / Math.log(2)); + while (count) { + str += str; + count--; + } + str += str.substring(0, maxCount - str.length); + return str; + }; +} diff --git a/ctest/test.js b/ctest/test.js index b073a51..ef30c84 100644 --- a/ctest/test.js +++ b/ctest/test.js @@ -190,4 +190,7 @@ describe('special cases', function() { assert.equal(sprintf("|%*.*s|", 4, 0, "sheetjs"), "| |"); assert.equal(sprintf("|%*.*s|", 4, -1, "sheetjs"), "|sheetjs|"); }); + it('handles long strings', function() { + for(var i = 10; i <= 1000; i+= 10) assert.equal(sprintf("%" + i + "s", "abc").length, i); + }); }); diff --git a/lib/loop_code.mjs b/lib/loop_code.mjs index decfc8c..19bd6fb 100644 --- a/lib/loop_code.mjs +++ b/lib/loop_code.mjs @@ -7,7 +7,7 @@ var PRINTJ/*:PRINTJModule*/ = /*::(*/{}/*:: :any)*/; -PRINTJ.version = '1.2.0'; +PRINTJ.version = '1.2.1'; export const version = PRINTJ.version; @@ -133,14 +133,6 @@ function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { return out; } -//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") -var padstr/*:{[s:string]:string}*/ = { - " ": " ", - "0": "000000000000000000000000000000000", - "7": "777777777777777777777777777777777", - "f": "fffffffffffffffffffffffffffffffff" -}; - var u_inspect/*:(o:any)=>string*/ = JSON.stringify; function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { @@ -190,7 +182,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* only valid flag is "-" for left justification */ O = String(arg); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* first char of string or convert */ @@ -205,7 +197,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { case "string": O = /*::(*/arg/*:: :string)*/.charAt(0); break; default: O = String(arg).charAt(0); } - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* int diDuUoOxXbB */ @@ -293,7 +285,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; } @@ -355,16 +347,16 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(radix == 16 || radix == -16) { O = (Vnum>>>0).toString(16); Vnum = Math.floor((Vnum - (Vnum >>> 0)) / Math.pow(2,32)); - O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? padstr[ "0"].substr(0,8 - O.length) : "") + O; - O = (16 - O.length >= 0 ? padstr[ "f"].substr(0,16 - O.length) : "") + O; + O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? "0".repeat(8 - O.length) : "") + O; + O = (16 - O.length >= 0 ? "f".repeat(16 - O.length) : "") + O; if(radix == 16) O = O.toUpperCase(); } else if(radix == 8) { O = (Vnum>>>0).toString(8); - O = (10 - O.length >= 0 ? padstr[ "0"].substr(0,10 - O.length) : "") + O; + O = (10 - O.length >= 0 ? "0".repeat(10 - O.length) : "") + O; Vnum = Math.floor((Vnum - ((Vnum >>> 0)&0x3FFFFFFF)) / Math.pow(2,30)); O = (Vnum>>>0).toString(8) + O.substr(O.length - 10); O = O.substr(O.length - 20); - O = "1" + (21 - O.length >= 0 ? padstr[ "7"].substr(0,21 - O.length) : "") + O; + O = "1" + (21 - O.length >= 0 ? "7".repeat(21 - O.length) : "") + O; } else { Vnum = (-Vnum) % 1e16; var d1/*:Array*/ = [1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6]; @@ -385,8 +377,8 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(prec ===0 && O == "0" && !(radix == 8 && alt)) O = ""; /* bail out */ else { if(O.length < prec + (O.substr(0,1) == "-" ? 1 : 0)) { - if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? padstr[ "0"].substr(0,prec - O.length) : "") + O; - else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? padstr[ "0"].substr(0,prec + 1 - O.length) : "") + O.substr(1); + if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? "0".repeat(prec - O.length) : "") + O; + else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? "0".repeat(prec + 1 - O.length) : "") + O.substr(1); } /* add prefix for # form */ @@ -407,10 +399,10 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(width > 0) { if(O.length < width) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && prec < 0 && O.length > 0) { - if(prec > O.length) O = ((prec - O.length) >= 0 ? padstr[ "0"].substr(0,(prec - O.length)) : "") + O; - pad = ((width - O.length) >= 0 ? padstr[ (prec > 0 ? " " : "0")].substr(0,(width - O.length)) : ""); + if(prec > O.length) O = ((prec - O.length) >= 0 ? "0".repeat((prec - O.length)) : "") + O; + pad = ((width - O.length) >= 0 ? (prec > 0 ? " " : "0").repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -418,7 +410,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } } @@ -465,8 +457,8 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { O = Vnum.toExponential(20); E = +O.substr(O.indexOf("e")+1); O = O.charAt(0) + O.substr(2,O.indexOf("e")-2); - O = O + (E - O.length + 1 >= 0 ? padstr[ "0"].substr(0,E - O.length + 1) : ""); - if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? padstr[ "0"].substr(0,prec) : ""); + O = O + (E - O.length + 1 >= 0 ? "0".repeat(E - O.length + 1) : ""); + if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); break; /* e/E exponential */ @@ -480,7 +472,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* a/A hex */ case 4: - if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? "0".repeat(prec) : ""):"")+"p+0"; break;} O = Vnum.toString(16); /* First char 0-9 */ var ac/*:number*/ = O.charCodeAt(0); @@ -527,11 +519,11 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(prec > 0) { O = O.substr(0, prec + 2); if(O.length < prec + 2) { - if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : "") + O.substr(1); - else O += ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : ""); + if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : "") + O.substr(1); + else O += ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : ""); } } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); - } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); else if(alt) O = O + "."; O = "0x" + O + "p" + (E>=0 ? "+" + E : E); break; @@ -548,9 +540,9 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* width */ if(width > O.length) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && O.length > 0 && isf) { - pad = ((width - O.length) >= 0 ? padstr[ "0"].substr(0,(width - O.length)) : ""); + pad = ((width - O.length) >= 0 ? "0".repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -558,7 +550,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } if(c < 96) O = O.toUpperCase(); diff --git a/package.json b/package.json index 5bfc17b..50d9ddf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "printj", - "version": "1.2.0", + "version": "1.2.1", "author": "sheetjs", "description": "Pure-JS printf", "keywords": [ diff --git a/printj.flow.js b/printj.flow.js index f912739..ecf88bf 100644 --- a/printj.flow.js +++ b/printj.flow.js @@ -28,7 +28,7 @@ var PRINTJ/*:PRINTJModule*/; /*jshint ignore:end */ }(function(PRINTJ/*:PRINTJModule*/) { -PRINTJ.version = '1.2.0'; +PRINTJ.version = '1.2.1'; function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { var out/*:ParsedFmt*/ = []; @@ -152,14 +152,6 @@ function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { return out; } -//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") -var padstr/*:{[s:string]:string}*/ = { - " ": " ", - "0": "000000000000000000000000000000000", - "7": "777777777777777777777777777777777", - "f": "fffffffffffffffffffffffffffffffff" -}; - /*:: var util = require('util'); */ /*global process:true, util:true, require:true */ if(typeof process !== 'undefined' && !!process.versions && !!process.versions.node) util=require("util"); @@ -212,7 +204,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* only valid flag is "-" for left justification */ O = String(arg); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* first char of string or convert */ @@ -227,7 +219,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { case "string": O = /*::(*/arg/*:: :string)*/.charAt(0); break; default: O = String(arg).charAt(0); } - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* int diDuUoOxXbB */ @@ -315,7 +307,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; } @@ -377,16 +369,16 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(radix == 16 || radix == -16) { O = (Vnum>>>0).toString(16); Vnum = Math.floor((Vnum - (Vnum >>> 0)) / Math.pow(2,32)); - O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? padstr[ "0"].substr(0,8 - O.length) : "") + O; - O = (16 - O.length >= 0 ? padstr[ "f"].substr(0,16 - O.length) : "") + O; + O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? "0".repeat(8 - O.length) : "") + O; + O = (16 - O.length >= 0 ? "f".repeat(16 - O.length) : "") + O; if(radix == 16) O = O.toUpperCase(); } else if(radix == 8) { O = (Vnum>>>0).toString(8); - O = (10 - O.length >= 0 ? padstr[ "0"].substr(0,10 - O.length) : "") + O; + O = (10 - O.length >= 0 ? "0".repeat(10 - O.length) : "") + O; Vnum = Math.floor((Vnum - ((Vnum >>> 0)&0x3FFFFFFF)) / Math.pow(2,30)); O = (Vnum>>>0).toString(8) + O.substr(O.length - 10); O = O.substr(O.length - 20); - O = "1" + (21 - O.length >= 0 ? padstr[ "7"].substr(0,21 - O.length) : "") + O; + O = "1" + (21 - O.length >= 0 ? "7".repeat(21 - O.length) : "") + O; } else { Vnum = (-Vnum) % 1e16; var d1/*:Array*/ = [1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6]; @@ -407,8 +399,8 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(prec ===0 && O == "0" && !(radix == 8 && alt)) O = ""; /* bail out */ else { if(O.length < prec + (O.substr(0,1) == "-" ? 1 : 0)) { - if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? padstr[ "0"].substr(0,prec - O.length) : "") + O; - else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? padstr[ "0"].substr(0,prec + 1 - O.length) : "") + O.substr(1); + if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? "0".repeat(prec - O.length) : "") + O; + else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? "0".repeat(prec + 1 - O.length) : "") + O.substr(1); } /* add prefix for # form */ @@ -429,10 +421,10 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(width > 0) { if(O.length < width) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && prec < 0 && O.length > 0) { - if(prec > O.length) O = ((prec - O.length) >= 0 ? padstr[ "0"].substr(0,(prec - O.length)) : "") + O; - pad = ((width - O.length) >= 0 ? padstr[ (prec > 0 ? " " : "0")].substr(0,(width - O.length)) : ""); + if(prec > O.length) O = ((prec - O.length) >= 0 ? "0".repeat((prec - O.length)) : "") + O; + pad = ((width - O.length) >= 0 ? (prec > 0 ? " " : "0").repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -440,7 +432,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } } @@ -487,8 +479,8 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { O = Vnum.toExponential(20); E = +O.substr(O.indexOf("e")+1); O = O.charAt(0) + O.substr(2,O.indexOf("e")-2); - O = O + (E - O.length + 1 >= 0 ? padstr[ "0"].substr(0,E - O.length + 1) : ""); - if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? padstr[ "0"].substr(0,prec) : ""); + O = O + (E - O.length + 1 >= 0 ? "0".repeat(E - O.length + 1) : ""); + if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); break; /* e/E exponential */ @@ -502,7 +494,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* a/A hex */ case 4: - if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? "0".repeat(prec) : ""):"")+"p+0"; break;} O = Vnum.toString(16); /* First char 0-9 */ var ac/*:number*/ = O.charCodeAt(0); @@ -549,11 +541,11 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(prec > 0) { O = O.substr(0, prec + 2); if(O.length < prec + 2) { - if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : "") + O.substr(1); - else O += ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : ""); + if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : "") + O.substr(1); + else O += ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : ""); } } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); - } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); else if(alt) O = O + "."; O = "0x" + O + "p" + (E>=0 ? "+" + E : E); break; @@ -570,9 +562,9 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* width */ if(width > O.length) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && O.length > 0 && isf) { - pad = ((width - O.length) >= 0 ? padstr[ "0"].substr(0,(width - O.length)) : ""); + pad = ((width - O.length) >= 0 ? "0".repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -580,7 +572,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } if(c < 96) O = O.toUpperCase(); diff --git a/printj.js b/printj.js index f01f0bf..ff000bb 100644 --- a/printj.js +++ b/printj.js @@ -25,7 +25,7 @@ var PRINTJ; /*jshint ignore:end */ }(function(PRINTJ) { -PRINTJ.version = '1.2.0'; +PRINTJ.version = '1.2.1'; function tokenize(fmt) { var out = []; @@ -149,14 +149,6 @@ function tokenize(fmt) { return out; } -//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") -var padstr = { - " ": " ", - "0": "000000000000000000000000000000000", - "7": "777777777777777777777777777777777", - "f": "fffffffffffffffffffffffffffffffff" -}; - /*global process:true, util:true, require:true */ if(typeof process !== 'undefined' && !!process.versions && !!process.versions.node) util=require("util"); var u_inspect = (typeof util != 'undefined') ? util.inspect : JSON.stringify; @@ -208,7 +200,7 @@ function doit(t, args) { /* only valid flag is "-" for left justification */ O = String(arg); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* first char of string or convert */ @@ -223,7 +215,7 @@ function doit(t, args) { case "string": O = arg.charAt(0); break; default: O = String(arg).charAt(0); } - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* int diDuUoOxXbB */ @@ -311,7 +303,7 @@ function doit(t, args) { O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; } @@ -373,16 +365,16 @@ function doit(t, args) { if(radix == 16 || radix == -16) { O = (Vnum>>>0).toString(16); Vnum = Math.floor((Vnum - (Vnum >>> 0)) / Math.pow(2,32)); - O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? padstr[ "0"].substr(0,8 - O.length) : "") + O; - O = (16 - O.length >= 0 ? padstr[ "f"].substr(0,16 - O.length) : "") + O; + O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? "0".repeat(8 - O.length) : "") + O; + O = (16 - O.length >= 0 ? "f".repeat(16 - O.length) : "") + O; if(radix == 16) O = O.toUpperCase(); } else if(radix == 8) { O = (Vnum>>>0).toString(8); - O = (10 - O.length >= 0 ? padstr[ "0"].substr(0,10 - O.length) : "") + O; + O = (10 - O.length >= 0 ? "0".repeat(10 - O.length) : "") + O; Vnum = Math.floor((Vnum - ((Vnum >>> 0)&0x3FFFFFFF)) / Math.pow(2,30)); O = (Vnum>>>0).toString(8) + O.substr(O.length - 10); O = O.substr(O.length - 20); - O = "1" + (21 - O.length >= 0 ? padstr[ "7"].substr(0,21 - O.length) : "") + O; + O = "1" + (21 - O.length >= 0 ? "7".repeat(21 - O.length) : "") + O; } else { Vnum = (-Vnum) % 1e16; var d1 = [1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6]; @@ -403,8 +395,8 @@ function doit(t, args) { if(prec ===0 && O == "0" && !(radix == 8 && alt)) O = ""; /* bail out */ else { if(O.length < prec + (O.substr(0,1) == "-" ? 1 : 0)) { - if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? padstr[ "0"].substr(0,prec - O.length) : "") + O; - else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? padstr[ "0"].substr(0,prec + 1 - O.length) : "") + O.substr(1); + if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? "0".repeat(prec - O.length) : "") + O; + else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? "0".repeat(prec + 1 - O.length) : "") + O.substr(1); } /* add prefix for # form */ @@ -425,10 +417,10 @@ function doit(t, args) { if(width > 0) { if(O.length < width) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && prec < 0 && O.length > 0) { - if(prec > O.length) O = ((prec - O.length) >= 0 ? padstr[ "0"].substr(0,(prec - O.length)) : "") + O; - pad = ((width - O.length) >= 0 ? padstr[ (prec > 0 ? " " : "0")].substr(0,(width - O.length)) : ""); + if(prec > O.length) O = ((prec - O.length) >= 0 ? "0".repeat((prec - O.length)) : "") + O; + pad = ((width - O.length) >= 0 ? (prec > 0 ? " " : "0").repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -436,7 +428,7 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } } @@ -483,8 +475,8 @@ function doit(t, args) { O = Vnum.toExponential(20); E = +O.substr(O.indexOf("e")+1); O = O.charAt(0) + O.substr(2,O.indexOf("e")-2); - O = O + (E - O.length + 1 >= 0 ? padstr[ "0"].substr(0,E - O.length + 1) : ""); - if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? padstr[ "0"].substr(0,prec) : ""); + O = O + (E - O.length + 1 >= 0 ? "0".repeat(E - O.length + 1) : ""); + if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); break; /* e/E exponential */ @@ -498,7 +490,7 @@ function doit(t, args) { /* a/A hex */ case 4: - if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? "0".repeat(prec) : ""):"")+"p+0"; break;} O = Vnum.toString(16); /* First char 0-9 */ var ac = O.charCodeAt(0); @@ -545,11 +537,11 @@ function doit(t, args) { if(prec > 0) { O = O.substr(0, prec + 2); if(O.length < prec + 2) { - if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : "") + O.substr(1); - else O += ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : ""); + if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : "") + O.substr(1); + else O += ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : ""); } } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); - } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); else if(alt) O = O + "."; O = "0x" + O + "p" + (E>=0 ? "+" + E : E); break; @@ -566,9 +558,9 @@ function doit(t, args) { /* width */ if(width > O.length) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && O.length > 0 && isf) { - pad = ((width - O.length) >= 0 ? padstr[ "0"].substr(0,(width - O.length)) : ""); + pad = ((width - O.length) >= 0 ? "0".repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -576,7 +568,7 @@ function doit(t, args) { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } if(c < 96) O = O.toUpperCase(); diff --git a/printj.mjs b/printj.mjs index decfc8c..19bd6fb 100644 --- a/printj.mjs +++ b/printj.mjs @@ -7,7 +7,7 @@ var PRINTJ/*:PRINTJModule*/ = /*::(*/{}/*:: :any)*/; -PRINTJ.version = '1.2.0'; +PRINTJ.version = '1.2.1'; export const version = PRINTJ.version; @@ -133,14 +133,6 @@ function tokenize(fmt/*:string*/)/*:ParsedFmt*/ { return out; } -//#define PAD_(x,c) (x >= 0 ? new Array(((x)|0) + 1).join((c)) : "") -var padstr/*:{[s:string]:string}*/ = { - " ": " ", - "0": "000000000000000000000000000000000", - "7": "777777777777777777777777777777777", - "f": "fffffffffffffffffffffffffffffffff" -}; - var u_inspect/*:(o:any)=>string*/ = JSON.stringify; function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { @@ -190,7 +182,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* only valid flag is "-" for left justification */ O = String(arg); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* first char of string or convert */ @@ -205,7 +197,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { case "string": O = /*::(*/arg/*:: :string)*/.charAt(0); break; default: O = String(arg).charAt(0); } - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; /* int diDuUoOxXbB */ @@ -293,7 +285,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { O = (arg) ? (alt ? "yes" : "true") : (alt ? "no" : "false"); if(c == /*Y*/ 89) O = O.toUpperCase(); if( prec >= 0) O = O.substr(0, prec); - if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? padstr["0"].substr(0, width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? padstr[" "].substr(0, width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } + if( width > O.length || - width > O.length) { if(( flags.indexOf("-") == -1 || width < 0) && flags.indexOf("0") != -1) { pad = ( width - O.length >= 0 ? "0".repeat( width - O.length) : ""); O = pad + O; } else { pad = ( width - O.length >= 0 ? " ".repeat( width - O.length) : ""); O = flags.indexOf("-") > -1 ? O + pad : pad + O; } } break; } @@ -355,16 +347,16 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(radix == 16 || radix == -16) { O = (Vnum>>>0).toString(16); Vnum = Math.floor((Vnum - (Vnum >>> 0)) / Math.pow(2,32)); - O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? padstr[ "0"].substr(0,8 - O.length) : "") + O; - O = (16 - O.length >= 0 ? padstr[ "f"].substr(0,16 - O.length) : "") + O; + O = (Vnum>>>0).toString(16) + (8 - O.length >= 0 ? "0".repeat(8 - O.length) : "") + O; + O = (16 - O.length >= 0 ? "f".repeat(16 - O.length) : "") + O; if(radix == 16) O = O.toUpperCase(); } else if(radix == 8) { O = (Vnum>>>0).toString(8); - O = (10 - O.length >= 0 ? padstr[ "0"].substr(0,10 - O.length) : "") + O; + O = (10 - O.length >= 0 ? "0".repeat(10 - O.length) : "") + O; Vnum = Math.floor((Vnum - ((Vnum >>> 0)&0x3FFFFFFF)) / Math.pow(2,30)); O = (Vnum>>>0).toString(8) + O.substr(O.length - 10); O = O.substr(O.length - 20); - O = "1" + (21 - O.length >= 0 ? padstr[ "7"].substr(0,21 - O.length) : "") + O; + O = "1" + (21 - O.length >= 0 ? "7".repeat(21 - O.length) : "") + O; } else { Vnum = (-Vnum) % 1e16; var d1/*:Array*/ = [1,8,4,4,6,7,4,4,0,7,3,7,0,9,5,5,1,6,1,6]; @@ -385,8 +377,8 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(prec ===0 && O == "0" && !(radix == 8 && alt)) O = ""; /* bail out */ else { if(O.length < prec + (O.substr(0,1) == "-" ? 1 : 0)) { - if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? padstr[ "0"].substr(0,prec - O.length) : "") + O; - else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? padstr[ "0"].substr(0,prec + 1 - O.length) : "") + O.substr(1); + if(O.substr(0,1) != "-") O = (prec - O.length >= 0 ? "0".repeat(prec - O.length) : "") + O; + else O = O.substr(0,1) + (prec + 1 - O.length >= 0 ? "0".repeat(prec + 1 - O.length) : "") + O.substr(1); } /* add prefix for # form */ @@ -407,10 +399,10 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(width > 0) { if(O.length < width) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && prec < 0 && O.length > 0) { - if(prec > O.length) O = ((prec - O.length) >= 0 ? padstr[ "0"].substr(0,(prec - O.length)) : "") + O; - pad = ((width - O.length) >= 0 ? padstr[ (prec > 0 ? " " : "0")].substr(0,(width - O.length)) : ""); + if(prec > O.length) O = ((prec - O.length) >= 0 ? "0".repeat((prec - O.length)) : "") + O; + pad = ((width - O.length) >= 0 ? (prec > 0 ? " " : "0").repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -418,7 +410,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } } @@ -465,8 +457,8 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { O = Vnum.toExponential(20); E = +O.substr(O.indexOf("e")+1); O = O.charAt(0) + O.substr(2,O.indexOf("e")-2); - O = O + (E - O.length + 1 >= 0 ? padstr[ "0"].substr(0,E - O.length + 1) : ""); - if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? padstr[ "0"].substr(0,prec) : ""); + O = O + (E - O.length + 1 >= 0 ? "0".repeat(E - O.length + 1) : ""); + if(alt || (prec > 0 && isnum !== 11)) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); break; /* e/E exponential */ @@ -480,7 +472,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* a/A hex */ case 4: - if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? "0".repeat(prec) : ""):"")+"p+0"; break;} O = Vnum.toString(16); /* First char 0-9 */ var ac/*:number*/ = O.charCodeAt(0); @@ -527,11 +519,11 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { if(prec > 0) { O = O.substr(0, prec + 2); if(O.length < prec + 2) { - if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : "") + O.substr(1); - else O += ((prec + 2 - O.length) >= 0 ? padstr[ "0"].substr(0,(prec + 2 - O.length)) : ""); + if(O.charCodeAt(0) < 48) O = O.charAt(0) + ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : "") + O.substr(1); + else O += ((prec + 2 - O.length) >= 0 ? "0".repeat((prec + 2 - O.length)) : ""); } } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); - } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? "0".repeat(prec) : ""); else if(alt) O = O + "."; O = "0x" + O + "p" + (E>=0 ? "+" + E : E); break; @@ -548,9 +540,9 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { /* width */ if(width > O.length) { if(flags.indexOf("-") > -1) { - O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : ""); + O = O + ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : ""); } else if(flags.indexOf("0") > -1 && O.length > 0 && isf) { - pad = ((width - O.length) >= 0 ? padstr[ "0"].substr(0,(width - O.length)) : ""); + pad = ((width - O.length) >= 0 ? "0".repeat((width - O.length)) : ""); if(O.charCodeAt(0) < 48) { if(O.charAt(2).toLowerCase() == "x") O = O.substr(0,3) + pad + O.substring(3); else O = O.substr(0,1) + pad + O.substring(1); @@ -558,7 +550,7 @@ function doit(t/*:ParsedFmt*/, args/*:Array*/)/*:string*/ { else if(O.charAt(1).toLowerCase() == "x") O = O.substr(0,2) + pad + O.substring(2); else O = pad + O; } else { - O = ((width - O.length) >= 0 ? padstr[ " "].substr(0,(width - O.length)) : "") + O; + O = ((width - O.length) >= 0 ? " ".repeat((width - O.length)) : "") + O; } } if(c < 96) O = O.toUpperCase(); diff --git a/shim.js b/shim.js index e3d7840..4493b85 100644 --- a/shim.js +++ b/shim.js @@ -235,3 +235,42 @@ if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) { return target; }; } + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat +if (!String.prototype.repeat) { + String.prototype.repeat = function(count) { + 'use strict'; + if (this == null) { + throw new TypeError('can\'t convert ' + this + ' to object'); + } + var str = '' + this; + count = +count; + if (count != count) { + count = 0; + } + if (count < 0) { + throw new RangeError('repeat count must be non-negative'); + } + if (count == Infinity) { + throw new RangeError('repeat count must be less than infinity'); + } + count = Math.floor(count); + if (str.length == 0 || count == 0) { + return ''; + } + // Ensuring count is a 31-bit integer allows us to heavily optimize the + // main part. But anyway, most current (August 2014) browsers can't handle + // strings 1 << 28 chars or longer, so: + if (str.length * count >= 1 << 28) { + throw new RangeError('repeat count must not overflow maximum string size'); + } + var maxCount = str.length * count; + count = Math.floor(Math.log(count) / Math.log(2)); + while (count) { + str += str; + count--; + } + str += str.substring(0, maxCount - str.length); + return str; + }; +} diff --git a/test.js b/test.js index b073a51..ef30c84 100644 --- a/test.js +++ b/test.js @@ -190,4 +190,7 @@ describe('special cases', function() { assert.equal(sprintf("|%*.*s|", 4, 0, "sheetjs"), "| |"); assert.equal(sprintf("|%*.*s|", 4, -1, "sheetjs"), "|sheetjs|"); }); + it('handles long strings', function() { + for(var i = 10; i <= 1000; i+= 10) assert.equal(sprintf("%" + i + "s", "abc").length, i); + }); }); diff --git a/types/bin_printj.ts b/types/bin_printj.ts index f5de475..c1c5d67 100644 --- a/types/bin_printj.ts +++ b/types/bin_printj.ts @@ -1,8 +1,8 @@ /* printj.ts (C) 2016-present SheetJS -- http://sheetjs.com */ /* vim: set ts=2 ft=typescript: */ -/*jshint node:true, evil:true */ +/// import X = require("printj"); -let argv = ["n:1","a","e:null","f:3.4", "b:true", "e:1+1"]; +const argv = ["n:1","a","e:null","f:3.4", "b:true", "e:1+1"]; function help() { [ @@ -10,6 +10,7 @@ function help() { "", "Options:", " -h, --help output usage information", +" -d, --dump print debug information about format string", "", "Arguments are treated as strings unless prefaced by a type indicator:", " n: call parseInt (ex. n:3 -> 3)", @@ -32,22 +33,32 @@ return 0; } function parse_arg(arg: string): any { - let m: string = arg.substr(2), p: number = 0; + const m: string = arg.substr(2); + let p: number = 0; if(arg.charCodeAt(1) === 58) switch((p = arg.charCodeAt(0))) { case /*n*/ 110: return parseInt(m, 10); case /*f*/ 102: return parseFloat(m); case /*b*/ 98: return !(m.toUpperCase() === "FALSE" || m === "0"); case /*j*/ 106: return JSON.parse(m); + case /*e*/ 101: return /*eval*/(m); case /*s*/ 115: return m; } return arg; } -let args: any[] = []; +const args: any[] = []; let fmt = "", n = 0; for(let i = 2; i < argv.length; ++i) switch(argv[i]) { - case "--help": case "-h": break; + case "--help": case "-h": process.exit(help()); break; + case "--dump": case "-d": if(fmt.length===0) fmt = argv[++i]; process.exit(dump(fmt)); break; default: if(n++ === 0) fmt = argv[i]; else args.push(parse_arg(argv[i])); } console.log(X.vsprintf(fmt, args)); +process.exit(0); + +function dump(fmt: string): number { + if(!fmt) { console.error("printj: missing format argument"); return 1; } + // X._tokenize(fmt).forEach(function(x){console.log(x);}); + return 0; +} diff --git a/types/tsconfig.json b/types/tsconfig.json index 7a65429..5c276fe 100644 --- a/types/tsconfig.json +++ b/types/tsconfig.json @@ -4,7 +4,7 @@ "lib": [ "es5", "dom" ], "noImplicitAny": true, "noImplicitThis": true, - "strictNullChecks": false, + "strictNullChecks": true, "baseUrl": ".", "paths": { "printj": ["."] }, "types": [], diff --git a/types/tslint.json b/types/tslint.json index d9401a9..a4589d3 100644 --- a/types/tslint.json +++ b/types/tslint.json @@ -1,11 +1,13 @@ { "extends": "dtslint/dtslint.json", "rules": { + "no-implicit-dependencies": false, "whitespace": false, "no-sparse-arrays": false, "only-arrow-functions": false, "no-consecutive-blank-lines": false, "prefer-conditional-expression": false, + "prefer-const": true, "one-variable-per-declaration": false } }