zhongrj
2025-11-25 b89962006164a462404b79a738bee8cbb6d7fe7e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
const FileSaver = require('file-saver');
 
let escapeEntityMap = {
  "&": "&",
  "<": "&lt;",
  ">": "&gt;",
  '"': '&quot;',
  "'": '&#39;',
  "/": '&#x2F;'
};
 
export default {
    // to be used on individual strings
    escapeHtml: function(string) {
      return String(string).replace(/[&<>"'\/]/g, function (s) {
        return escapeEntityMap[s];
      });
    },
 
    // To be used with tagged templates
    html: function(pieces){
        let result = pieces[0];
        let substitutions = [].slice.call(arguments, 1);
        for (let i = 0; i < substitutions.length; ++i) {
            result += this.escapeHtml(substitutions[i]) + pieces[i + 1];
        }
 
        return result;
    },
 
    queryParams: function(location){
      let params = {};
      let paramsRaw = (location.search.replace("?", "").match(/([^&=]+)=?([^&]*)/g) || []);
      for (let i in paramsRaw){
        let parts = paramsRaw[i].split("=");
        if (parts[1] !== undefined){
            params[parts[0]] = parts[1];
        }
      }
      return params;
    },
 
    toSearchQuery: function(params){
      let parts = [];
      for (let k in params){
        parts.push(k + "=" + params[k]);
      }
      if (parts.length > 0) return "?" + parts.join("&");
      else return "";
    },
 
    replaceSearchQueryParam: function(location, param, value){
      let q = this.queryParams(location);
      q[param] = value;
      return this.toSearchQuery(q);
    },
 
    buildUrlWithQuery: function(url, params){
        return (url.indexOf("?") !== -1 ? url.slice(0, url.indexOf("?")) : url) + this.toSearchQuery(params);
    },
 
    clone: function(obj){
      return JSON.parse(JSON.stringify(obj));
    },
 
    // "/a/b" --> http://localhost/a/b
    absoluteUrl: function(path, href = window.location.href){
      if (path[0] === '/') path = path.slice(1);
 
      let parser = document.createElement('a');
      parser.href = href;
 
      return `${parser.protocol}//${parser.host}/${path}`;
    },
 
    assert: function(condition, message) {
        if (!condition) {
            message = message || "Assertion failed";
            if (typeof Error !== "undefined") {
                throw new Error(message);
            }
            throw message; // Fallback
        }
    },
 
    getCurrentScriptDir: function(){
      let scripts= document.getElementsByTagName('script');
      let path= scripts[scripts.length-1].src.split('?')[0];      // remove any ?query
      let mydir= path.split('/').slice(0, -1).join('/')+'/';  // remove last filename part of path
      return mydir;
    },
 
    saveAs: function(text, filename){
      var blob = new Blob([text], {type: "text/plain;charset=utf-8"});
      FileSaver.saveAs(blob, filename);
    },
 
    // http://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript
    bytesToSize: function(bytes, decimals = 2){
      if(bytes == 0) return '0 byte';
      var k = 1000; // or 1024 for binary
      var dm = decimals || 3;
      var sizes = ['bytes', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb', 'Eb', 'Zb', 'Yb'];
      var i = Math.floor(Math.log(bytes) / Math.log(k));
      return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
    },
 
    isMobile: function(){
      return navigator.userAgent.match(/(iPad)|(iPhone)|(iPod)|(android)|(webOS)/i);
    },
 
    userInputToFilename(text, extension = ""){
      return text.replace(/[^0-9a-zA-Z-_]+/g, '').replace(/(\s|\/)+/g, "-") + extension;
    },
 
    uuidv4(){
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
        var r = Math.random() * 16 | 0,
            v = c === 'x' ? r : r & 0x3 | 0x8;
        return v.toString(16);
      });
    }
};