197 lines
5.5 KiB
JavaScript
197 lines
5.5 KiB
JavaScript
|
|
/**
|
||
|
|
* JavaScript Polyfill functions for jsPDF
|
||
|
|
* Collected from public resources by
|
||
|
|
* https://github.com/diegocr
|
||
|
|
*/
|
||
|
|
|
||
|
|
(function (global) {
|
||
|
|
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
||
|
|
|
||
|
|
if (typeof global.btoa === 'undefined') {
|
||
|
|
global.btoa = function(data) {
|
||
|
|
// discuss at: http://phpjs.org/functions/base64_encode/
|
||
|
|
// original by: Tyler Akins (http://rumkin.com)
|
||
|
|
// improved by: Bayron Guevara
|
||
|
|
// improved by: Thunder.m
|
||
|
|
// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||
|
|
// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||
|
|
// improved by: Rafal Kukawski (http://kukawski.pl)
|
||
|
|
// bugfixed by: Pellentesque Malesuada
|
||
|
|
// example 1: base64_encode('Kevin van Zonneveld');
|
||
|
|
// returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
|
||
|
|
|
||
|
|
var o1,o2,o3,h1,h2,h3,h4,bits,i = 0,ac = 0,enc = '',tmp_arr = [];
|
||
|
|
|
||
|
|
if (!data) {
|
||
|
|
return data;
|
||
|
|
}
|
||
|
|
|
||
|
|
do { // pack three octets into four hexets
|
||
|
|
o1 = data.charCodeAt(i++);
|
||
|
|
o2 = data.charCodeAt(i++);
|
||
|
|
o3 = data.charCodeAt(i++);
|
||
|
|
|
||
|
|
bits = o1 << 16 | o2 << 8 | o3;
|
||
|
|
|
||
|
|
h1 = bits >> 18 & 0x3f;
|
||
|
|
h2 = bits >> 12 & 0x3f;
|
||
|
|
h3 = bits >> 6 & 0x3f;
|
||
|
|
h4 = bits & 0x3f;
|
||
|
|
|
||
|
|
// use hexets to index into b64, and append result to encoded string
|
||
|
|
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
|
||
|
|
} while (i < data.length);
|
||
|
|
|
||
|
|
enc = tmp_arr.join('');
|
||
|
|
|
||
|
|
var r = data.length % 3;
|
||
|
|
|
||
|
|
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
if (typeof global.atob === 'undefined') {
|
||
|
|
global.atob = function(data) {
|
||
|
|
// discuss at: http://phpjs.org/functions/base64_decode/
|
||
|
|
// original by: Tyler Akins (http://rumkin.com)
|
||
|
|
// improved by: Thunder.m
|
||
|
|
// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||
|
|
// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||
|
|
// input by: Aman Gupta
|
||
|
|
// input by: Brett Zamir (http://brett-zamir.me)
|
||
|
|
// bugfixed by: Onno Marsman
|
||
|
|
// bugfixed by: Pellentesque Malesuada
|
||
|
|
// bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||
|
|
// example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
|
||
|
|
// returns 1: 'Kevin van Zonneveld'
|
||
|
|
|
||
|
|
var o1,o2,o3,h1,h2,h3,h4,bits,i = 0,ac = 0,dec = '',tmp_arr = [];
|
||
|
|
|
||
|
|
if (!data) {
|
||
|
|
return data;
|
||
|
|
}
|
||
|
|
|
||
|
|
data += '';
|
||
|
|
|
||
|
|
do { // unpack four hexets into three octets using index points in b64
|
||
|
|
h1 = b64.indexOf(data.charAt(i++));
|
||
|
|
h2 = b64.indexOf(data.charAt(i++));
|
||
|
|
h3 = b64.indexOf(data.charAt(i++));
|
||
|
|
h4 = b64.indexOf(data.charAt(i++));
|
||
|
|
|
||
|
|
bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
|
||
|
|
|
||
|
|
o1 = bits >> 16 & 0xff;
|
||
|
|
o2 = bits >> 8 & 0xff;
|
||
|
|
o3 = bits & 0xff;
|
||
|
|
|
||
|
|
if (h3 == 64) {
|
||
|
|
tmp_arr[ac++] = String.fromCharCode(o1);
|
||
|
|
} else if (h4 == 64) {
|
||
|
|
tmp_arr[ac++] = String.fromCharCode(o1, o2);
|
||
|
|
} else {
|
||
|
|
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
|
||
|
|
}
|
||
|
|
} while (i < data.length);
|
||
|
|
|
||
|
|
dec = tmp_arr.join('');
|
||
|
|
|
||
|
|
return dec;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!Array.prototype.map) {
|
||
|
|
Array.prototype.map = function(fun /*, thisArg */) {
|
||
|
|
if (this === void 0 || this === null || typeof fun !== "function")
|
||
|
|
throw new TypeError();
|
||
|
|
|
||
|
|
var t = Object(this), len = t.length >>> 0, res = new Array(len);
|
||
|
|
var thisArg = arguments.length > 1 ? arguments[1] : void 0;
|
||
|
|
for (var i = 0; i < len; i++) {
|
||
|
|
// NOTE: Absolute correctness would demand Object.defineProperty
|
||
|
|
// be used. But this method is fairly new, and failure is
|
||
|
|
// possible only if Object.prototype or Array.prototype
|
||
|
|
// has a property |i| (very unlikely), so use a less-correct
|
||
|
|
// but more portable alternative.
|
||
|
|
if (i in t)
|
||
|
|
res[i] = fun.call(thisArg, t[i], i, t);
|
||
|
|
}
|
||
|
|
|
||
|
|
return res;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
if(!Array.isArray) {
|
||
|
|
Array.isArray = function(arg) {
|
||
|
|
return Object.prototype.toString.call(arg) === '[object Array]';
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!Array.prototype.forEach) {
|
||
|
|
Array.prototype.forEach = function(fun, thisArg) {
|
||
|
|
"use strict";
|
||
|
|
|
||
|
|
if (this === void 0 || this === null || typeof fun !== "function")
|
||
|
|
throw new TypeError();
|
||
|
|
|
||
|
|
var t = Object(this), len = t.length >>> 0;
|
||
|
|
for (var i = 0; i < len; i++) {
|
||
|
|
if (i in t)
|
||
|
|
fun.call(thisArg, t[i], i, t);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!Object.keys) {
|
||
|
|
Object.keys = (function () {
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty,
|
||
|
|
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
|
||
|
|
dontEnums = ['toString','toLocaleString','valueOf','hasOwnProperty',
|
||
|
|
'isPrototypeOf','propertyIsEnumerable','constructor'],
|
||
|
|
dontEnumsLength = dontEnums.length;
|
||
|
|
|
||
|
|
return function (obj) {
|
||
|
|
if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
|
||
|
|
throw new TypeError();
|
||
|
|
}
|
||
|
|
var result = [], prop, i;
|
||
|
|
|
||
|
|
for (prop in obj) {
|
||
|
|
if (hasOwnProperty.call(obj, prop)) {
|
||
|
|
result.push(prop);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (hasDontEnumBug) {
|
||
|
|
for (i = 0; i < dontEnumsLength; i++) {
|
||
|
|
if (hasOwnProperty.call(obj, dontEnums[i])) {
|
||
|
|
result.push(dontEnums[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return result;
|
||
|
|
};
|
||
|
|
}());
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!String.prototype.trim) {
|
||
|
|
String.prototype.trim = function () {
|
||
|
|
return this.replace(/^\s+|\s+$/g, '');
|
||
|
|
};
|
||
|
|
}
|
||
|
|
if (!String.prototype.trimLeft) {
|
||
|
|
String.prototype.trimLeft = function() {
|
||
|
|
return this.replace(/^\s+/g, "");
|
||
|
|
};
|
||
|
|
}
|
||
|
|
if (!String.prototype.trimRight) {
|
||
|
|
String.prototype.trimRight = function() {
|
||
|
|
return this.replace(/\s+$/g, "");
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
})(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this);
|