Skip to content

Commit 0b4a820

Browse files
committed
Initial commit of lib
1 parent d2e84ba commit 0b4a820

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

src/index.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
const NO_RENDER = { render: false };
2+
3+
const ESC = {
4+
'<': '&lt;',
5+
'>': '&gt;',
6+
'"': '&quot;',
7+
'&': '&amp;'
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+
};

0 commit comments

Comments
 (0)