-
Notifications
You must be signed in to change notification settings - Fork 37
/
html.ts
96 lines (91 loc) · 1.43 KB
/
html.ts
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
import createDOMPurify from 'dompurify'
const ALLOWED_TAGS = [
'a',
'abbr',
'address',
'audio',
'b',
'bdi',
'bdo',
'blockquote',
'br',
'caption',
'center',
'cite',
'code',
'col',
'colgroup',
'data',
'datalist',
'dd',
'del',
'details',
'dfn',
'dir',
'div',
'dl',
'dt',
'em',
'figcaption',
'figure',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'hr',
'i',
'image',
'img',
'ins',
'kbd',
'li',
'mark',
'ol',
'p',
'pre',
'q',
'rp',
'rt',
'ruby',
's',
'samp',
'small',
'source',
'span',
'strong',
'sub',
'summary',
'sup',
'table',
'tbody',
'td',
'tfoot',
'th',
'thead',
'tr',
'ul',
'video'
]
let DOMPurify: ReturnType<typeof createDOMPurify> | undefined
export function sanitizeDOM(html: string): Node {
if (!DOMPurify) DOMPurify = createDOMPurify(window)
return DOMPurify.sanitize(html, {
ALLOWED_TAGS,
RETURN_DOM: true
})
}
export function parseRichTranslation(text: string): string {
if (!DOMPurify) DOMPurify = createDOMPurify(window)
let html = DOMPurify.sanitize(text, { ALLOWED_TAGS: [] })
.replace(/^[*-][ .](.*)/gm, '<ul><li>$1</li></ul>')
.replace(/<\/ul>\n<ul>/g, '\n')
if (html.includes('\n\n')) {
html = `<p>${html.replace(/\n\n/g, '</p><p>')}</p>`
}
return html
}
export function parseLink(text: string, url: string): string {
return text.replace(/\[(.*?)\]/gm, `<a href="${url}">$1</a>`)
}