1
1
var jsx = require ( 'jsx-runtime' ) ;
2
2
var escape = require ( 'escape-html' ) ;
3
- var Tag = require ( './tag' ) ;
3
+ var Tag = require ( './lib/tag' ) ;
4
+ var hasOwn = Object . prototype . hasOwnProperty ;
4
5
5
6
var renderer = jsx . register ( 'HTML' , {
6
7
tags : {
7
8
'*' : {
8
9
enter : function ( tag , props ) {
9
- return new Tag ( tag , props ) ;
10
+ return new Tag ( escape ( tag ) , props ) ;
10
11
} ,
11
12
leave : function ( parent , tag ) {
12
13
return parent ;
13
14
} ,
14
15
child : function ( child , parent ) {
15
16
if ( child == null ) return parent ;
16
17
17
- if ( typeof child === 'string' ) {
18
- child = escape ( child ) ;
18
+ if ( child instanceof Tag ) {
19
+ parent . children . push ( child ) ;
20
+ } else {
21
+ child = escape ( child + '' ) ;
19
22
}
20
23
21
- parent . children . push ( child ) ;
22
24
return parent ;
23
25
} ,
24
26
props : function ( props ) {
25
- return Object . keys ( props ) . map ( function ( key ) {
26
- var val = key && props [ key ] ;
27
-
28
- if ( ! key || val == null ) return '' ;
29
- if ( val instanceof Tag ) return '' ;
30
-
31
- if ( typeof val === 'string' ) {
32
- val = JSON . stringify ( val ) ;
33
- val = val . slice ( 1 , val . length - 1 ) ;
34
- } else {
35
- val = JSON . stringify ( val ) ;
36
- }
37
-
38
- return key + '="' + escape ( val ) + '"' ;
39
- } ) . join ( ' ' ) ;
27
+ return Object . keys ( props )
28
+ . map ( mapProps ) . join ( ' ' ) ;
40
29
}
41
30
}
42
31
} ,
@@ -45,4 +34,49 @@ var renderer = jsx.register('HTML', {
45
34
}
46
35
} ) ;
47
36
48
- module . exports = renderer ;
37
+ module . exports = renderer ;
38
+
39
+ function mapProps ( key ) {
40
+ var val = key && props [ key ] ;
41
+
42
+ if ( ! key || val == null ) return '' ;
43
+ if ( val instanceof Tag ) return '' ;
44
+
45
+ if ( key === 'className' ) key = 'class' ;
46
+ else if ( key === 'cssFor' ) key = 'for' ;
47
+ else key = key . toLowerCase ( ) ;
48
+
49
+ if ( key === 'style' ) {
50
+ val = handleStyle ( val ) ;
51
+ }
52
+
53
+ if ( typeof val === 'string' ) {
54
+ // do nothing
55
+ } else {
56
+ val = JSON . stringify ( val ) ;
57
+ }
58
+
59
+ return escape ( key ) + '="' + escape ( val ) + '"' ;
60
+ }
61
+
62
+ function handleStyle ( style ) {
63
+ if ( typeof style === 'string' ) return style ;
64
+
65
+ var string = '' ;
66
+
67
+ for ( var key in style ) {
68
+ if ( ! hasOwn . call ( style , key ) ) continue ;
69
+
70
+ key = key . replace ( / [ A - Z ] / g, function ( m ) {
71
+ return '-' + m . toLowerCase ( ) ;
72
+ } ) ;
73
+
74
+ if ( key . search ( / m o z - | w e b k i t - | o - | m s - / ) === 0 ) {
75
+ key = '-' + key ;
76
+ }
77
+
78
+ string += key + ': ' + val + ';' ;
79
+ }
80
+
81
+ return string ;
82
+ }
0 commit comments