UNPKG

3.39 kBJavaScriptView Raw
1import fs from "fs";
2import path from "path";
3
4const dataDir = path.join(__dirname, '../data/');
5const re11 = new RegExp(/_/g);
6const replacements = {};
7const fileCache = [];
8
9const 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
17const 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
64const 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 // Let's allow comments with '#'
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 * The default json format is and array of objects with a phase / replacement keys
95 * key = replacement and value is the match phrase.
96 */
97const 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
108const 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
118const uniq = function(a) {
119 return a.sort().filter(function(item, pos, ary) {
120 return !pos || item != ary[pos - 1];
121 })
122}
123
124
125export default {prepFile, quotemeta, replacements, uniq};