-
-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathindex.js
33 lines (26 loc) · 886 Bytes
/
index.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
import escapeStringRegexp from 'escape-string-regexp';
import builtinReplacements from './replacements.js';
const doCustomReplacements = (string, replacements) => {
for (const [key, value] of replacements) {
// TODO: Use `String#replaceAll()` when targeting Node.js 16.
string = string.replace(new RegExp(escapeStringRegexp(key), 'g'), value);
}
return string;
};
export default function transliterate(string, options) {
if (typeof string !== 'string') {
throw new TypeError(`Expected a string, got \`${typeof string}\``);
}
options = {
customReplacements: [],
...options
};
const customReplacements = new Map([
...builtinReplacements,
...options.customReplacements
]);
string = string.normalize();
string = doCustomReplacements(string, customReplacements);
string = string.normalize('NFD').replace(/\p{Diacritic}/gu, '').normalize();
return string;
}