UNPKG

@darwino/darwino

Version:

A set of Javascript classes and utilities

358 lines (335 loc) 10.6 kB
/*!COPYRIGHT HEADER! - CONFIDENTIAL * * Darwino Inc Confidential. * * (c) Copyright Darwino Inc. 2014-2016. * * Notice: The information contained in the source code for these files is the property * of Darwino Inc. which, with its licensors, if any, owns all the intellectual property * rights, including all copyright rights thereto. Such information may only be used * for debugging, troubleshooting and informational purposes. All other uses of this information, * including any production or commercial uses, are prohibited. */ // // General purpose JavaScript utilities // const Utils = { // // Type checking // isString: function(v) { return v && (typeof v==="string" || v instanceof String); }, isObject: function(v) { return v && (typeof v==="object" || v instanceof Object); }, isArray: function(v) { return v && (typeof v==="array" || v instanceof Array); }, isNumber: function(v) { return v && (typeof v==="number" || v instanceof Number); }, isBoolean: function(v) { return v && (typeof v==="boolean" || v instanceof Boolean); }, isDate: function(v) { return v && (v instanceof Date); }, isFunction: function(v) { return v && (typeof v==="function"); }, // // Handling paths // concatPath: function(/*paths*/) { var s = ""; for(var i=0; i<arguments.length; i++ ) { if(arguments[i]) { s = Utils.removeTrailingSep(s); s += s ? ('/'+Utils.removeLeadingSep(arguments[i])) : arguments[i]; } } return s; }, addTrailingSep: function(p) { return Utils.endsWith(p,'/') ? p : p+'/'; }, removeTrailingSep: function(p) { return Utils.endsWith(p,'/') ? Utils.left(p,-1) : p; }, addLeadingSep: function(p) { return Utils.startsWith(p,'/') ? p : '/'+p; }, removeLeadingSep: function(p) { return Utils.startsWith(p,'/') ? p.substring(1) : p; }, // // Handling JSON // toJson: function(value,compact) { if(value) { return compact ? JSON.stringify(value) : JSON.stringify(value,null,4); } return ""; }, fromJson: function(json) { if(json) { // Makes JSON more permissive (ex: {a:"A"} instead of {"a":"A"} //return JSON.parse(json) return eval("(" + json + ")"); } return null; }, jsonPath: null, // See support libs // // Object utilities // isEmptyObject: function(o) { if(o) { for(var n in o) { return false; } } return true; }, // // String utilities // left: function(s,length) { if(length<0) length=s.length+length; return s.substring(0,Math.min(length,s.length)); }, startsWith: function(s,prefix) { return s.length>=prefix.length && s.substring(0,prefix.length)==prefix; }, startsWithIgnoreCase: function(s,prefix) { return s.length>=prefix.length && s.substring(0,prefix.length).toLowerCase()==prefix.toLowerCase(); }, endsWith: function(s,suffix) { return s.length>=suffix.length && s.substring(s.length-suffix.length)==suffix; }, endsWithIgnoreCase: function(s,suffix) { return s.length>=suffix.length && s.substring(s.length-suffix.length).toLowerCase()==suffix.toLowerCase(); }, equals: function (s1,s2) { if(!s1) return !s2; if(!s2) return false; return s1==s2; }, equalsIgnoreCase: function (s1,s2) { if(!s1) return !s2; if(!s2) return false; return s1.toLowerCase()==s2.toLowerCase(); }, uuid: function() { // Keep the UUID 32 characters to handle some replicated system with only 32 ch (ex: FlowBuilder) //var tmpl = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; var tmpl = 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'; return tmpl.replace(/[xy]/g, function(c) { var r = Math.random()*16|0; var v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16).toUpperCase(); // Make sure it is upper case as UNID should be like this }); }, format: function(msg) { for(var i=1; i<arguments.length; i++) { msg = (msg || "").replace("{"+(i-1)+"}",arguments[i]); } return msg; }, toUtf8: function (argString) { // From: http://phpjs.org/functions // + original by: Webtoolkit.info (http://www.webtoolkit.info/) // + improved by: Kevin van Zonneveld (https://github.com/kvz/phpjs) if (argString === null || typeof argString === "undefined") { return ""; } var string = (argString + ''); // .replace(/\r\n/g, // "\n").replace(/\r/g, "\n"); var utftext = '', start, end, stringl = 0; start = end = 0; stringl = string.length; for (var n = 0; n < stringl; n++) { var c1 = string.charCodeAt(n); var enc = null; if (c1 < 128) { end++; } else if (c1 > 127 && c1 < 2048) { enc = String.fromCharCode( (c1 >> 6) | 192, ( c1 & 63) | 128 ); } else if (c1 & 0xF800 != 0xD800) { enc = String.fromCharCode( (c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, ( c1 & 63) | 128 ); } else { // surrogate pairs if (c1 & 0xFC00 != 0xD800) { throw new RangeError("Unmatched trail surrogate at " + n); } var c2 = string.charCodeAt(++n); if (c2 & 0xFC00 != 0xDC00) { throw new RangeError("Unmatched lead surrogate at " + (n-1)); } c1 = ((c1 & 0x3FF) << 10) + (c2 & 0x3FF) + 0x10000; enc = String.fromCharCode( (c1 >> 18) | 240, ((c1 >> 12) & 63) | 128, ((c1 >> 6) & 63) | 128, ( c1 & 63) | 128 ); } if (enc !== null) { if (end > start) { utftext += string.slice(start, end); } utftext += enc; start = end = n + 1; } } if (end > start) { utftext += string.slice(start, stringl); } return utftext; }, fromUtf8: function (str_data) { // From: http://phpjs.org/functions // + original by: Webtoolkit.info (http://www.webtoolkit.info/) // + input by: Aman Gupta // + improved by: Kevin van Zonneveld // (http://kevin.vanzonneveld.net) // + improved by: Norman "zEh" Fuchs // + bugfixed by: hitwork // + bugfixed by: Onno Marsman // + input by: Brett Zamir (http://brett-zamir.me) // + bugfixed by: Kevin van Zonneveld // (http://kevin.vanzonneveld.net) // + bugfixed by: kirilloid // * example 1: utf8_decode('Kevin van Zonneveld'); // * returns 1: 'Kevin van Zonneveld' var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0, c4 = 0; str_data += ''; while (i < str_data.length) { c1 = str_data.charCodeAt(i); if (c1 <= 191) { tmp_arr[ac++] = String.fromCharCode(c1); i++; } else if (c1 <= 223) { c2 = str_data.charCodeAt(i + 1); tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); i += 2; } else if (c1 <= 239) { // http://en.wikipedia.org/wiki/UTF-8#Codepage_layout c2 = str_data.charCodeAt(i + 1); c3 = str_data.charCodeAt(i + 2); tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); i += 3; } else { c2 = str_data.charCodeAt(i + 1); c3 = str_data.charCodeAt(i + 2); c4 = str_data.charCodeAt(i + 3); c1 = ((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63); c1 -= 0x10000; tmp_arr[ac++] = String.fromCharCode(0xD800 | ((c1>>10) & 0x3FF)); tmp_arr[ac++] = String.fromCharCode(0xDC00 | (c1 & 0x3FF)); i += 4; } } return tmp_arr.join(''); }, // // XML Utilities // parseXml: function(xml) { var xmlDoc=null; try { if(!document.evaluate){ xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.loadXML(xml); }else{ if(window.DOMParser){ parser=new DOMParser(); xmlDoc=parser.parseFromString(xml,"text/xml"); } } }catch(ex){ xmlDoc = undefined; } return xmlDoc; }, xmlString: function(xmlDoc) { if (!xmlDoc) { return ""; } else if(window.ActiveXObject){ return xmlDoc.xml; } else { return (new XMLSerializer()).serializeToString(xmlDoc); } }, // // Date Utilities // dateToString: function(d) { // always 24 characters long: YYYY-MM-DDTHH:mm:ss.sssZ. The timezone is always zero UTC offset, as denoted by the suffix "Z". return d ? d.toISOString() : null; }, stringToDate: function(date) { // Test here: https://regex101.com/ var regexp = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d{1,3})?(Z|(?:[+-](\d{2}):(\d{2})))?$/g; var match = regexp.exec(date); if(!match) return null var year = parseInt(match[1]); var month = parseInt(match[2]); var day = parseInt(match[3]); var hour = parseInt(match[4]); var minutes = parseInt(match[5]); var seconds = parseInt(match[6]); var milliseconds = match[7] ? parseInt(match[7].substring(1)) : 0; // timezone // it is supposed to be mandatory, at least 'Z', but if missing we assume 'Z' // In JS, we only support 'Z' and +/-HH:MM var tzOffset=0; if(match.length>8 && match[8]) { var timezoneIndicator = match[8].charAt(0); if((timezoneIndicator == '+' || timezoneIndicator == '-')) { var tzh = parseInt(match[9]); var tzm =parseInt(match[10]); tzOffset = (tzh*60*60*1000 + tzm*60*1000); if(timezoneIndicator == '+') tzOffset = -tzOffset; //} else if (timezoneIndicator == 'Z') { // // already UTC... } } var dt = Date.UTC(year,month-1,day,hour,minutes,seconds,milliseconds); return new Date(dt+tzOffset); }, // // Base64 // atob: window.atob, btoa: window.btoa, // // Misc utilities // now: function() { return (new Date()).getTime(); }, intAsString: function(l) { return l.toFixed(); }, // // Execute a callback asynchronously // execAsyncCb: function(cb,value,loaded) { if(cb) { setTimeout(function() {(cb.success||cb)(value,loaded);}); } } } export default Utils