-
Notifications
You must be signed in to change notification settings - Fork 17
/
stt.js
42 lines (37 loc) · 1.19 KB
/
stt.js
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
class STT {
static escape(v) {
return v.toString().replace(/@/g, '@A').replace(/\//g, '@S');
}
static unescape(v) {
return v.toString().replace(/@S/g, '/').replace(/@A/g, '@');
}
static serialize(raw) {
if (Object.prototype.toString.call(raw).slice(8, -1) === 'Object') {
return Object.entries(raw)
.map(([k, v]) => `${k}@=${STT.serialize(v)}`)
.join('');
} else if (Array.isArray(raw)) {
return raw.map(v => `${STT.serialize(v)}`).join('');
} else {
return STT.escape(raw.toString()) + '/';
}
}
static deserialize(raw) {
if (raw.includes('//')) {
return raw.split('//')
.filter(e => e !== '')
.map(item => STT.deserialize(item));
}
if (raw.includes('@=')) {
return raw.split('/')
.filter(e => e !== '')
.reduce((o, s) => {
const [k, v] = s.split('@=');
return o[k] = v ? STT.deserialize(v) : '', o;
}, {});
} else {
return STT.unescape(raw);
}
}
}
module.exports = STT;