@@ -12,6 +12,8 @@ var own = {}.hasOwnProperty
1212/* Schema. */
1313var NODES = {
1414 root : { children : all } ,
15+ doctype : handleDoctype ,
16+ comment : handleComment ,
1517 element : {
1618 tagName : handleTagName ,
1719 properties : handleProperties ,
@@ -57,25 +59,36 @@ function one(schema, node, stack) {
5759 var type = node && node . type
5860 var replacement = { type : node . type }
5961 var replace = true
62+ var definition
6063 var allowed
6164 var result
6265 var key
6366
6467 if ( ! own . call ( NODES , type ) ) {
6568 replace = false
6669 } else {
67- allowed = xtend ( NODES [ type ] , NODES [ '*' ] )
70+ definition = NODES [ type ]
6871
69- for ( key in allowed ) {
70- result = allowed [ key ] ( schema , node [ key ] , node , stack )
72+ if ( typeof definition === 'function' ) {
73+ definition = definition ( schema , node )
74+ }
75+
76+ if ( ! definition ) {
77+ replace = false
78+ } else {
79+ allowed = xtend ( definition , NODES [ '*' ] )
7180
72- if ( result === false ) {
73- replace = false
81+ for ( key in allowed ) {
82+ result = allowed [ key ] ( schema , node [ key ] , node , stack )
7483
75- /* Set the non-safe value. */
76- replacement [ key ] = node [ key ]
77- } else if ( result !== null && result !== undefined ) {
78- replacement [ key ] = result
84+ if ( result === false ) {
85+ replace = false
86+
87+ /* Set the non-safe value. */
88+ replacement [ key ] = node [ key ]
89+ } else if ( result !== null && result !== undefined ) {
90+ replacement [ key ] = result
91+ }
7992 }
8093 }
8194 }
@@ -253,6 +266,11 @@ function handleProtocol(schema, value, prop) {
253266 return false
254267}
255268
269+ /* Always return a valid HTML5 doctype. */
270+ function handleDoctypeName ( ) {
271+ return 'html'
272+ }
273+
256274/* Sanitize `tagName`. */
257275function handleTagName ( schema , tagName , node , stack ) {
258276 var name = typeof tagName === 'string' ? tagName : null
@@ -286,6 +304,14 @@ function handleTagName(schema, tagName, node, stack) {
286304 return name
287305}
288306
307+ function handleDoctype ( schema ) {
308+ return schema . allowDoctypes ? { name : handleDoctypeName } : null
309+ }
310+
311+ function handleComment ( schema ) {
312+ return schema . allowComments ? { value : handleValue } : null
313+ }
314+
289315/* Sanitize `value`. */
290316function handleValue ( schema , value ) {
291317 return typeof value === 'string' ? value : ''
0 commit comments