1 | var React = require('react');
|
2 | var attributesToProps = require('./attributes-to-props');
|
3 | var utilities = require('./utilities');
|
4 |
|
5 | var setStyleProp = utilities.setStyleProp;
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | function domToReact(nodes, options) {
|
17 | options = options || {};
|
18 |
|
19 | var library = options.library || React;
|
20 | var cloneElement = library.cloneElement;
|
21 | var createElement = library.createElement;
|
22 | var isValidElement = library.isValidElement;
|
23 |
|
24 | var result = [];
|
25 | var node;
|
26 | var hasReplace = typeof options.replace === 'function';
|
27 | var replaceElement;
|
28 | var props;
|
29 | var children;
|
30 | var data;
|
31 | var trim = options.trim;
|
32 |
|
33 | for (var i = 0, len = nodes.length; i < len; i++) {
|
34 | node = nodes[i];
|
35 |
|
36 |
|
37 | if (hasReplace) {
|
38 | replaceElement = options.replace(node);
|
39 |
|
40 | if (isValidElement(replaceElement)) {
|
41 |
|
42 |
|
43 | if (len > 1) {
|
44 | replaceElement = cloneElement(replaceElement, {
|
45 | key: replaceElement.key || i
|
46 | });
|
47 | }
|
48 | result.push(replaceElement);
|
49 | continue;
|
50 | }
|
51 | }
|
52 |
|
53 | if (node.type === 'text') {
|
54 |
|
55 | if (trim) {
|
56 | data = node.data.trim();
|
57 | if (data) {
|
58 | result.push(node.data);
|
59 | }
|
60 | } else {
|
61 | result.push(node.data);
|
62 | }
|
63 | continue;
|
64 | }
|
65 |
|
66 | props = node.attribs;
|
67 | if (skipAttributesToProps(node)) {
|
68 | setStyleProp(props.style, props);
|
69 | } else if (props) {
|
70 | props = attributesToProps(props);
|
71 | }
|
72 |
|
73 | children = null;
|
74 |
|
75 | switch (node.type) {
|
76 | case 'script':
|
77 | case 'style':
|
78 |
|
79 |
|
80 | if (node.children[0]) {
|
81 | props.dangerouslySetInnerHTML = {
|
82 | __html: node.children[0].data
|
83 | };
|
84 | }
|
85 | break;
|
86 |
|
87 | case 'tag':
|
88 |
|
89 |
|
90 | if (node.name === 'textarea' && node.children[0]) {
|
91 | props.defaultValue = node.children[0].data;
|
92 | } else if (node.children && node.children.length) {
|
93 |
|
94 | children = domToReact(node.children, options);
|
95 | }
|
96 | break;
|
97 |
|
98 |
|
99 | default:
|
100 | continue;
|
101 | }
|
102 |
|
103 |
|
104 |
|
105 | if (len > 1) {
|
106 | props.key = i;
|
107 | }
|
108 |
|
109 | result.push(createElement(node.name, props, children));
|
110 | }
|
111 |
|
112 | return result.length === 1 ? result[0] : result;
|
113 | }
|
114 |
|
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 | function skipAttributesToProps(node) {
|
123 | return (
|
124 | utilities.PRESERVE_CUSTOM_ATTRIBUTES &&
|
125 | node.type === 'tag' &&
|
126 | utilities.isCustomComponent(node.name, node.attribs)
|
127 | );
|
128 | }
|
129 |
|
130 | module.exports = domToReact;
|