1 | import fs from "fs";
|
2 | import path from "path";
|
3 |
|
4 | const dataDir = path.join(__dirname, '../data/');
|
5 | const re11 = new RegExp(/_/g);
|
6 | const replacements = {};
|
7 | const fileCache = [];
|
8 |
|
9 | const quotemeta = function (string) {
|
10 | const unsafe = "\\.+*?[^]$(){}=!<>|:";
|
11 | for (let i = 0; i < unsafe.length; i++) {
|
12 | string = string.replace(new RegExp("\\" + unsafe.charAt(i), "g"), "\\" + unsafe.charAt(i));
|
13 | }
|
14 | return string;
|
15 | };
|
16 |
|
17 | const lineHandle = function lineHandle(source, phrase, replacement = '') {
|
18 | let start = false;
|
19 | let end = false;
|
20 |
|
21 | if (phrase[0] === '<') {
|
22 | start = true;
|
23 | phrase = phrase.substring(1);
|
24 | }
|
25 |
|
26 | if (phrase.slice(-1) === '>') {
|
27 | end = true;
|
28 | phrase = phrase.substring(0, phrase.length - 1);
|
29 | }
|
30 |
|
31 | phrase = phrase.replace(re11, ' ');
|
32 | const cleanPhrase = quotemeta(phrase);
|
33 |
|
34 | phrase.split(' ').forEach((word) => {
|
35 | word = word.toLowerCase();
|
36 | if (word !== ""){
|
37 | if (replacements[word] === undefined) {
|
38 | replacements[word] = [];
|
39 | }
|
40 |
|
41 | let phraseRegex;
|
42 | let replacementRegex;
|
43 |
|
44 | if (start && end) {
|
45 | phraseRegex = new RegExp(`^${cleanPhrase}$`, 'gi');
|
46 | replacementRegex = replacement;
|
47 | } else if (start) {
|
48 | phraseRegex = new RegExp(`^${cleanPhrase}(\\W+|$)`, 'gi');
|
49 | replacementRegex = `${replacement}$1`;
|
50 | } else if (end) {
|
51 | phraseRegex = new RegExp(`(\\W+|^)${cleanPhrase}$`, 'gi');
|
52 | replacementRegex = `$1${replacement}`;
|
53 | } else {
|
54 | phraseRegex = new RegExp(`(\\W+|^)${cleanPhrase}(\\W+|$)`, 'gi');
|
55 | replacementRegex = `$1${replacement}$2`;
|
56 | }
|
57 |
|
58 | replacements[word].push({ phrase, replacement, phraseRegex, replacementRegex, source});
|
59 | replacements[word].sort((a, b) => (b.phrase.split(' ').length - a.phrase.split(' ').length));
|
60 | }
|
61 | });
|
62 | };
|
63 |
|
64 | const textFile = function(file) {
|
65 | const source = file.replace(".txt", "");
|
66 | const data = fs.readFileSync(dataDir + file, 'utf8').split(/\r|\n/);
|
67 |
|
68 | for (let i = 0; i < data.length; i++) {
|
69 | const line = data[i];
|
70 | let nline = line.trimLeft();
|
71 |
|
72 |
|
73 | const pos = nline.indexOf('#');
|
74 |
|
75 | if (pos === -1) {
|
76 | const parts = nline.split(' ');
|
77 |
|
78 | if (parts[1] === undefined) {
|
79 | lineHandle(source, parts[0], '');
|
80 | } else {
|
81 | lineHandle(source, parts[0], parts[1]);
|
82 | }
|
83 | } else if (pos > 0) {
|
84 | nline = nline.substr(0, pos);
|
85 | const parts = nline.split(' ');
|
86 | lineHandle(source, parts[0], parts[1]);
|
87 | }
|
88 | }
|
89 |
|
90 | fileCache.push(file);
|
91 | }
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 | const jsonFile = function(file) {
|
98 | var d = [];
|
99 | const source = file.replace(".json", "");
|
100 | var contents = require(dataDir + file);
|
101 | for (let i = 0; i < contents.length; i++) {
|
102 | const phrase = contents[i].phrase;
|
103 | const replacement = contents[i].replacement;
|
104 | lineHandle(source, phrase, replacement);
|
105 | }
|
106 | }
|
107 |
|
108 | const prepFile = function(file) {
|
109 | if (fileCache.indexOf(file) === -1) {
|
110 | if (file.indexOf(".txt") !== -1) {
|
111 | textFile(file);
|
112 | } else if (file.indexOf(".json") !== -1) {
|
113 | jsonFile(file);
|
114 | }
|
115 | }
|
116 | }
|
117 |
|
118 | const uniq = function(a) {
|
119 | return a.sort().filter(function(item, pos, ary) {
|
120 | return !pos || item != ary[pos - 1];
|
121 | })
|
122 | }
|
123 |
|
124 |
|
125 | export default {prepFile, quotemeta, replacements, uniq};
|