-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsetmap.js
126 lines (111 loc) · 2.83 KB
/
setmap.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
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
124
125
126
import { read, write } from './fs.js';
let bantxt = "./word/ban.txt";
let allowtxt = "./word/allow.txt";
let pctt = "./word/punctuation.txt";
let banjs = "./ban.js";
let allowjs = "./allow.js";
function stringify(data) {
return JSON.stringify(data, null, 0);
}
function eachLine(src, addMap, rewrite) {
let map = {};
let list = null;
let word = read(src);
if (!word) {
console.log("File is empty or does not exist", src);
list = [];
} else {
list = Array.from(new Set(word.split("\n").filter(v => !!v)))
.sort(function (a, b) {
let len = Math.max(a.length, b.length);
let getCode = (s, i) => (s.charCodeAt(i) || -1)
for (let i = 0; i < len; i++) {
let bi = getCode(b, i), ai = getCode(a, i);
if (bi == ai) { continue; }
return (ai > bi ? 1 : -1);
}
})
.reverse();
}
// word to map
list.forEach((v, i) => {
if (addMap) {
v = addMap(map, v);
if (v) { list[i] = v; }
}
});
if (list.length > 0) {
if (rewrite) rewrite(list);
}
list = null;
return map;
}
// 1.get word and sort 2.addBan 3.rewrite
let map = eachLine(bantxt, addBan, (list) => write(bantxt, list.join("\n")));
let pmap = Object.fromEntries(
(read(pctt) || "")
.replace(/[<]/g, "") // html 中 < 不作为标点处理
.split("").sort().map(s => [s, "^"])
);
// output map.js
write(banjs,
`export const pctt = ${stringify(pmap)};\n` +
`export const ban = ${stringify(map)};`
);
map = null;
pmap = null;
// 1.get word and sort 2.addAllow 3.rewrite
let amap = eachLine(allowtxt, addAllow, (list) => write(allowtxt, list.join("\n")));
// output allow.js
write(allowjs, `export const allow = ${stringify(amap)};`);
amap = null;
function addBan(map, word) {
// word
// bad|bad1|bad2|bad3:replace
// bad^|bad1
let [ban, green = null] = word.split(":");
ban = ban.split("|").sort();
ban.forEach((str) => {
let site = map;
for (let i = 0; i < str.length; i++) {
let char = str[i];
site[char] = site[char] || {};
site = site[char];
}
if (green !== null) {
site._g = green || "";
}
site._e = 1;
});
return ban.join("|") + (green !== null ? (":" + green) : "");
}
function addAllow(map, word) {
// word
// error:allow1|allow2|allow3
let [err, allow] = word.split(":");
map[err] = map[err] || { a: {}, b: {} };
allow = allow.split("|").sort();
allow.forEach((str, i) => {
let [before = "", after = ""] = str.split(err);
// console.log("before, after", str, err, before, after)
let site = map[err].a;
for (let i = 0; i < after.length; i++) {
let char = after[i];
site[char] = site[char] || {};
site = site[char];
}
if (after.length) {
site._e = 1;
}
site = map[err].b;
for (let i = before.length - 1; i > -1; i--) {
let char = before[i];
site[char] = site[char] || {};
site = site[char];
}
if (before.length) {
site._e = 1;
}
});
return err + ":" + allow.join("|");
}