-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
124 lines (111 loc) · 2 KB
/
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
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
const replaceAll =
String.prototype.replaceAll ||
function (searchValue, replaceValue) {
return this.split(searchValue).join(replaceValue);
};
const markdownV2EscapeList = [
"_",
"*",
"[",
"]",
"(",
")",
"~",
"`",
">",
"#",
"+",
"-",
"=",
"|",
"{",
"}",
".",
"!",
];
const markdownV1EscapeList = ["_", "*", "`", "["];
const HTMLEscapeMap = {
"&": "&",
"<": "<",
">": ">",
};
/**
* @param {String} text
*
* @returns {String}
*/
const escapeHTML = (text) =>
Object.keys(HTMLEscapeMap).reduce(
(oldText, charToEscape) =>
replaceAll.call(oldText, charToEscape, HTMLEscapeMap[charToEscape]),
text
);
/**
*
* @param {String} text
* @returns {String}
*/
const escapeMarkdown = (text) =>
markdownV2EscapeList.reduce(
(oldText, charToEscape) =>
replaceAll.call(oldText, charToEscape, `\\${charToEscape}`),
text
);
/**
*
* @param {String} text
* @returns {String}
*/
const escapeMarkdownV1 = (text) =>
markdownV1EscapeList.reduce(
(oldText, charToEscape) =>
replaceAll.call(oldText, charToEscape, `\\${charToEscape}`),
text
);
/**
* @callback EscapeFunction
* @param {String} text
* @returns {String}
*/
/**
* @callback TagEscapeFunction
* @param {TemplateStringsArray} template
* @param {...any} substitutions
* @returns {String}
*/
/**
* @private
* @param {EscapeFunction} escape
* @returns {TagEscapeFunction}
*/
const escapeTag =
(escape) =>
(template, ...substitutions) =>
String.raw(
template,
...substitutions.map((substitution) =>
escape(
String(substitution ?? (substitution === null ? "null" : "undefined"))
)
)
);
/**
* @type {TagEscapeFunction}
*/
const HTML = escapeTag(escapeHTML);
/**
* @type {TagEscapeFunction}
*/
const md = escapeTag(escapeMarkdown);
/**
* @type {TagEscapeFunction}
*/
const mdv1 = escapeTag(escapeMarkdownV1);
module.exports = {
escapeHTML,
escapeMarkdown,
escapeMarkdownV1,
HTML,
md,
mdv1,
};