From 35ed07bfb6464eef0fe30312e26e338993afc641 Mon Sep 17 00:00:00 2001 From: SheetJS Date: Wed, 4 Jan 2017 21:34:31 -0500 Subject: [PATCH] version bump 1.0.0 - added dist and minified source - sharpened node check --- .gitignore | 1 + Makefile | 11 +- README.md | 8 +- bits/01_version.js | 2 +- bits/{12_regexp.js => 02_regexp.js} | 2 +- bits/50_doit.js | 3 +- bits/80_wrapper.js | 1 - bits/Makefile | 2 +- bits/regex.js | 2 +- ctest/index.html | 2 + ctest/printj.js | 7 +- dist/LICENSE | 14 + dist/printj.js | 601 ++++++++++++++++++++++++++++ dist/printj.min.js | 2 + dist/printj.min.map | 1 + index.html | 2 + misc/strip_sourcemap.sh | 11 + package.json | 8 +- printj.flow.js | 7 +- printj.js | 7 +- 20 files changed, 670 insertions(+), 24 deletions(-) rename bits/{12_regexp.js => 02_regexp.js} (50%) create mode 100644 dist/LICENSE create mode 100644 dist/printj.js create mode 100644 dist/printj.min.js create mode 100644 dist/printj.min.map create mode 100755 misc/strip_sourcemap.sh diff --git a/.gitignore b/.gitignore index f32ece5..bc55255 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules misc/coverage.html ctest/sauce* +*.sheetjs diff --git a/Makefile b/Makefile index 8eff13a..fc2ecd9 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,13 @@ clean: clean-stress ## Remove targets and build artifacts @OUTDIR=$(PWD)/lib make -C bits clean rm -f $(TARGET) $(FLOWTARGET) +.PHONY: dist +dist: $(TARGET) ## Prepare JS files for distribution + cp $(TARGET) dist/ + cp LICENSE dist/ + uglifyjs $(TARGET) -o dist/$(LIB).min.js --source-map dist/$(LIB).min.map --preamble "$$(head -n 1 bits/00_header.js)" + misc/strip_sourcemap.sh dist/$(LIB).min.js + ## Testing .PHONY: test mocha @@ -49,8 +56,8 @@ ctest: ## Build browser test (into ctest/ subdirectory) ctestserv: ## Start a test server on port 8000 @cd ctest && python -mSimpleHTTPServer -.PHONY: stress ## Run stress tests -stress: +.PHONY: stress +stress: ## Run stress tests @make -C stress clean @make -C stress @make -C stress test diff --git a/README.md b/README.md index a6ad578..73cc188 100644 --- a/README.md +++ b/README.md @@ -93,12 +93,18 @@ granted by the Apache 2.0 license are reserved by the Original Author. ## Badges -[![Build Status](https://saucelabs.com/browser-matrix/printj.svg)](https://saucelabs.com/beta/builds/3b968565c1d942069871fa35eae5162f) +[![Build Status](https://saucelabs.com/browser-matrix/printj.svg)](https://saucelabs.com/u/printj) [![Build Status](https://travis-ci.org/SheetJS/printj.svg?branch=master)](https://travis-ci.org/SheetJS/printj) [![Coverage Status](http://img.shields.io/coveralls/SheetJS/printj/master.svg)](https://coveralls.io/r/SheetJS/printj?branch=master) +[![NPM Downloads](https://img.shields.io/npm/dt/printj.svg)](https://npmjs.org/package/printj) + +[![Dependencies Status](https://david-dm.org/sheetjs/printj/status.svg)](https://david-dm.org/sheetjs/printj) + +[![ghit.me](https://ghit.me/badge.svg?repo=sheetjs/printj)](https://ghit.me/repo/sheetjs/printj) + [![Analytics](https://ga-beacon.appspot.com/UA-36810333-1/SheetJS/printj?pixel)](https://github.com/SheetJS/printj) # printf format string specification diff --git a/bits/01_version.js b/bits/01_version.js index 3975aef..2729a9f 100644 --- a/bits/01_version.js +++ b/bits/01_version.js @@ -1 +1 @@ -PRINTJ.version = '0.1.1'; +PRINTJ.version = '1.0.0'; diff --git a/bits/12_regexp.js b/bits/02_regexp.js similarity index 50% rename from bits/12_regexp.js rename to bits/02_regexp.js index 901ba7c..f00e292 100644 --- a/bits/12_regexp.js +++ b/bits/02_regexp.js @@ -1,3 +1,3 @@ var REGEX/*:RegExp*/ = /%(?:%|(\d+\$)?([-+ 0#']*)?(\d*|\*(?:\d+\$)?)(?:\.(\d+|\*(?:\d+\$)?))?(hh?|ll?|[LzjtqZIw])?([diouxXfFeEgGaAcCsSpnDUOmbByYJVT]))/g; -/* |A------AB----------BC----------------CD-----------------------DE-------------------EF---------------------------------F| */ +/* |A------AB----------BC----------------CD-----------------------DE-------------------EF---------------------------------F| */ diff --git a/bits/50_doit.js b/bits/50_doit.js index 8b6e6b6..fd35105 100644 --- a/bits/50_doit.js +++ b/bits/50_doit.js @@ -2,7 +2,8 @@ #include "40_macros.js" /*:: declare var util:any; */ /*:: declare var require: any; */ -if(typeof util=='undefined' && typeof require!=='undefined')util=require("util"); +/*global process:true, util:true, require:true */ +if(typeof process !== 'undefined' && !!process.versions && !!process.versions.node) util=require("util"); var u_inspect/*:(o:any)=>string*/ = (typeof util != 'undefined') ? util.inspect : JSON.stringify; diff --git a/bits/80_wrapper.js b/bits/80_wrapper.js index 6330d12..84f9a26 100644 --- a/bits/80_wrapper.js +++ b/bits/80_wrapper.js @@ -1,6 +1,5 @@ function vsprintf(fmt/*:string*/, args/*:Array*/) { return doit(tokenize(fmt), args); } -//function sprintf() { return doit(tokenize(arguments[0]), Array.prototype.slice.call(arguments, 1)); } function sprintf()/*:string*/ { var args/*:Array*/ = new Array(arguments.length - 1); for(var i = 0; i < args.length; ++i) args[i] = arguments[i+1]; diff --git a/bits/Makefile b/bits/Makefile index d5cab6b..f6986ac 100644 --- a/bits/Makefile +++ b/bits/Makefile @@ -11,7 +11,7 @@ CPPFLAGS=-P -C -Wno-invalid-pp-token -fdollars-in-identifiers -nostdinc -Wundef .PHONY: lib lib: init $(JSFILES) - for i in $(LIBS); do cpp $(CPPFLAGS) $$i | uniq > $(OUTDIR)/$$i; done + for i in $(LIBS); do cpp $(CPPFLAGS) $$i | awk 'BEGIN{last=-3} NF>0 {last=NR} last >= NR-1' > $(OUTDIR)/$$i; done .PHONY: init init: 30_ctypes.js diff --git a/bits/regex.js b/bits/regex.js index 3b0dc79..174045d 100644 --- a/bits/regex.js +++ b/bits/regex.js @@ -1,5 +1,5 @@ #include "00_header.js" -#include "12_regexp.js" +#include "02_regexp.js" #define USE_REGEX #include "10_tokenize.js" #include "50_doit.js" diff --git a/ctest/index.html b/ctest/index.html index d58d4ad..0ad1fbb 100644 --- a/ctest/index.html +++ b/ctest/index.html @@ -1,4 +1,6 @@ + + Mocha diff --git a/ctest/printj.js b/ctest/printj.js index 0371c14..9ff0083 100644 --- a/ctest/printj.js +++ b/ctest/printj.js @@ -1,4 +1,3 @@ - /* printj.js (C) 2016-present SheetJS -- http://sheetjs.com */ /* vim: set ts=2: */ /*jshint sub:true, eqnull:true */ @@ -24,7 +23,7 @@ var PRINTJ; /*jshint ignore:end */ }(function(PRINTJ) { -PRINTJ.version = '0.1.1'; +PRINTJ.version = '1.0.0'; function tokenize(fmt) { var out = []; @@ -156,7 +155,8 @@ var padstr = { "f": "fffffffffffffffffffffffffffffffff" }; -if(typeof util=='undefined' && typeof require!=='undefined')util=require("util"); +/*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; function doit(t, args) { @@ -586,7 +586,6 @@ function doit(t, args) { function vsprintf(fmt, args) { return doit(tokenize(fmt), args); } -//function sprintf() { return doit(tokenize(arguments[0]), Array.prototype.slice.call(arguments, 1)); } function sprintf() { var args = new Array(arguments.length - 1); for(var i = 0; i < args.length; ++i) args[i] = arguments[i+1]; diff --git a/dist/LICENSE b/dist/LICENSE new file mode 100644 index 0000000..de06dc2 --- /dev/null +++ b/dist/LICENSE @@ -0,0 +1,14 @@ +Copyright (C) 2016-present SheetJS + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/dist/printj.js b/dist/printj.js new file mode 100644 index 0000000..9ff0083 --- /dev/null +++ b/dist/printj.js @@ -0,0 +1,601 @@ +/* printj.js (C) 2016-present SheetJS -- http://sheetjs.com */ +/* vim: set ts=2: */ +/*jshint sub:true, eqnull:true */ +/*exported PRINTJ */ +var PRINTJ; +(function (factory) { + /*jshint ignore:start */ + if(typeof DO_NOT_EXPORT_PRINTJ === 'undefined') { + if('object' === typeof exports) { + factory(exports); + } else if ('function' === typeof define && define.amd) { + define(function () { + var module = {}; + factory(module); + return module; + }); + } else { + factory(PRINTJ = {}); + } + } else { + factory(PRINTJ = {}); + } + /*jshint ignore:end */ +}(function(PRINTJ) { + +PRINTJ.version = '1.0.0'; + +function tokenize(fmt) { + var out = []; + var start = 0; + + var i = 0; + var infmt = false; + var fmtparam = "", fmtflags = "", fmtwidth = "", fmtprec = "", fmtlen = ""; + + var c = 0; + + var L = fmt.length; + + for(; i < L; ++i) { + c = fmt.charCodeAt(i); + if(!infmt) { + + if(c !== 37) continue; + + if(start < i) out.push(["L", fmt.substring(start, i)]); + start = i; + infmt = true; + continue; + } + + if(c >= 48 && c < 58) { + if(fmtprec.length) fmtprec += String.fromCharCode(c); + else if(c == 48 && !fmtwidth.length) fmtflags += String.fromCharCode(c); + else fmtwidth += String.fromCharCode(c); + } else switch(c) { + /* positional */ + case 36: + if(fmtprec.length) fmtprec += "$"; + else if(fmtwidth.charAt(0) == "*") fmtwidth += "$"; + else { fmtparam = fmtwidth + "$"; fmtwidth = ""; } + break; + + /* flags */ + case 39: fmtflags += "'"; break; + case 45: fmtflags += "-"; break; + case 43: fmtflags += "+"; break; + case 32: fmtflags += " "; break; + case 35: fmtflags += "#"; break; + + /* width and precision */ + case 46: fmtprec = "."; break; + case 42: + if(fmtprec.charAt(0) == ".") fmtprec += "*"; + else fmtwidth += "*"; + break; + + /* length */ + case 104: + case 108: + if(fmtlen.length > 1) throw "bad length " + fmtlen + String(c); + fmtlen += String.fromCharCode(c); + break; + + case 76: + case 106: + case 122: + case 116: + case 113: + case 90: + case 119: + if(fmtlen !== "") throw "bad length " + fmtlen + String.fromCharCode(c); + fmtlen = String.fromCharCode(c); + break; + + case 73: + if(fmtlen !== "") throw "bad length " + fmtlen + 'I'; + fmtlen = 'I'; + break; + + /* conversion */ + case 100: + case 105: + case 111: + case 117: + case 120: + case 88: + case 102: + case 70: + case 101: + case 69: + case 103: + case 71: + case 97: + case 65: + case 99: + case 67: + case 115: + case 83: + case 112: + case 110: + case 68: + case 85: + case 79: + case 109: + case 98: + case 66: + case 121: + case 89: + case 74: + case 86: + case 84: + case 37: + infmt = false; + if(fmtprec.length > 1) fmtprec = fmtprec.substr(1); + out.push([String.fromCharCode(c), fmt.substring(start, i+1), fmtparam, fmtflags, fmtwidth, fmtprec, fmtlen]); + start = i+1; + fmtlen = fmtprec = fmtwidth = fmtflags = fmtparam = ""; + break; + default: + throw new Error("Invalid format string starting with |" + fmt.substring(start, i+1) + "|"); + } + + } + + if(start < fmt.length) out.push(["L", fmt.substring(start)]); + 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; + +function doit(t, args) { + var o = []; + var argidx = 0, idx = 0; + var Vnum = 0; + var pad = ""; + for(var i = 0; i < t.length; ++i) { + var m = t[i], c = (m[0]).charCodeAt(0); + /* m order: conv full param flags width prec length */ + + if(c === /*L*/ 76) { o.push(m[1]); continue; } + if(c === /*%*/ 37) { o.push("%"); continue; } + + var O = ""; + var isnum = 0, radix = 10, bytes = 4, sign = false; + + /* flags */ + var flags = m[3]||""; + var alt = flags.indexOf("#") > -1; + + /* position */ + if(m[2]) argidx = parseInt(m[2])-1; + /* %m special case */ + else if(c === /*m*/ 109 && !alt) { o.push("Success"); continue; } + + /* grab width */ + var width = 0; if(m[ 4] != null && m[ 4].length > 0) { if(m[ 4].charAt(0) !== '*') width = parseInt(m[ 4], 10); else if(m[ 4].length === 1) width = args[idx++]; else width = args[parseInt(m[ 4].substr(1), 10)-1]; } + + /* grab precision */ + var prec = -1; if(m[ 5] != null && m[ 5].length > 0) { if(m[ 5].charAt(0) !== '*') prec = parseInt(m[ 5], 10); else if(m[ 5].length === 1) prec = args[idx++]; else prec = args[parseInt(m[ 5].substr(1), 10)-1]; } + + /* position not specified */ + if(!m[2]) argidx = idx++; + + /* grab argument */ + var arg = args[argidx]; + + /* grab length */ + var len = m[6] || ""; + + switch(c) { + /* str cCsS */ + + case /*S*/ 83: + case /*s*/ 115: + /* 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; } } + break; + + /* first char of string or convert */ + case /*C*/ 67: + case /*c*/ 99: + switch(typeof arg) { + case "number": + var cc = arg; + if(c == 67 || len.charCodeAt(0) === /*l*/ 108) { cc &= 0xFFFFFFFF; O = String.fromCharCode( cc); } + else cc &= 0xFF; O = String.fromCharCode( cc); + break; + 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; } } + break; + + /* int diDuUoOxXbB */ + + /* signed integer */ + case /*D*/ 68: bytes = 8; + /* falls through */ + case /*d*/ 100: + case /*i*/ 105: isnum = -1; sign = true; break; + + /* unsigned integer */ + case /*U*/ 85: bytes = 8; + /* falls through */ + case /*u*/ 117: isnum = -1; break; + + /* unsigned octal */ + case /*O*/ 79: bytes = 8; + /* falls through */ + case /*o*/ 111: isnum = -1; radix = (8); break; + + /* unsigned hex */ + case /*x*/ 120: isnum = -1; radix = (-16); break; + case /*X*/ 88: isnum = -1; radix = (16); break; + + /* unsigned binary (extension) */ + case /*B*/ 66: bytes = 8; + /* falls through */ + case /*b*/ 98: isnum = -1; radix = (2); break; + + /* flt fegFEGaA */ + + /* floating point logic */ + case /*F*/ 70: + case /*f*/ 102: isnum = (1); break; + + case /*E*/ 69: + case /*e*/ 101: isnum = (2); break; + + case /*G*/ 71: + case /*g*/ 103: isnum = (3); break; + + /* floating hex */ + case /*A*/ 65: + case /*a*/ 97: isnum = (4); break; + + /* misc pnmJVTyY */ + + /* JS has no concept of pointers so interpret the `l` key as an address */ + case /*p*/ 112: + Vnum = typeof arg == "number" ? arg : arg ? Number(arg.l) : -1; + if(isNaN(Vnum)) Vnum = -1; + if(alt) O = Vnum.toString(10); + else { + Vnum = Math.abs(Vnum); + O = "0x" + Vnum.toString(16).toLowerCase(); + } + break; + + /* store length in the `len` key */ + case /*n*/ 110: + if(arg) { arg.len=0; for(var oo = 0; oo < o.length; ++oo) arg.len += o[oo].length; } + continue; + + /* process error */ + case /*m*/ 109: + if(!(arg instanceof Error)) O = "Success"; + else if(arg.message) O = arg.message; + else if(arg.errno) O = "Error number " + arg.errno; + else O = "Error " + String(arg); + break; + + /* JS-specific conversions (extension) */ + case /*J*/ 74: O = (alt ? u_inspect : JSON.stringify)(arg); break; + case /*V*/ 86: O = arg == null ? "null" : String(arg.valueOf()); break; + case /*T*/ 84: + if(alt) { /* from '[object %s]' extract %s */ + O = Object.prototype.toString.call(arg).substr(8); + O = O.substr(0, O.length - 1); + } else O = typeof arg; + break; + + /* boolean (extension) */ + case /*Y*/ 89: + case /*y*/ 121: + O = Boolean(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; } } + break; + + } + + if(isnum == -1) { + + Vnum = Number(arg); + + /* parse byte length field */ + + switch(len) { + /* char */ + case "hh": { bytes = 1; } break; + /* short */ + case "h": { bytes = 2; } break; + + /* long */ + case "l": { if(bytes == 4) bytes = 8; } break; + + /* long long */ + case "L": + case "q": + case "ll": { if(bytes == 4) bytes = 8; } break; + + /* intmax_t */ + case "j": { if(bytes == 4) bytes = 8; } break; + + /* ptrdiff_t */ + case "t": { if(bytes == 4) bytes = 8; } break; + + /* size_t */ + case "z": + case "Z": { if(bytes == 4) bytes = 8; } break; + + /* CRT size_t or ptrdiff_t */ + case "I": + + { if(bytes == 4) bytes = 8; } + + break; + + /* CRT wchar_t */ + case "w": break; + } + + /* restrict value */ + + switch(bytes) { + case 1: Vnum = (Vnum & 0xFF); if(sign && (Vnum > 0x7F)) Vnum -= (0xFF + 1); break; + case 2: Vnum = (Vnum & 0xFFFF); if(sign && (Vnum > 0x7FFF)) Vnum -= (0xFFFF + 1); break; + case 4: Vnum = sign ? (Vnum | 0) : (Vnum >>> 0); break; + default: Vnum = isNaN(Vnum) ? 0 : Math.round(Vnum); break; + } + + /* generate string */ + if(bytes > 4 && Vnum < 0 && !sign) { + 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; + 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; + 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; + } 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]; + var di = d1.length - 1; + while(Vnum > 0) { + if((d1[di] -= (Vnum % 10)) < 0) { d1[di] += 10; d1[di-1]--; } + --di; Vnum = Math.floor(Vnum / 10); + } + O = d1.join(""); + } + } else { + if(radix === -16) O = Vnum.toString(16).toLowerCase(); + else if(radix === 16) O = Vnum.toString(16).toUpperCase(); + else O = Vnum.toString(radix); + } + + /* apply precision */ + 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); + } + + /* add prefix for # form */ + if(!sign && alt && Vnum !== 0) switch(radix) { + case -16: O = "0x" + O; break; + case 16: O = "0X" + O; break; + case 8: if(O.charAt(0) != "0") O = "0" + O; break; + case 2: O = "0b" + O; break; + } + } + + /* add sign character */ + if(sign && O.charAt(0) != "-") { + if(flags.indexOf("+") > -1) O = "+" + O; + else if(flags.indexOf(" ") > -1) O = " " + O; + } + /* width */ + if(width > 0) { + if(O.length < width) { + if(flags.indexOf("-") > -1) { + O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(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(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); + } + 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; + } + } + } + + } else if(isnum > 0) { + + Vnum = Number(arg); + if(arg === null) Vnum = 0/0; + if(len == "L") bytes = 12; + var isf = isFinite(Vnum); + if(!isf) { /* Infinity or NaN */ + if(Vnum < 0) O = "-"; + else if(flags.indexOf("+") > -1) O = "+"; + else if(flags.indexOf(" ") > -1) O = " "; + O += (isNaN(Vnum)) ? "nan" : "inf"; + } else { + var E = 0; + + if(prec == -1 && isnum != 4) prec = 6; + + /* g/G conditional behavior */ + if(isnum == 3) { + O = Vnum.toExponential(1); + E = +O.substr(O.indexOf("e") + 1); + if(prec === 0) prec = 1; + if(prec > E && E >= -4) { isnum = (11); prec = prec -(E + 1); } + else { isnum = (12); prec = prec - 1; } + } + + /* sign: workaround for negative zero */ + var sg = (Vnum < 0 || 1/Vnum == -Infinity) ? "-" : ""; + if(Vnum < 0) Vnum = -Vnum; + + switch(isnum) { + /* f/F standard */ + case 1: case 11: + if(Vnum < 1e21) { + O = Vnum.toFixed(prec); + if(isnum == 1) { if(prec===0 &&alt&& O.indexOf(".")==-1) O+="."; } + else if(!alt) O=O.replace(/(\.\d*[1-9])0*$/,"$1").replace(/\.0*$/,""); + else if(O.indexOf(".") == -1) O+= "."; + break; + } + 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) : ""); + break; + + /* e/E exponential */ + case 2: case 12: + O = Vnum.toExponential(prec); + E = O.indexOf("e"); + if(O.length - E === 3) O = O.substr(0, E+2) + "0" + O.substr(E+2); + if(alt && O.indexOf(".") == -1) O = O.substr(0,E) +"."+ O.substr(E); + else if(!alt && isnum == 12) O = O.replace(/\.0*e/, "e").replace(/\.(\d*[1-9])0*e/, ".$1e"); + break; + + /* a/A hex */ + case 4: + if(Vnum===0){O= "0x0"+((alt||prec>0)?"."+(prec >= 0 ? padstr["0"].substr(0,prec) : ""):"")+"p+0"; break;} + O = Vnum.toString(16); + /* First char 0-9 */ + var ac = O.charCodeAt(0); + if(ac == 48) { + ac = 2; E = -4; Vnum *= 16; + while(O.charCodeAt(ac++) == 48) { E -= 4; Vnum *= 16; } + O = Vnum.toString(16); + ac = O.charCodeAt(0); + } + + var ai = O.indexOf("."); + if(O.indexOf("(") > -1) { + /* IE exponential form */ + var am = O.match(/\(e(.*)\)/); + var ae = am ? (+am[1]) : 0; + E += 4 * ae; Vnum /= Math.pow(16, ae); + } else if(ai > 1) { + E += 4 * (ai - 1); Vnum /= Math.pow(16, ai - 1); + } else if(ai == -1) { + E += 4 * (O.length - 1); Vnum /= Math.pow(16, O.length - 1); + } + + /* at this point 1 <= Vnum < 16 */ + + if(bytes > 8) { + if(ac < 50) { E -= 3; Vnum *= 8; } + else if(ac < 52) { E -= 2; Vnum *= 4; } + else if(ac < 56) { E -= 1; Vnum *= 2; } + /* at this point 8 <= Vnum < 16 */ + } else { + if(ac >= 56) { E += 3; Vnum /= 8; } + else if(ac >= 52) { E += 2; Vnum /= 4; } + else if(ac >= 50) { E += 1; Vnum /= 2; } + /* at this point 1 <= Vnum < 2 */ + } + + O = Vnum.toString(16); + if(O.length > 1) { + if(O.length > prec+2 && O.charCodeAt(prec+2) >= 56) { + var _f = O.charCodeAt(0) == 102; + O = (Vnum + 8 * Math.pow(16, -prec-1)).toString(16); + if(_f && O.charCodeAt(0) == 49) E += 4; + } + 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)) : ""); + } + } else if(prec === 0) O = O.charAt(0) + (alt ? "." : ""); + } else if(prec > 0) O = O + "." + (prec >= 0 ? padstr["0"].substr(0,prec) : ""); + else if(alt) O = O + "."; + O = "0x" + O + "p" + (E>=0 ? "+" + E : E); + break; + } + + if(sg === "") { + if(flags.indexOf("+") > -1) sg = "+"; + else if(flags.indexOf(" ") > -1) sg = " "; + } + + O = sg + O; + } + + /* width */ + if(width > O.length) { + if(flags.indexOf("-") > -1) { + O = O + ((width - O.length) >= 0 ? padstr[ " "].substr(0,(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)) : ""); + 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); + } + 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; + } + } + if(c < 96) O = O.toUpperCase(); + + } + + o.push(O); + } + return o.join(""); +} + +function vsprintf(fmt, args) { return doit(tokenize(fmt), args); } + +function sprintf() { + var args = new Array(arguments.length - 1); + for(var i = 0; i < args.length; ++i) args[i] = arguments[i+1]; + return doit(tokenize(arguments[0]), args); +} + +PRINTJ.sprintf = sprintf; +PRINTJ.vsprintf = vsprintf; +PRINTJ._doit = doit; +PRINTJ._tokenize = tokenize; + +})); + diff --git a/dist/printj.min.js b/dist/printj.min.js new file mode 100644 index 0000000..7e1d0bc --- /dev/null +++ b/dist/printj.min.js @@ -0,0 +1,2 @@ +/* printj.js (C) 2016-present SheetJS -- http://sheetjs.com */ +var PRINTJ;(function(factory){if(typeof DO_NOT_EXPORT_PRINTJ==="undefined"){if("object"===typeof exports){factory(exports)}else if("function"===typeof define&&define.amd){define(function(){var module={};factory(module);return module})}else{factory(PRINTJ={})}}else{factory(PRINTJ={})}})(function(PRINTJ){PRINTJ.version="1.0.0";function tokenize(fmt){var out=[];var start=0;var i=0;var infmt=false;var fmtparam="",fmtflags="",fmtwidth="",fmtprec="",fmtlen="";var c=0;var L=fmt.length;for(;i=48&&c<58){if(fmtprec.length)fmtprec+=String.fromCharCode(c);else if(c==48&&!fmtwidth.length)fmtflags+=String.fromCharCode(c);else fmtwidth+=String.fromCharCode(c)}else switch(c){case 36:if(fmtprec.length)fmtprec+="$";else if(fmtwidth.charAt(0)=="*")fmtwidth+="$";else{fmtparam=fmtwidth+"$";fmtwidth=""}break;case 39:fmtflags+="'";break;case 45:fmtflags+="-";break;case 43:fmtflags+="+";break;case 32:fmtflags+=" ";break;case 35:fmtflags+="#";break;case 46:fmtprec=".";break;case 42:if(fmtprec.charAt(0)==".")fmtprec+="*";else fmtwidth+="*";break;case 104:case 108:if(fmtlen.length>1)throw"bad length "+fmtlen+String(c);fmtlen+=String.fromCharCode(c);break;case 76:case 106:case 122:case 116:case 113:case 90:case 119:if(fmtlen!=="")throw"bad length "+fmtlen+String.fromCharCode(c);fmtlen=String.fromCharCode(c);break;case 73:if(fmtlen!=="")throw"bad length "+fmtlen+"I";fmtlen="I";break;case 100:case 105:case 111:case 117:case 120:case 88:case 102:case 70:case 101:case 69:case 103:case 71:case 97:case 65:case 99:case 67:case 115:case 83:case 112:case 110:case 68:case 85:case 79:case 109:case 98:case 66:case 121:case 89:case 74:case 86:case 84:case 37:infmt=false;if(fmtprec.length>1)fmtprec=fmtprec.substr(1);out.push([String.fromCharCode(c),fmt.substring(start,i+1),fmtparam,fmtflags,fmtwidth,fmtprec,fmtlen]);start=i+1;fmtlen=fmtprec=fmtwidth=fmtflags=fmtparam="";break;default:throw new Error("Invalid format string starting with |"+fmt.substring(start,i+1)+"|")}}if(start-1;if(m[2])argidx=parseInt(m[2])-1;else if(c===109&&!alt){o.push("Success");continue}var width=0;if(m[4]!=null&&m[4].length>0){if(m[4].charAt(0)!=="*")width=parseInt(m[4],10);else if(m[4].length===1)width=args[idx++];else width=args[parseInt(m[4].substr(1),10)-1]}var prec=-1;if(m[5]!=null&&m[5].length>0){if(m[5].charAt(0)!=="*")prec=parseInt(m[5],10);else if(m[5].length===1)prec=args[idx++];else prec=args[parseInt(m[5].substr(1),10)-1]}if(!m[2])argidx=idx++;var arg=args[argidx];var len=m[6]||"";switch(c){case 83:case 115: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}}break;case 67:case 99:switch(typeof arg){case"number":var cc=arg;if(c==67||len.charCodeAt(0)===108){cc&=4294967295;O=String.fromCharCode(cc)}else cc&=255;O=String.fromCharCode(cc);break;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}}break;case 68:bytes=8;case 100:case 105:isnum=-1;sign=true;break;case 85:bytes=8;case 117:isnum=-1;break;case 79:bytes=8;case 111:isnum=-1;radix=8;break;case 120:isnum=-1;radix=-16;break;case 88:isnum=-1;radix=16;break;case 66:bytes=8;case 98:isnum=-1;radix=2;break;case 70:case 102:isnum=1;break;case 69:case 101:isnum=2;break;case 71:case 103:isnum=3;break;case 65:case 97:isnum=4;break;case 112:Vnum=typeof arg=="number"?arg:arg?Number(arg.l):-1;if(isNaN(Vnum))Vnum=-1;if(alt)O=Vnum.toString(10);else{Vnum=Math.abs(Vnum);O="0x"+Vnum.toString(16).toLowerCase()}break;case 110:if(arg){arg.len=0;for(var oo=0;oo=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}}break}if(isnum==-1){Vnum=Number(arg);switch(len){case"hh":{bytes=1}break;case"h":{bytes=2}break;case"l":{if(bytes==4)bytes=8}break;case"L":case"q":case"ll":{if(bytes==4)bytes=8}break;case"j":{if(bytes==4)bytes=8}break;case"t":{if(bytes==4)bytes=8}break;case"z":case"Z":{if(bytes==4)bytes=8}break;case"I":{if(bytes==4)bytes=8}break;case"w":break}switch(bytes){case 1:Vnum=Vnum&255;if(sign&&Vnum>127)Vnum-=255+1;break;case 2:Vnum=Vnum&65535;if(sign&&Vnum>32767)Vnum-=65535+1;break;case 4:Vnum=sign?Vnum|0:Vnum>>>0;break;default:Vnum=isNaN(Vnum)?0:Math.round(Vnum);break}if(bytes>4&&Vnum<0&&!sign){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;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;Vnum=Math.floor((Vnum-(Vnum>>>0&1073741823))/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}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];var di=d1.length-1;while(Vnum>0){if((d1[di]-=Vnum%10)<0){d1[di]+=10;d1[di-1]--}--di;Vnum=Math.floor(Vnum/10)}O=d1.join("")}}else{if(radix===-16)O=Vnum.toString(16).toLowerCase();else if(radix===16)O=Vnum.toString(16).toUpperCase();else O=Vnum.toString(radix)}if(prec===0&&O=="0"&&!(radix==8&&alt))O="";else{if(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(!sign&&alt&&Vnum!==0)switch(radix){case-16:O="0x"+O;break;case 16:O="0X"+O;break;case 8:if(O.charAt(0)!="0")O="0"+O;break;case 2:O="0b"+O;break}}if(sign&&O.charAt(0)!="-"){if(flags.indexOf("+")>-1)O="+"+O;else if(flags.indexOf(" ")>-1)O=" "+O}if(width>0){if(O.length-1){O=O+(width-O.length>=0?padstr[" "].substr(0,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(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)}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}}}}else if(isnum>0){Vnum=Number(arg);if(arg===null)Vnum=0/0;if(len=="L")bytes=12;var isf=isFinite(Vnum);if(!isf){if(Vnum<0)O="-";else if(flags.indexOf("+")>-1)O="+";else if(flags.indexOf(" ")>-1)O=" ";O+=isNaN(Vnum)?"nan":"inf"}else{var E=0;if(prec==-1&&isnum!=4)prec=6;if(isnum==3){O=Vnum.toExponential(1);E=+O.substr(O.indexOf("e")+1);if(prec===0)prec=1;if(prec>E&&E>=-4){isnum=11;prec=prec-(E+1)}else{isnum=12;prec=prec-1}}var sg=Vnum<0||1/Vnum==-Infinity?"-":"";if(Vnum<0)Vnum=-Vnum;switch(isnum){case 1:case 11:if(Vnum<1e21){O=Vnum.toFixed(prec);if(isnum==1){if(prec===0&&alt&&O.indexOf(".")==-1)O+="."}else if(!alt)O=O.replace(/(\.\d*[1-9])0*$/,"$1").replace(/\.0*$/,"");else if(O.indexOf(".")==-1)O+=".";break}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):"");break;case 2:case 12:O=Vnum.toExponential(prec);E=O.indexOf("e");if(O.length-E===3)O=O.substr(0,E+2)+"0"+O.substr(E+2);if(alt&&O.indexOf(".")==-1)O=O.substr(0,E)+"."+O.substr(E);else if(!alt&&isnum==12)O=O.replace(/\.0*e/,"e").replace(/\.(\d*[1-9])0*e/,".$1e");break;case 4:if(Vnum===0){O="0x0"+(alt||prec>0?"."+(prec>=0?padstr["0"].substr(0,prec):""):"")+"p+0";break}O=Vnum.toString(16);var ac=O.charCodeAt(0);if(ac==48){ac=2;E=-4;Vnum*=16;while(O.charCodeAt(ac++)==48){E-=4;Vnum*=16}O=Vnum.toString(16);ac=O.charCodeAt(0)}var ai=O.indexOf(".");if(O.indexOf("(")>-1){var am=O.match(/\(e(.*)\)/);var ae=am?+am[1]:0;E+=4*ae;Vnum/=Math.pow(16,ae)}else if(ai>1){E+=4*(ai-1);Vnum/=Math.pow(16,ai-1)}else if(ai==-1){E+=4*(O.length-1);Vnum/=Math.pow(16,O.length-1)}if(bytes>8){if(ac<50){E-=3;Vnum*=8}else if(ac<52){E-=2;Vnum*=4}else if(ac<56){E-=1;Vnum*=2}}else{if(ac>=56){E+=3;Vnum/=8}else if(ac>=52){E+=2;Vnum/=4}else if(ac>=50){E+=1;Vnum/=2}}O=Vnum.toString(16);if(O.length>1){if(O.length>prec+2&&O.charCodeAt(prec+2)>=56){var _f=O.charCodeAt(0)==102;O=(Vnum+8*Math.pow(16,-prec-1)).toString(16);if(_f&&O.charCodeAt(0)==49)E+=4}if(prec>0){O=O.substr(0,prec+2);if(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):""}}else if(prec===0)O=O.charAt(0)+(alt?".":"")}else if(prec>0)O=O+"."+(prec>=0?padstr["0"].substr(0,prec):"");else if(alt)O=O+".";O="0x"+O+"p"+(E>=0?"+"+E:E);break}if(sg===""){if(flags.indexOf("+")>-1)sg="+";else if(flags.indexOf(" ")>-1)sg=" "}O=sg+O}if(width>O.length){if(flags.indexOf("-")>-1){O=O+(width-O.length>=0?padstr[" "].substr(0,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):"";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)}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}}if(c<96)O=O.toUpperCase()}o.push(O)}return o.join("")}function vsprintf(fmt,args){return doit(tokenize(fmt),args)}function sprintf(){var args=new Array(arguments.length-1);for(var i=0;i