File tree Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Original file line number Diff line number Diff line change
1
+ const NO_RENDER = { render : false } ;
2
+
3
+ const ESC = {
4
+ '<' : '<' ,
5
+ '>' : '>' ,
6
+ '"' : '"' ,
7
+ '&' : '&'
8
+ } ;
9
+
10
+ const HOP = Object . prototype . hasOwnProperty ;
11
+
12
+ let escape = s => String ( s ) . replace ( / [ < > " & ] / , a => ESC [ a ] || a ) ;
13
+
14
+ export default function renderToString ( vnode ) {
15
+ let { nodeName, attributes, children } = vnode || EMPTY ;
16
+
17
+ // #text nodes
18
+ if ( ! nodeName ) {
19
+ return escape ( vnode ) ;
20
+ }
21
+
22
+ // components
23
+ if ( typeof nodeName === 'function' ) {
24
+ let props = { children } ,
25
+ rendered ;
26
+ for ( let i in attributes ) if ( HOP . call ( attributes , i ) ) {
27
+ props [ i ] = attributes [ i ] ;
28
+ }
29
+
30
+ if ( typeof nodeName . prototype . render !== 'function' ) {
31
+ // stateless functional components
32
+ rendered = nodeName ( props ) ;
33
+ }
34
+ else {
35
+ // class-based components
36
+ let c = new nodeName ( ) ;
37
+ c . setProps ( props , NO_RENDER ) ;
38
+ rendered = c . render ( c . props = props , c . state ) ;
39
+ }
40
+ return renderToString ( rendered ) ;
41
+ }
42
+
43
+ // render JSX to HTML
44
+ let s = `<${ nodeName } ` ;
45
+ for ( let name in attributes ) if ( HOP . call ( attributes , name ) ) {
46
+ s += ` ${ name } ="${ escape ( attributes [ name ] ) } "` ;
47
+ }
48
+ if ( children && children . length ) {
49
+ s += `>${ children . map ( renderToString ) . join ( '' ) } </${ nodeName } >` ;
50
+ }
51
+ else {
52
+ s += ' />' ;
53
+ }
54
+ return s ;
55
+ } ;
You can’t perform that action at this time.
0 commit comments