@igo2/utils 1.8.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bundles/igo2-utils.umd.js +1043 -1010
- package/bundles/igo2-utils.umd.js.map +1 -1
- package/esm2015/igo2-utils.js +5 -5
- package/esm2015/lib/base64.js +85 -85
- package/esm2015/lib/change.interface.js +7 -7
- package/esm2015/lib/change.js +87 -87
- package/esm2015/lib/clipboard.js +52 -52
- package/esm2015/lib/file.js +28 -28
- package/esm2015/lib/index.js +12 -12
- package/esm2015/lib/object-utils.js +248 -248
- package/esm2015/lib/strenum.js +8 -8
- package/esm2015/lib/string-utils.js +105 -105
- package/esm2015/lib/user-agent.js +3 -3
- package/esm2015/lib/uuid.js +9 -9
- package/esm2015/lib/watcher.js +41 -41
- package/esm2015/public_api.js +5 -5
- package/fesm2015/igo2-utils.js +651 -651
- package/fesm2015/igo2-utils.js.map +1 -1
- package/igo2-utils.d.ts +5 -5
- package/lib/base64.d.ts +8 -8
- package/lib/change.d.ts +5 -5
- package/lib/change.interface.d.ts +24 -24
- package/lib/clipboard.d.ts +7 -7
- package/lib/file.d.ts +16 -16
- package/lib/index.d.ts +11 -11
- package/lib/object-utils.d.ts +26 -26
- package/lib/strenum.d.ts +4 -4
- package/lib/string-utils.d.ts +6 -6
- package/lib/user-agent.d.ts +5 -5
- package/lib/uuid.d.ts +2 -2
- package/lib/watcher.d.ts +19 -19
- package/package.json +4 -4
- package/public_api.d.ts +1 -1
- package/bundles/igo2-utils.umd.min.js +0 -2
- package/bundles/igo2-utils.umd.min.js.map +0 -1
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
export class StringUtils {
|
|
2
|
-
static diff(s1, s2, p = 4) {
|
|
3
|
-
if (!s1 && !s2) {
|
|
4
|
-
return '';
|
|
5
|
-
}
|
|
6
|
-
if (!s1) {
|
|
7
|
-
return '<span class="inserted">' + s2 + '</span>';
|
|
8
|
-
}
|
|
9
|
-
if (!s2) {
|
|
10
|
-
return '<span class="deleted">' + s1 + '</span>';
|
|
11
|
-
}
|
|
12
|
-
s1 = s1.toString();
|
|
13
|
-
s2 = s2.toString();
|
|
14
|
-
const changeData = StringUtils.getChanges(s1, s2, '', p);
|
|
15
|
-
const nextS = s2.slice(changeData.mtc.length + changeData.ins.length + changeData.sbs.length); // remaining part of "s"
|
|
16
|
-
const nextThis = s1.slice(changeData.mtc.length + changeData.del.length + changeData.sbs.length); // remaining part of "this"
|
|
17
|
-
let result = ''; // the glorious result
|
|
18
|
-
if (changeData.del.length > 0) {
|
|
19
|
-
changeData.del = '<span class="deleted">' + changeData.del + '</span>';
|
|
20
|
-
}
|
|
21
|
-
if (changeData.ins.length > 0) {
|
|
22
|
-
changeData.ins = '<span class="inserted">' + changeData.ins + '</span>';
|
|
23
|
-
}
|
|
24
|
-
result = changeData.mtc + changeData.del + changeData.ins + changeData.sbs;
|
|
25
|
-
result +=
|
|
26
|
-
nextThis !== '' || nextS !== ''
|
|
27
|
-
? StringUtils.diff(nextThis, nextS, p)
|
|
28
|
-
: '';
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
31
|
-
static getMatchingSubstring(s, l, m) {
|
|
32
|
-
// returns the first matching substring in-between the two strings
|
|
33
|
-
let i = 0;
|
|
34
|
-
let match = false;
|
|
35
|
-
const slen = s.length;
|
|
36
|
-
const o = { fis: slen, mtc: m, sbs: '' }; // temporary object used to construct the cd (change data) object
|
|
37
|
-
while (i < slen) {
|
|
38
|
-
l[i] === s[i]
|
|
39
|
-
? match
|
|
40
|
-
? (o.sbs += s[i]) // o.sbs holds the matching substring itsef
|
|
41
|
-
: ((match = true), (o.fis = i), (o.sbs = s[i]))
|
|
42
|
-
: match
|
|
43
|
-
? (i = slen) // stop after the first found substring
|
|
44
|
-
: (i = i);
|
|
45
|
-
++i;
|
|
46
|
-
}
|
|
47
|
-
return o;
|
|
48
|
-
}
|
|
49
|
-
static getChanges(s1, s2, m, p) {
|
|
50
|
-
const isThisLonger = s1.length >= s1.length ? true : false;
|
|
51
|
-
let [longer, shorter] = isThisLonger ? [s1, s2] : [s2, s1]; // assignment of longer and shorter by es6 destructuring
|
|
52
|
-
let bi = 0; // base index designating the index of first mismacthing character in both strings
|
|
53
|
-
while (shorter[bi] === longer[bi] && bi < shorter.length) {
|
|
54
|
-
++bi;
|
|
55
|
-
} // make bi the index of first mismatching character
|
|
56
|
-
longer = longer.split('').slice(bi); // as the longer string will be rotated it is converted into array
|
|
57
|
-
shorter = shorter.slice(bi); // shorter and longer now starts from the first mismatching character
|
|
58
|
-
const len = longer.length; // length of the longer string
|
|
59
|
-
let cd = {
|
|
60
|
-
fis: shorter.length,
|
|
61
|
-
fil: len,
|
|
62
|
-
sbs: '',
|
|
63
|
-
mtc: m + s2.slice(0, bi)
|
|
64
|
-
}; // if exists mtc holds the matching string at the front
|
|
65
|
-
let sub = { sbs: '' }; // returned substring per 1 character rotation of the longer string
|
|
66
|
-
if (shorter !== '') {
|
|
67
|
-
for (let rc = 0; rc < len && sub.sbs.length < p; rc++) {
|
|
68
|
-
// rc -> rotate count, p -> precision factor
|
|
69
|
-
sub = StringUtils.getMatchingSubstring(shorter, StringUtils.rotateArray(longer, rc), cd.mtc); // rotate longer string 1 char and get substring
|
|
70
|
-
sub.fil =
|
|
71
|
-
rc < len - sub.fis
|
|
72
|
-
? sub.fis + rc // mismatch is longer than the mismatch in short
|
|
73
|
-
: sub.fis - len + rc; // mismatch is shorter than the mismatch in short
|
|
74
|
-
if (sub.sbs.length > cd.sbs.length) {
|
|
75
|
-
cd = sub; // only keep the one with the longest substring.
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// insert the mismatching delete subsrt and insert substr to the cd object and attach the previous substring
|
|
80
|
-
[cd.del, cd.ins] = isThisLonger
|
|
81
|
-
? [longer.slice(0, cd.fil).join(''), shorter.slice(0, cd.fis)]
|
|
82
|
-
: [shorter.slice(0, cd.fis), longer.slice(0, cd.fil).join('')];
|
|
83
|
-
return cd.del.indexOf(' ') === -1 ||
|
|
84
|
-
cd.ins.indexOf(' ') === -1 ||
|
|
85
|
-
cd.del === '' ||
|
|
86
|
-
cd.ins === '' ||
|
|
87
|
-
cd.sbs === ''
|
|
88
|
-
? cd
|
|
89
|
-
: StringUtils.getChanges(cd.del, cd.ins, cd.mtc, p);
|
|
90
|
-
}
|
|
91
|
-
static rotateArray(array, n) {
|
|
92
|
-
const len = array.length;
|
|
93
|
-
const res = new Array(array.length);
|
|
94
|
-
if (n % len === 0) {
|
|
95
|
-
return array.slice();
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
for (let i = 0; i < len; i++) {
|
|
99
|
-
res[i] = array[(i + (len + (n % len))) % len];
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return res;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii9zcnYvYXBwcy9pZ28yLWxpYi9wYWNrYWdlcy91dGlscy9zcmMvIiwic291cmNlcyI6WyJsaWIvc3RyaW5nLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUN2QyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ2QsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7U0FDbkQ7UUFDRCxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ1AsT0FBTyx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO1NBQ2xEO1FBQ0QsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FDcEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQ3RFLENBQUMsQ0FBQyx3QkFBd0I7UUFDM0IsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FDdkIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQ3RFLENBQUMsQ0FB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Q0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDekIsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEVBQUU7WUFDakIsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDdEI7YUFBTTtZQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQy9DO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTdHJpbmdVdGlscyB7XG4gIHN0YXRpYyBkaWZmKHMxOiBzdHJpbmcsIHMyOiBzdHJpbmcsIHAgPSA0KTogc3RyaW5nIHtcbiAgICBpZiAoIXMxICYmICFzMikge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAoIXMxKSB7XG4gICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPVwiaW5zZXJ0ZWRcIj4nICsgczIgKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIGlmICghczIpIHtcbiAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJkZWxldGVkXCI+JyArIHMxICsgJzwvc3Bhbj4nO1xuICAgIH1cbiAgICBzMSA9IHMxLnRvU3RyaW5nKCk7XG4gICAgczIgPSBzMi50b1N0cmluZygpO1xuICAgIGNvbnN0IGNoYW5nZURhdGEgPSBTdHJpbmdVdGlscy5nZXRDaGFuZ2VzKHMxLCBzMiwgJycsIHApO1xuICAgIGNvbnN0IG5leHRTID0gczIuc2xpY2UoXG4gICAgICBjaGFuZ2VEYXRhLm10Yy5sZW5ndGggKyBjaGFuZ2VEYXRhLmlucy5sZW5ndGggKyBjaGFuZ2VEYXRhLnNicy5sZW5ndGhcbiAgICApOyAvLyByZW1haW5pbmcgcGFydCBvZiBcInNcIlxuICAgIGNvbnN0IG5leHRUaGlzID0gczEuc2xpY2UoXG4gICAgICBjaGFuZ2VEYXRhLm10Yy5sZW5ndGggKyBjaGFuZ2VEYXRhLmRlbC5sZW5ndGggKyBjaGFuZ2VEYXRhLnNicy5sZW5ndGhcbiAgICApOyAvLyByZW1haW5pbmcgcGFydCBvZiBcInRoaXNcIlxuICAgIGxldCByZXN1bHQgPSAnJzsgLy8gdGhlIGdsb3Jpb3VzIHJlc3VsdFxuICAgIGlmIChjaGFuZ2VEYXRhLmRlbC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VEYXRhLmRlbCA9ICc8c3BhbiBjbGFzcz1cImRlbGV0ZWRcIj4nICsgY2hhbmdlRGF0YS5kZWwgKyAnPC9zcGFuPic7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VEYXRhLmlucy5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VEYXRhLmlucyA9ICc8c3BhbiBjbGFzcz1cImluc2VydGVkXCI+JyArIGNoYW5nZURhdGEuaW5zICsgJzwvc3Bhbj4nO1xuICAgIH1cbiAgICByZXN1bHQgPSBjaGFuZ2VEYXRhLm10YyArIGNoYW5nZURhdGEuZGVsICsgY2hhbmdlRGF0YS5pbnMgKyBjaGFuZ2VEYXRhLnNicztcbiAgICByZXN1bHQgKz1cbiAgICAgIG5leHRUaGlzICE9PSAnJyB8fCBuZXh0UyAhPT0gJydcbiAgICAgICAgPyBTdHJpbmdVdGlscy5kaWZmKG5leHRUaGlzLCBuZXh0UywgcClcbiAgICAgICAgOiAnJztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWF0Y2hpbmdTdWJzdHJpbmcocywgbCwgbSkge1xuICAgIC8vIHJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIHN1YnN0cmluZyBpbi1iZXR3ZWVuIHRoZSB0d28gc3RyaW5nc1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgbWF0Y2ggPSBmYWxzZTtcbiAgICBjb25zdCBzbGVuID0gcy5sZW5ndGg7XG4gICAgY29uc3QgbyA9IHsgZmlzOiBzbGVuLCBtdGM6IG0sIHNiczogJycgfTsgLy8gdGVtcG9yYXJ5IG9iamVjdCB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgY2QgKGNoYW5nZSBkYXRhKSBvYmplY3RcblxuICAgIHdoaWxlIChpIDwgc2xlbikge1xuICAgICAgbFtpXSA9PT0gc1tpXVxuICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgPyAoby5zYnMgKz0gc1tpXSkgLy8gby5zYnMgaG9sZHMgdGhlIG1hdGNoaW5nIHN1YnN0cmluZyBpdHNlZlxuICAgICAgICAgIDogKChtYXRjaCA9IHRydWUpLCAoby5maXMgPSBpKSwgKG8uc2JzID0gc1tpXSkpXG4gICAgICAgIDogbWF0Y2hcbiAgICAgICAgICA/IChpID0gc2xlbikgLy8gc3RvcCBhZnRlciB0aGUgZmlyc3QgZm91bmQgc3Vic3RyaW5nXG4gICAgICAgICAgOiAoaSA9IGkpO1xuICAgICAgKytpO1xuICAgIH1cbiAgICByZXR1cm4gbztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldENoYW5nZXMoczEsIHMyLCBtLCBwKSB7XG4gICAgY29uc3QgaXNUaGlzTG9uZ2VyID0gczEubGVuZ3RoID49IHMxLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbiAgICBsZXQgW2xvbmdlciwgc2hvcnRlcl0gPSBpc1RoaXNMb25nZXIgPyBbczEsIHMyXSA6IFtzMiwgczFdOyAvLyBhc3NpZ25tZW50IG9mIGxvbmdlciBhbmQgc2hvcnRlciBieSBlczYgZGVzdHJ1Y3R1cmluZ1xuICAgIGxldCBiaSA9IDA7IC8vIGJhc2UgaW5kZXggZGVzaWduYXRpbmcgdGhlIGluZGV4IG9mIGZpcnN0IG1pc21hY3RoaW5nIGNoYXJhY3RlciBpbiBib3RoIHN0cmluZ3NcblxuICAgIHdoaWxlIChzaG9ydGVyW2JpXSA9PT0gbG9uZ2VyW2JpXSAmJiBiaSA8IHNob3J0ZXIubGVuZ3RoKSB7XG4gICAgICArK2JpO1xuICAgIH0gLy8gbWFrZSBiaSB0aGUgaW5kZXggb2YgZmlyc3QgbWlzbWF0Y2hpbmcgY2hhcmFjdGVyXG4gICAgbG9uZ2VyID0gbG9uZ2VyLnNwbGl0KCcnKS5zbGljZShiaSk7IC8vIGFzIHRoZSBsb25nZXIgc3RyaW5nIHdpbGwgYmUgcm90YXRlZCBpdCBpcyBjb252ZXJ0ZWQgaW50byBhcnJheVxuICAgIHNob3J0ZXIgPSBzaG9ydGVyLnNsaWNlKGJpKTsgLy8gc2hvcnRlciBhbmQgbG9uZ2VyIG5vdyBzdGFydHMgZnJvbSB0aGUgZmlyc3QgbWlzbWF0Y2hpbmcgY2hhcmFjdGVyXG5cbiAgICBjb25zdCBsZW4gPSBsb25nZXIubGVuZ3RoOyAvLyBsZW5ndGggb2YgdGhlIGxvbmdlciBzdHJpbmdcbiAgICBsZXQgY2Q6IGFueSA9IHtcbiAgICAgIGZpczogc2hvcnRlci5sZW5ndGgsIC8vIHRoZSBpbmRleCBvZiBtYXRjaGluZyBzdHJpbmcgaW4gdGhlIHNob3J0ZXIgc3RyaW5nXG4gICAgICBmaWw6IGxlbiwgLy8gdGhlIGluZGV4IG9mIG1hdGNoaW5nIHN0cmluZyBpbiB0aGUgbG9uZ2VyIHN0cmluZ1xuICAgICAgc2JzOiAnJywgLy8gdGhlIG1hdGNoaW5nIHN1YnN0cmluZyBpdHNlbGZcbiAgICAgIG10YzogbSArIHMyLnNsaWNlKDAsIGJpKVxuICAgIH07IC8vIGlmIGV4aXN0cyBtdGMgaG9sZHMgdGhlIG1hdGNoaW5nIHN0cmluZyBhdCB0aGUgZnJvbnRcbiAgICBsZXQgc3ViOiBhbnkgPSB7IHNiczogJycgfTsgLy8gcmV0dXJuZWQgc3Vic3RyaW5nIHBlciAxIGNoYXJhY3RlciByb3RhdGlvbiBvZiB0aGUgbG9uZ2VyIHN0cmluZ1xuXG4gICAgaWYgKHNob3J0ZXIgIT09ICcnKSB7XG4gICAgICBmb3IgKGxldCByYyA9IDA7IHJjIDwgbGVuICYmIHN1Yi5zYnMubGVuZ3RoIDwgcDsgcmMrKykge1xuICAgICAgICAvLyByYyAtPiByb3RhdGUgY291bnQsIHAgLT4gcHJlY2lzaW9uIGZhY3RvclxuICAgICAgICBzdWIgPSBTdHJpbmdVdGlscy5nZXRNYXRjaGluZ1N1YnN0cmluZyhcbiAgICAgICAgICBzaG9ydGVyLFxuICAgICAgICAgIFN0cmluZ1V0aWxzLnJvdGF0ZUFycmF5KGxvbmdlciwgcmMpLFxuICAgICAgICAgIGNkLm10Y1xuICAgICAgICApOyAvLyByb3RhdGUgbG9uZ2VyIHN0cmluZyAxIGNoYXIgYW5kIGdldCBzdWJzdHJpbmdcbiAgICAgICAgc3ViLmZpbCA9XG4gICAgICAgICAgcmMgPCBsZW4gLSBzdWIuZmlzXG4gICAgICAgICAgICA/IHN1Yi5maXMgKyByYyAvLyBtaXNtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGUgbWlzbWF0Y2ggaW4gc2hvcnRcbiAgICAgICAgICAgIDogc3ViLmZpcyAtIGxlbiArIHJjOyAvLyBtaXNtYXRjaCBpcyBzaG9ydGVyIHRoYW4gdGhlIG1pc21hdGNoIGluIHNob3J0XG4gICAgICAgIGlmIChzdWIuc2JzLmxlbmd0aCA+IGNkLnNicy5sZW5ndGgpIHtcbiAgICAgICAgICBjZCA9IHN1YjsgLy8gb25seSBrZWVwIHRoZSBvbmUgd2l0aCB0aGUgbG9uZ2VzdCBzdWJzdHJpbmcuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gaW5zZXJ0IHRoZSBtaXNtYXRjaGluZyBkZWxldGUgc3Vic3J0IGFuZCBpbnNlcnQgc3Vic3RyIHRvIHRoZSBjZCBvYmplY3QgYW5kIGF0dGFjaCB0aGUgcHJldmlvdXMgc3Vic3RyaW5nXG4gICAgW2NkLmRlbCwgY2QuaW5zXSA9IGlzVGhpc0xvbmdlclxuICAgICAgPyBbbG9uZ2VyLnNsaWNlKDAsIGNkLmZpbCkuam9pbignJyksIHNob3J0ZXIuc2xpY2UoMCwgY2QuZmlzKV1cbiAgICAgIDogW3Nob3J0ZXIuc2xpY2UoMCwgY2QuZmlzKSwgbG9uZ2VyLnNsaWNlKDAsIGNkLmZpbCkuam9pbignJyldO1xuICAgIHJldHVybiBjZC5kZWwuaW5kZXhPZignICcpID09PSAtMSB8fFxuICAgICAgY2QuaW5zLmluZGV4T2YoJyAnKSA9PT0gLTEgfHxcbiAgICAgIGNkLmRlbCA9PT0gJycgfHxcbiAgICAgIGNkLmlucyA9PT0gJycgfHxcbiAgICAgIGNkLnNicyA9PT0gJydcbiAgICAgID8gY2RcbiAgICAgIDogU3RyaW5nVXRpbHMuZ2V0Q2hhbmdlcyhjZC5kZWwsIGNkLmlucywgY2QubXRjLCBwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJvdGF0ZUFycmF5KGFycmF5LCBuKSB7XG4gICAgY29uc3QgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIGNvbnN0IHJlcyA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xuICAgIGlmIChuICUgbGVuID09PSAwKSB7XG4gICAgICByZXR1cm4gYXJyYXkuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICByZXNbaV0gPSBhcnJheVsoaSArIChsZW4gKyAobiAlIGxlbikpKSAlIGxlbl07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbiJdfQ==
|
|
1
|
+
export class StringUtils {
|
|
2
|
+
static diff(s1, s2, p = 4) {
|
|
3
|
+
if (!s1 && !s2) {
|
|
4
|
+
return '';
|
|
5
|
+
}
|
|
6
|
+
if (!s1) {
|
|
7
|
+
return '<span class="inserted">' + s2 + '</span>';
|
|
8
|
+
}
|
|
9
|
+
if (!s2) {
|
|
10
|
+
return '<span class="deleted">' + s1 + '</span>';
|
|
11
|
+
}
|
|
12
|
+
s1 = s1.toString();
|
|
13
|
+
s2 = s2.toString();
|
|
14
|
+
const changeData = StringUtils.getChanges(s1, s2, '', p);
|
|
15
|
+
const nextS = s2.slice(changeData.mtc.length + changeData.ins.length + changeData.sbs.length); // remaining part of "s"
|
|
16
|
+
const nextThis = s1.slice(changeData.mtc.length + changeData.del.length + changeData.sbs.length); // remaining part of "this"
|
|
17
|
+
let result = ''; // the glorious result
|
|
18
|
+
if (changeData.del.length > 0) {
|
|
19
|
+
changeData.del = '<span class="deleted">' + changeData.del + '</span>';
|
|
20
|
+
}
|
|
21
|
+
if (changeData.ins.length > 0) {
|
|
22
|
+
changeData.ins = '<span class="inserted">' + changeData.ins + '</span>';
|
|
23
|
+
}
|
|
24
|
+
result = changeData.mtc + changeData.del + changeData.ins + changeData.sbs;
|
|
25
|
+
result +=
|
|
26
|
+
nextThis !== '' || nextS !== ''
|
|
27
|
+
? StringUtils.diff(nextThis, nextS, p)
|
|
28
|
+
: '';
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
static getMatchingSubstring(s, l, m) {
|
|
32
|
+
// returns the first matching substring in-between the two strings
|
|
33
|
+
let i = 0;
|
|
34
|
+
let match = false;
|
|
35
|
+
const slen = s.length;
|
|
36
|
+
const o = { fis: slen, mtc: m, sbs: '' }; // temporary object used to construct the cd (change data) object
|
|
37
|
+
while (i < slen) {
|
|
38
|
+
l[i] === s[i]
|
|
39
|
+
? match
|
|
40
|
+
? (o.sbs += s[i]) // o.sbs holds the matching substring itsef
|
|
41
|
+
: ((match = true), (o.fis = i), (o.sbs = s[i]))
|
|
42
|
+
: match
|
|
43
|
+
? (i = slen) // stop after the first found substring
|
|
44
|
+
: (i = i);
|
|
45
|
+
++i;
|
|
46
|
+
}
|
|
47
|
+
return o;
|
|
48
|
+
}
|
|
49
|
+
static getChanges(s1, s2, m, p) {
|
|
50
|
+
const isThisLonger = s1.length >= s1.length ? true : false;
|
|
51
|
+
let [longer, shorter] = isThisLonger ? [s1, s2] : [s2, s1]; // assignment of longer and shorter by es6 destructuring
|
|
52
|
+
let bi = 0; // base index designating the index of first mismacthing character in both strings
|
|
53
|
+
while (shorter[bi] === longer[bi] && bi < shorter.length) {
|
|
54
|
+
++bi;
|
|
55
|
+
} // make bi the index of first mismatching character
|
|
56
|
+
longer = longer.split('').slice(bi); // as the longer string will be rotated it is converted into array
|
|
57
|
+
shorter = shorter.slice(bi); // shorter and longer now starts from the first mismatching character
|
|
58
|
+
const len = longer.length; // length of the longer string
|
|
59
|
+
let cd = {
|
|
60
|
+
fis: shorter.length,
|
|
61
|
+
fil: len,
|
|
62
|
+
sbs: '',
|
|
63
|
+
mtc: m + s2.slice(0, bi)
|
|
64
|
+
}; // if exists mtc holds the matching string at the front
|
|
65
|
+
let sub = { sbs: '' }; // returned substring per 1 character rotation of the longer string
|
|
66
|
+
if (shorter !== '') {
|
|
67
|
+
for (let rc = 0; rc < len && sub.sbs.length < p; rc++) {
|
|
68
|
+
// rc -> rotate count, p -> precision factor
|
|
69
|
+
sub = StringUtils.getMatchingSubstring(shorter, StringUtils.rotateArray(longer, rc), cd.mtc); // rotate longer string 1 char and get substring
|
|
70
|
+
sub.fil =
|
|
71
|
+
rc < len - sub.fis
|
|
72
|
+
? sub.fis + rc // mismatch is longer than the mismatch in short
|
|
73
|
+
: sub.fis - len + rc; // mismatch is shorter than the mismatch in short
|
|
74
|
+
if (sub.sbs.length > cd.sbs.length) {
|
|
75
|
+
cd = sub; // only keep the one with the longest substring.
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// insert the mismatching delete subsrt and insert substr to the cd object and attach the previous substring
|
|
80
|
+
[cd.del, cd.ins] = isThisLonger
|
|
81
|
+
? [longer.slice(0, cd.fil).join(''), shorter.slice(0, cd.fis)]
|
|
82
|
+
: [shorter.slice(0, cd.fis), longer.slice(0, cd.fil).join('')];
|
|
83
|
+
return cd.del.indexOf(' ') === -1 ||
|
|
84
|
+
cd.ins.indexOf(' ') === -1 ||
|
|
85
|
+
cd.del === '' ||
|
|
86
|
+
cd.ins === '' ||
|
|
87
|
+
cd.sbs === ''
|
|
88
|
+
? cd
|
|
89
|
+
: StringUtils.getChanges(cd.del, cd.ins, cd.mtc, p);
|
|
90
|
+
}
|
|
91
|
+
static rotateArray(array, n) {
|
|
92
|
+
const len = array.length;
|
|
93
|
+
const res = new Array(array.length);
|
|
94
|
+
if (n % len === 0) {
|
|
95
|
+
return array.slice();
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
for (let i = 0; i < len; i++) {
|
|
99
|
+
res[i] = array[(i + (len + (n % len))) % len];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return res;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdXRpbHMvc3JjL2xpYi9zdHJpbmctdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFdBQVc7SUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFVLEVBQUUsRUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDZCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNQLE9BQU8seUJBQXlCLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDUCxPQUFPLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7U0FDbEQ7UUFDRCxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUNwQixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxDQUFDLHdCQUF3QjtRQUMzQixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUN2QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FDdEUsQ0FBQyxDQUFDLDJCQUEy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QUM7SUFDeEQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtZQUNqQixPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN0QjthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDL0M7U0FDRjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFN0cmluZ1V0aWxzIHtcclxuICBzdGF0aWMgZGlmZihzMTogc3RyaW5nLCBzMjogc3RyaW5nLCBwID0gNCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXMxICYmICFzMikge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAoIXMxKSB7XHJcbiAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9XCJpbnNlcnRlZFwiPicgKyBzMiArICc8L3NwYW4+JztcclxuICAgIH1cclxuICAgIGlmICghczIpIHtcclxuICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz1cImRlbGV0ZWRcIj4nICsgczEgKyAnPC9zcGFuPic7XHJcbiAgICB9XHJcbiAgICBzMSA9IHMxLnRvU3RyaW5nKCk7XHJcbiAgICBzMiA9IHMyLnRvU3RyaW5nKCk7XHJcbiAgICBjb25zdCBjaGFuZ2VEYXRhID0gU3RyaW5nVXRpbHMuZ2V0Q2hhbmdlcyhzMSwgczIsICcnLCBwKTtcclxuICAgIGNvbnN0IG5leHRTID0gczIuc2xpY2UoXHJcbiAgICAgIGNoYW5nZURhdGEubXRjLmxlbmd0aCArIGNoYW5nZURhdGEuaW5zLmxlbmd0aCArIGNoYW5nZURhdGEuc2JzLmxlbmd0aFxyXG4gICAgKTsgLy8gcmVtYWluaW5nIHBhcnQgb2YgXCJzXCJcclxuICAgIGNvbnN0IG5leHRUaGlzID0gczEuc2xpY2UoXHJcbiAgICAgIGNoYW5nZURhdGEubXRjLmxlbmd0aCArIGNoYW5nZURhdGEuZGVsLmxlbmd0aCArIGNoYW5nZURhdGEuc2JzLmxlbmd0aFxyXG4gICAgKTsgLy8gcmVtYWluaW5nIHBhcnQgb2YgXCJ0aGlzXCJcclxuICAgIGxldCByZXN1bHQgPSAnJzsgLy8gdGhlIGdsb3Jpb3VzIHJlc3VsdFxyXG4gICAgaWYgKGNoYW5nZURhdGEuZGVsLmxlbmd0aCA+IDApIHtcclxuICAgICAgY2hhbmdlRGF0YS5kZWwgPSAnPHNwYW4gY2xhc3M9XCJkZWxldGVkXCI+JyArIGNoYW5nZURhdGEuZGVsICsgJzwvc3Bhbj4nO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZURhdGEuaW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgY2hhbmdlRGF0YS5pbnMgPSAnPHNwYW4gY2xhc3M9XCJpbnNlcnRlZFwiPicgKyBjaGFuZ2VEYXRhLmlucyArICc8L3NwYW4+JztcclxuICAgIH1cclxuICAgIHJlc3VsdCA9IGNoYW5nZURhdGEubXRjICsgY2hhbmdlRGF0YS5kZWwgKyBjaGFuZ2VEYXRhLmlucyArIGNoYW5nZURhdGEuc2JzO1xyXG4gICAgcmVzdWx0ICs9XHJcbiAgICAgIG5leHRUaGlzICE9PSAnJyB8fCBuZXh0UyAhPT0gJydcclxuICAgICAgICA/IFN0cmluZ1V0aWxzLmRpZmYobmV4dFRoaXMsIG5leHRTLCBwKVxyXG4gICAgICAgIDogJyc7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWF0Y2hpbmdTdWJzdHJpbmcocywgbCwgbSkge1xyXG4gICAgLy8gcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgc3Vic3RyaW5nIGluLWJldHdlZW4gdGhlIHR3byBzdHJpbmdzXHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBsZXQgbWF0Y2ggPSBmYWxzZTtcclxuICAgIGNvbnN0IHNsZW4gPSBzLmxlbmd0aDtcclxuICAgIGNvbnN0IG8gPSB7IGZpczogc2xlbiwgbXRjOiBtLCBzYnM6ICcnIH07IC8vIHRlbXBvcmFyeSBvYmplY3QgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGNkIChjaGFuZ2UgZGF0YSkgb2JqZWN0XHJcblxyXG4gICAgd2hpbGUgKGkgPCBzbGVuKSB7XHJcbiAgICAgIGxbaV0gPT09IHNbaV1cclxuICAgICAgICA/IG1hdGNoXHJcbiAgICAgICAgICA/IChvLnNicyArPSBzW2ldKSAvLyBvLnNicyBob2xkcyB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nIGl0c2VmXHJcbiAgICAgICAgICA6ICgobWF0Y2ggPSB0cnVlKSwgKG8uZmlzID0gaSksIChvLnNicyA9IHNbaV0pKVxyXG4gICAgICAgIDogbWF0Y2hcclxuICAgICAgICAgID8gKGkgPSBzbGVuKSAvLyBzdG9wIGFmdGVyIHRoZSBmaXJzdCBmb3VuZCBzdWJzdHJpbmdcclxuICAgICAgICAgIDogKGkgPSBpKTtcclxuICAgICAgKytpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG87XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBnZXRDaGFuZ2VzKHMxLCBzMiwgbSwgcCkge1xyXG4gICAgY29uc3QgaXNUaGlzTG9uZ2VyID0gczEubGVuZ3RoID49IHMxLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcclxuICAgIGxldCBbbG9uZ2VyLCBzaG9ydGVyXSA9IGlzVGhpc0xvbmdlciA/IFtzMSwgczJdIDogW3MyLCBzMV07IC8vIGFzc2lnbm1lbnQgb2YgbG9uZ2VyIGFuZCBzaG9ydGVyIGJ5IGVzNiBkZXN0cnVjdHVyaW5nXHJcbiAgICBsZXQgYmkgPSAwOyAvLyBiYXNlIGluZGV4IGRlc2lnbmF0aW5nIHRoZSBpbmRleCBvZiBmaXJzdCBtaXNtYWN0aGluZyBjaGFyYWN0ZXIgaW4gYm90aCBzdHJpbmdzXHJcblxyXG4gICAgd2hpbGUgKHNob3J0ZXJbYmldID09PSBsb25nZXJbYmldICYmIGJpIDwgc2hvcnRlci5sZW5ndGgpIHtcclxuICAgICAgKytiaTtcclxuICAgIH0gLy8gbWFrZSBiaSB0aGUgaW5kZXggb2YgZmlyc3QgbWlzbWF0Y2hpbmcgY2hhcmFjdGVyXHJcbiAgICBsb25nZXIgPSBsb25nZXIuc3BsaXQoJycpLnNsaWNlKGJpKTsgLy8gYXMgdGhlIGxvbmdlciBzdHJpbmcgd2lsbCBiZSByb3RhdGVkIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGFycmF5XHJcbiAgICBzaG9ydGVyID0gc2hvcnRlci5zbGljZShiaSk7IC8vIHNob3J0ZXIgYW5kIGxvbmdlciBub3cgc3RhcnRzIGZyb20gdGhlIGZpcnN0IG1pc21hdGNoaW5nIGNoYXJhY3RlclxyXG5cclxuICAgIGNvbnN0IGxlbiA9IGxvbmdlci5sZW5ndGg7IC8vIGxlbmd0aCBvZiB0aGUgbG9uZ2VyIHN0cmluZ1xyXG4gICAgbGV0IGNkOiBhbnkgPSB7XHJcbiAgICAgIGZpczogc2hvcnRlci5sZW5ndGgsIC8vIHRoZSBpbmRleCBvZiBtYXRjaGluZyBzdHJpbmcgaW4gdGhlIHNob3J0ZXIgc3RyaW5nXHJcbiAgICAgIGZpbDogbGVuLCAvLyB0aGUgaW5kZXggb2YgbWF0Y2hpbmcgc3RyaW5nIGluIHRoZSBsb25nZXIgc3RyaW5nXHJcbiAgICAgIHNiczogJycsIC8vIHRoZSBtYXRjaGluZyBzdWJzdHJpbmcgaXRzZWxmXHJcbiAgICAgIG10YzogbSArIHMyLnNsaWNlKDAsIGJpKVxyXG4gICAgfTsgLy8gaWYgZXhpc3RzIG10YyBob2xkcyB0aGUgbWF0Y2hpbmcgc3RyaW5nIGF0IHRoZSBmcm9udFxyXG4gICAgbGV0IHN1YjogYW55ID0geyBzYnM6ICcnIH07IC8vIHJldHVybmVkIHN1YnN0cmluZyBwZXIgMSBjaGFyYWN0ZXIgcm90YXRpb24gb2YgdGhlIGxvbmdlciBzdHJpbmdcclxuXHJcbiAgICBpZiAoc2hvcnRlciAhPT0gJycpIHtcclxuICAgICAgZm9yIChsZXQgcmMgPSAwOyByYyA8IGxlbiAmJiBzdWIuc2JzLmxlbmd0aCA8IHA7IHJjKyspIHtcclxuICAgICAgICAvLyByYyAtPiByb3RhdGUgY291bnQsIHAgLT4gcHJlY2lzaW9uIGZhY3RvclxyXG4gICAgICAgIHN1YiA9IFN0cmluZ1V0aWxzLmdldE1hdGNoaW5nU3Vic3RyaW5nKFxyXG4gICAgICAgICAgc2hvcnRlcixcclxuICAgICAgICAgIFN0cmluZ1V0aWxzLnJvdGF0ZUFycmF5KGxvbmdlciwgcmMpLFxyXG4gICAgICAgICAgY2QubXRjXHJcbiAgICAgICAgKTsgLy8gcm90YXRlIGxvbmdlciBzdHJpbmcgMSBjaGFyIGFuZCBnZXQgc3Vic3RyaW5nXHJcbiAgICAgICAgc3ViLmZpbCA9XHJcbiAgICAgICAgICByYyA8IGxlbiAtIHN1Yi5maXNcclxuICAgICAgICAgICAgPyBzdWIuZmlzICsgcmMgLy8gbWlzbWF0Y2ggaXMgbG9uZ2VyIHRoYW4gdGhlIG1pc21hdGNoIGluIHNob3J0XHJcbiAgICAgICAgICAgIDogc3ViLmZpcyAtIGxlbiArIHJjOyAvLyBtaXNtYXRjaCBpcyBzaG9ydGVyIHRoYW4gdGhlIG1pc21hdGNoIGluIHNob3J0XHJcbiAgICAgICAgaWYgKHN1Yi5zYnMubGVuZ3RoID4gY2Quc2JzLmxlbmd0aCkge1xyXG4gICAgICAgICAgY2QgPSBzdWI7IC8vIG9ubHkga2VlcCB0aGUgb25lIHdpdGggdGhlIGxvbmdlc3Qgc3Vic3RyaW5nLlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gaW5zZXJ0IHRoZSBtaXNtYXRjaGluZyBkZWxldGUgc3Vic3J0IGFuZCBpbnNlcnQgc3Vic3RyIHRvIHRoZSBjZCBvYmplY3QgYW5kIGF0dGFjaCB0aGUgcHJldmlvdXMgc3Vic3RyaW5nXHJcbiAgICBbY2QuZGVsLCBjZC5pbnNdID0gaXNUaGlzTG9uZ2VyXHJcbiAgICAgID8gW2xvbmdlci5zbGljZSgwLCBjZC5maWwpLmpvaW4oJycpLCBzaG9ydGVyLnNsaWNlKDAsIGNkLmZpcyldXHJcbiAgICAgIDogW3Nob3J0ZXIuc2xpY2UoMCwgY2QuZmlzKSwgbG9uZ2VyLnNsaWNlKDAsIGNkLmZpbCkuam9pbignJyldO1xyXG4gICAgcmV0dXJuIGNkLmRlbC5pbmRleE9mKCcgJykgPT09IC0xIHx8XHJcbiAgICAgIGNkLmlucy5pbmRleE9mKCcgJykgPT09IC0xIHx8XHJcbiAgICAgIGNkLmRlbCA9PT0gJycgfHxcclxuICAgICAgY2QuaW5zID09PSAnJyB8fFxyXG4gICAgICBjZC5zYnMgPT09ICcnXHJcbiAgICAgID8gY2RcclxuICAgICAgOiBTdHJpbmdVdGlscy5nZXRDaGFuZ2VzKGNkLmRlbCwgY2QuaW5zLCBjZC5tdGMsIHApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcm90YXRlQXJyYXkoYXJyYXksIG4pIHtcclxuICAgIGNvbnN0IGxlbiA9IGFycmF5Lmxlbmd0aDtcclxuICAgIGNvbnN0IHJlcyA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xyXG4gICAgaWYgKG4gJSBsZW4gPT09IDApIHtcclxuICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgcmVzW2ldID0gYXJyYXlbKGkgKyAobGVuICsgKG4gJSBsZW4pKSkgJSBsZW5dO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import * as Bowser from 'bowser';
|
|
2
|
-
export const userAgent = Bowser.getParser(window.navigator.userAgent);
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import * as Bowser from 'bowser';
|
|
2
|
+
export const userAgent = Bowser.getParser(window.navigator.userAgent);
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1hZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvdXNlci1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQU1qQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDdkMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEJvd3NlciBmcm9tICdib3dzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZ2VudCBleHRlbmRzIEJvd3Nlci5QYXJzZXIuUGFyc2VyIHtcbiAgY29tcGFyZVZlcnNpb246ICh2ZXJzaW9uOiBzdHJpbmcpID0+IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB1c2VyQWdlbnQgPSBCb3dzZXIuZ2V0UGFyc2VyKFxuICB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudFxuKSBhcyBVc2VyQWdlbnQ7XG4iXX0=
|
package/esm2015/lib/uuid.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export function S4() {
|
|
2
|
-
// tslint:disable-next-line: no-bitwise
|
|
3
|
-
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
|
4
|
-
}
|
|
5
|
-
export function uuid() {
|
|
6
|
-
const id = `${S4()}${S4()}-${S4()}-${S4()}-${S4()}-${S4()}${S4()}${S4()}`;
|
|
7
|
-
return id.toLowerCase();
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export function S4() {
|
|
2
|
+
// tslint:disable-next-line: no-bitwise
|
|
3
|
+
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
|
4
|
+
}
|
|
5
|
+
export function uuid() {
|
|
6
|
+
const id = `${S4()}${S4()}-${S4()}-${S4()}-${S4()}-${S4()}${S4()}${S4()}`;
|
|
7
|
+
return id.toLowerCase();
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvdXVpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsRUFBRTtJQUNoQix1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUk7SUFDbEIsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzFFLE9BQU8sRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gUzQoKSB7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1iaXR3aXNlXHJcbiAgcmV0dXJuICgoKDEgKyBNYXRoLnJhbmRvbSgpKSAqIDB4MTAwMDApIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHV1aWQoKSB7XHJcbiAgY29uc3QgaWQgPSBgJHtTNCgpfSR7UzQoKX0tJHtTNCgpfS0ke1M0KCl9LSR7UzQoKX0tJHtTNCgpfSR7UzQoKX0ke1M0KCl9YDtcclxuICByZXR1cm4gaWQudG9Mb3dlckNhc2UoKTtcclxufVxyXG4iXX0=
|
package/esm2015/lib/watcher.js
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
|
-
import { distinctUntilChanged } from 'rxjs/operators';
|
|
3
|
-
export var SubjectStatus;
|
|
4
|
-
(function (SubjectStatus) {
|
|
5
|
-
SubjectStatus[SubjectStatus["Error"] = 0] = "Error";
|
|
6
|
-
SubjectStatus[SubjectStatus["Done"] = 1] = "Done";
|
|
7
|
-
SubjectStatus[SubjectStatus["Working"] = 2] = "Working";
|
|
8
|
-
SubjectStatus[SubjectStatus["Waiting"] = 3] = "Waiting";
|
|
9
|
-
})(SubjectStatus || (SubjectStatus = {}));
|
|
10
|
-
export class Watcher {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.status$ = new Subject();
|
|
13
|
-
}
|
|
14
|
-
get status() {
|
|
15
|
-
return this._status;
|
|
16
|
-
}
|
|
17
|
-
set status(value) {
|
|
18
|
-
this._status = value;
|
|
19
|
-
this.status$.next(value);
|
|
20
|
-
}
|
|
21
|
-
// tslint:disable-next-line:ban-types
|
|
22
|
-
subscribe(callback, scope) {
|
|
23
|
-
this.watch();
|
|
24
|
-
this.status$$ = this.status$
|
|
25
|
-
.pipe(distinctUntilChanged())
|
|
26
|
-
.subscribe((status) => {
|
|
27
|
-
this.handleStatusChange(status);
|
|
28
|
-
callback.call(scope, this);
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
unsubscribe() {
|
|
32
|
-
this.unwatch();
|
|
33
|
-
if (this.status$$ !== undefined) {
|
|
34
|
-
this.status$$.unsubscribe();
|
|
35
|
-
this.status$$ = undefined;
|
|
36
|
-
}
|
|
37
|
-
this.status = SubjectStatus.Waiting;
|
|
38
|
-
}
|
|
39
|
-
handleStatusChange(status) { }
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { distinctUntilChanged } from 'rxjs/operators';
|
|
3
|
+
export var SubjectStatus;
|
|
4
|
+
(function (SubjectStatus) {
|
|
5
|
+
SubjectStatus[SubjectStatus["Error"] = 0] = "Error";
|
|
6
|
+
SubjectStatus[SubjectStatus["Done"] = 1] = "Done";
|
|
7
|
+
SubjectStatus[SubjectStatus["Working"] = 2] = "Working";
|
|
8
|
+
SubjectStatus[SubjectStatus["Waiting"] = 3] = "Waiting";
|
|
9
|
+
})(SubjectStatus || (SubjectStatus = {}));
|
|
10
|
+
export class Watcher {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.status$ = new Subject();
|
|
13
|
+
}
|
|
14
|
+
get status() {
|
|
15
|
+
return this._status;
|
|
16
|
+
}
|
|
17
|
+
set status(value) {
|
|
18
|
+
this._status = value;
|
|
19
|
+
this.status$.next(value);
|
|
20
|
+
}
|
|
21
|
+
// tslint:disable-next-line:ban-types
|
|
22
|
+
subscribe(callback, scope) {
|
|
23
|
+
this.watch();
|
|
24
|
+
this.status$$ = this.status$
|
|
25
|
+
.pipe(distinctUntilChanged())
|
|
26
|
+
.subscribe((status) => {
|
|
27
|
+
this.handleStatusChange(status);
|
|
28
|
+
callback.call(scope, this);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
unsubscribe() {
|
|
32
|
+
this.unwatch();
|
|
33
|
+
if (this.status$$ !== undefined) {
|
|
34
|
+
this.status$$.unsubscribe();
|
|
35
|
+
this.status$$ = undefined;
|
|
36
|
+
}
|
|
37
|
+
this.status = SubjectStatus.Waiting;
|
|
38
|
+
}
|
|
39
|
+
handleStatusChange(status) { }
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9saWIvd2F0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxNQUFNLENBQU4sSUFBWSxhQUtYO0FBTEQsV0FBWSxhQUFhO0lBQ3ZCLG1EQUFTLENBQUE7SUFDVCxpREFBUSxDQUFBO0lBQ1IsdURBQVcsQ0FBQTtJQUNYLHVEQUFXLENBQUE7QUFDYixDQUFDLEVBTFcsYUFBYSxLQUFiLGFBQWEsUUFLeEI7QUFFRCxNQUFNLE9BQWdCLE9BQU87SUFBN0I7UUFDUyxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQWlCLENBQUM7SUFzQ2hELENBQUM7SUFuQ0MsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFvQjtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBT0QscUNBQXFDO0lBQ3JDLFNBQVMsQ0FBQyxRQUFrQixFQUFFLEtBQVc7UUFDdkMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTzthQUN6QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzthQUM1QixTQUFTLENBQUMsQ0FBQyxNQUFxQixFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDdEMsQ0FBQztJQUVTLGtCQUFrQixDQUFDLE1BQXFCLElBQUcsQ0FBQztDQUN2RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmV4cG9ydCBlbnVtIFN1YmplY3RTdGF0dXMge1xyXG4gIEVycm9yID0gMCxcclxuICBEb25lID0gMSxcclxuICBXb3JraW5nID0gMixcclxuICBXYWl0aW5nID0gM1xyXG59XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2F0Y2hlciB7XHJcbiAgcHVibGljIHN0YXR1cyQgPSBuZXcgU3ViamVjdDxTdWJqZWN0U3RhdHVzPigpO1xyXG4gIHByb3RlY3RlZCBzdGF0dXMkJDogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBnZXQgc3RhdHVzKCk6IFN1YmplY3RTdGF0dXMge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICB9XHJcbiAgc2V0IHN0YXR1cyh2YWx1ZTogU3ViamVjdFN0YXR1cykge1xyXG4gICAgdGhpcy5fc3RhdHVzID0gdmFsdWU7XHJcbiAgICB0aGlzLnN0YXR1cyQubmV4dCh2YWx1ZSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3N0YXR1czogU3ViamVjdFN0YXR1cztcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHdhdGNoKCk7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCB1bndhdGNoKCk7XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpiYW4tdHlwZXNcclxuICBzdWJzY3JpYmUoY2FsbGJhY2s6IEZ1bmN0aW9uLCBzY29wZT86IGFueSkge1xyXG4gICAgdGhpcy53YXRjaCgpO1xyXG5cclxuICAgIHRoaXMuc3RhdHVzJCQgPSB0aGlzLnN0YXR1cyRcclxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcclxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBTdWJqZWN0U3RhdHVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTdGF0dXNDaGFuZ2Uoc3RhdHVzKTtcclxuICAgICAgICBjYWxsYmFjay5jYWxsKHNjb3BlLCB0aGlzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1bnN1YnNjcmliZSgpIHtcclxuICAgIHRoaXMudW53YXRjaCgpO1xyXG4gICAgaWYgKHRoaXMuc3RhdHVzJCQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLnN0YXR1cyQkLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuc3RhdHVzJCQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXR1cyA9IFN1YmplY3RTdGF0dXMuV2FpdGluZztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVTdGF0dXNDaGFuZ2Uoc3RhdHVzOiBTdWJqZWN0U3RhdHVzKSB7fVxyXG59XHJcbiJdfQ==
|
package/esm2015/public_api.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of utils
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of utils
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3V0aWxzL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgdXRpbHNcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYic7XHJcbiJdfQ==
|