@@ -2,73 +2,77 @@ import { Next, RenderOption } from ".";
2
2
import MarkType from "../nodes/mark-type" ;
3
3
import Node from "../nodes/node" ;
4
4
import NodeType from "../nodes/node-type" ;
5
+ import { sanitizeHTML } from "../helper/sanitize" ;
5
6
6
7
export const defaultNodeOption : RenderOption = {
7
8
[ NodeType . DOCUMENT ] :( node : Node ) => {
8
9
return ``
9
10
} ,
10
11
[ NodeType . PARAGRAPH ] :( node : Node , next : Next ) => {
11
- return `<p${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </p>`
12
+ return `<p${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </p>`
12
13
} ,
13
14
[ NodeType . LINK ] :( node : Node , next : Next ) => {
15
+ const sanitizedHref = sanitizeHTML ( node . attrs . href || node . attrs . url ) ;
14
16
if ( node . attrs . target ) {
15
- return `<a${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } href="${ node . attrs . href || node . attrs . url } " target="${ node . attrs . target } ">${ next ( node . children ) } </a>`
17
+ return `<a${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } href="${ sanitizedHref } " target="${ node . attrs . target } ">${ sanitizeHTML ( next ( node . children ) ) } </a>`
16
18
}
17
- return `<a${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } href="${ node . attrs . href || node . attrs . url } ">${ next ( node . children ) } </a>`
19
+ return `<a${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } href="${ sanitizedHref } ">${ sanitizeHTML ( next ( node . children ) ) } </a>`
18
20
} ,
19
21
[ NodeType . IMAGE ] :( node : Node , next : Next ) => {
20
- return `<img${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } src="${ node . attrs . src || node . attrs . url } " />${ next ( node . children ) } `
22
+ const sanitizedSrc = sanitizeHTML ( node . attrs . src || node . attrs . url ) ;
23
+ return `<img${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } src="${ sanitizedSrc } " />${ sanitizeHTML ( next ( node . children ) ) } `
21
24
} ,
22
25
[ NodeType . EMBED ] :( node : Node , next : Next ) => {
23
- return `<iframe${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } src="${ node . attrs . src || node . attrs . url } ">${ next ( node . children ) } </iframe>`
26
+ const sanitizedSrc = sanitizeHTML ( node . attrs . src || node . attrs . url ) ;
27
+ return `<iframe${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } src="${ sanitizedSrc } ">${ sanitizeHTML ( next ( node . children ) ) } </iframe>`
24
28
} ,
25
29
[ NodeType . HEADING_1 ] :( node : Node , next : Next ) => {
26
- return `<h1${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </h1>`
30
+ return `<h1${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </h1>`
27
31
} ,
28
32
[ NodeType . HEADING_2 ] :( node : Node , next : Next ) => {
29
- return `<h2${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </h2>`
33
+ return `<h2${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </h2>`
30
34
} ,
31
35
[ NodeType . HEADING_3 ] :( node : Node , next : Next ) => {
32
- return `<h3${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </h3>`
36
+ return `<h3${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </h3>`
33
37
} ,
34
38
[ NodeType . HEADING_4 ] :( node : Node , next : Next ) => {
35
- return `<h4${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </h4>`
39
+ return `<h4${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </h4>`
36
40
} ,
37
41
[ NodeType . HEADING_5 ] :( node : Node , next : Next ) => {
38
- return `<h5${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </h5>`
42
+ return `<h5${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </h5>`
39
43
} ,
40
44
[ NodeType . HEADING_6 ] :( node : Node , next : Next ) => {
41
- return `<h6${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </h6>`
45
+ return `<h6${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </h6>`
42
46
} ,
43
47
[ NodeType . ORDER_LIST ] :( node : Node , next : Next ) => {
44
- return `<ol${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </ol>`
48
+ return `<ol${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </ol>`
45
49
} ,
46
50
[ NodeType . FRAGMENT ] :( node : Node , next : Next ) => {
47
- return `<fragment>${ next ( node . children ) } </fragment>`
51
+ return `<fragment>${ sanitizeHTML ( next ( node . children ) ) } </fragment>`
48
52
} ,
49
53
[ NodeType . UNORDER_LIST ] :( node : Node , next : Next ) => {
50
- return `<ul${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </ul>`
54
+ return `<ul${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </ul>`
51
55
} ,
52
56
[ NodeType . LIST_ITEM ] :( node : Node , next : Next ) => {
53
- return `<li${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </li>`
57
+ return `<li${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </li>`
54
58
} ,
55
59
[ NodeType . HR ] :( node : Node , next : Next ) => {
56
60
return `<hr>`
57
61
} ,
58
62
[ NodeType . TABLE ] :( node : Node , next : Next ) => {
59
- return `<table${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </table>`
63
+ return `<table${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </table>`
60
64
} ,
61
65
[ NodeType . TABLE_HEADER ] :( node : Node , next : Next ) => {
62
- return `<thead${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </thead>`
66
+ return `<thead${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </thead>`
63
67
} ,
64
68
[ NodeType . TABLE_BODY ] :( node : Node , next : Next ) => {
65
- return `<tbody${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </tbody>`
69
+ return `<tbody${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </tbody>`
66
70
} ,
67
71
[ NodeType . TABLE_FOOTER ] :( node : Node , next : Next ) => {
68
- return `<tfoot${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </tfoot>`
72
+ return `<tfoot${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </tfoot>`
69
73
} ,
70
74
[ NodeType . TABLE_ROW ] :( node : Node , next : Next ) => {
71
- return `<tr${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </tr>`
75
+ return `<tr${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </tr>`
72
76
} ,
73
77
[ NodeType . TABLE_HEAD ] :( node : Node , next : Next ) => {
74
78
if ( node . attrs . void ) return '' ;
@@ -78,7 +82,7 @@ export const defaultNodeOption: RenderOption = {
78
82
`${ node . attrs . colSpan ? ` colspan="${ node . attrs . colSpan } "` : `` } ` +
79
83
`${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ` +
80
84
`${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ` +
81
- `${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } ` +
85
+ `${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } ` +
82
86
`</th>`
83
87
} ,
84
88
[ NodeType . TABLE_DATA ] :( node : Node , next : Next ) => {
@@ -89,52 +93,52 @@ export const defaultNodeOption: RenderOption = {
89
93
`${ node . attrs . colSpan ? ` colspan="${ node . attrs . colSpan } "` : `` } ` +
90
94
`${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ` +
91
95
`${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ` +
92
- `${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } ` +
96
+ `${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } ` +
93
97
`</td>`
94
98
} ,
95
99
[ NodeType . BLOCK_QUOTE ] :( node : Node , next : Next ) => {
96
- return `<blockquote${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </blockquote>`
100
+ return `<blockquote${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </blockquote>`
97
101
} ,
98
102
[ NodeType . CODE ] :( node : Node , next : Next ) => {
99
- return `<code${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ next ( node . children ) } </code>`
103
+ return `<code${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } >${ sanitizeHTML ( next ( node . children ) ) } </code>`
100
104
} ,
101
105
102
106
[ 'reference' ] :( node : Node , next : Next ) => {
103
107
if ( node . attrs . type === 'asset' ) {
104
- return `<img${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ node . attrs [ 'class-name' ] } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } src="${ node . attrs [ 'asset-link' ] } " />`
108
+ return `<img${ node . attrs . style ? ` style="${ node . attrs . style } "` : `` } ${ node . attrs [ 'class-name' ] ? ` class="${ sanitizeHTML ( node . attrs [ 'class-name' ] ) } "` : `` } ${ node . attrs . id ? ` id="${ node . attrs . id } "` : `` } src="${ sanitizeHTML ( node . attrs [ 'asset-link' ] ) } " />`
105
109
}
106
110
return ``
107
111
} ,
108
112
[ 'default' ] :( node : Node , next : Next ) => {
109
- return next ( node . children )
113
+ return sanitizeHTML ( next ( node . children ) )
110
114
} ,
111
115
112
116
[ MarkType . BOLD ] :( text : string ) => {
113
- return `<strong>${ text } </strong>`
117
+ return `<strong>${ sanitizeHTML ( text ) } </strong>`
114
118
} ,
115
119
[ MarkType . ITALIC ] :( text : string ) => {
116
- return `<em>${ text } </em>`
120
+ return `<em>${ sanitizeHTML ( text ) } </em>`
117
121
} ,
118
122
[ MarkType . UNDERLINE ] :( text : string ) => {
119
- return `<u>${ text } </u>`
123
+ return `<u>${ sanitizeHTML ( text ) } </u>`
120
124
} ,
121
125
[ MarkType . STRIKE_THROUGH ] :( text : string ) => {
122
- return `<strike>${ text } </strike>`
126
+ return `<strike>${ sanitizeHTML ( text ) } </strike>`
123
127
} ,
124
128
[ MarkType . INLINE_CODE ] :( text : string ) => {
125
- return `<span>${ text } </span>`
129
+ return `<span>${ sanitizeHTML ( text ) } </span>`
126
130
} ,
127
131
[ MarkType . SUBSCRIPT ] :( text : string ) => {
128
- return `<sub>${ text } </sub>`
132
+ return `<sub>${ sanitizeHTML ( text ) } </sub>`
129
133
} ,
130
134
[ MarkType . SUPERSCRIPT ] :( text : string ) => {
131
- return `<sup>${ text } </sup>`
135
+ return `<sup>${ sanitizeHTML ( text ) } </sup>`
132
136
} ,
133
137
[ MarkType . BREAK ] :( text : string ) => {
134
- return `<br />${ text } `
138
+ return `<br />${ sanitizeHTML ( text ) } `
135
139
} ,
136
140
[ MarkType . CLASSNAME_OR_ID ] :( text : string , classname : string , id :string ) => {
137
- return `<span${ classname ? ` class="${ classname } "` : `` } ${ id ? ` id="${ id } "` : `` } >${ text } </span>`
141
+ return `<span${ classname ? ` class="${ classname } "` : `` } ${ id ? ` id="${ id } "` : `` } >${ sanitizeHTML ( text ) } </span>`
138
142
}
139
143
140
144
}
0 commit comments