aboutsummaryrefslogtreecommitdiffhomepage
path: root/shared/core-utils/renderer/html.ts
blob: de4ad47ac8569c47d41f89f405fb2af34a273724 (plain) (blame)
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
export const SANITIZE_OPTIONS = {
  allowedTags: [ 'a', 'p', 'span', 'br', 'strong', 'em', 'ul', 'ol', 'li' ],
  allowedSchemes: [ 'http', 'https' ],
  allowedAttributes: {
    a: [ 'href', 'class', 'target', 'rel' ]
  },
  transformTags: {
    a: (tagName: string, attribs: any) => {
      let rel = 'noopener noreferrer'
      if (attribs.rel === 'me') rel += ' me'

      return {
        tagName,
        attribs: Object.assign(attribs, {
          target: '_blank',
          rel
        })
      }
    }
  }
}

// Thanks: https://stackoverflow.com/a/12034334
export function escapeHTML (stringParam: string) {
  if (!stringParam) return ''

  const entityMap = {
    '&': '&',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    '\'': '&#39;',
    '/': '&#x2F;',
    '`': '&#x60;',
    '=': '&#x3D;'
  }

  return String(stringParam).replace(/[&<>"'`=/]/g, s => entityMap[s])
}