Skip to content

Commit 310f45e

Browse files
Merge pull request #28 from remarkablemark/html-to-dom
Replace HTML to DOM implementation with `html-dom-parser` package
2 parents 40fec9d + e207d62 commit 310f45e

11 files changed

+69
-420
lines changed

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ Parser('<p>Hello, world!</p>');
2727

2828
## Installation
2929

30+
[NPM](https://www.npmjs.com/package/html-react-parser):
31+
3032
```sh
3133
$ npm install html-react-parser
3234
```
3335

34-
Or you can download the script from a CDN:
36+
[CDN](https://unpkg.com/html-react-parser/):
3537

3638
```html
3739
<!-- HTMLReactParser depends on React -->
@@ -113,7 +115,7 @@ The element is only replaced if a valid React Element is returned.
113115
```js
114116
// with JSX
115117
Parser('<p id="replace">text</p>', {
116-
replace: (domNode) => {
118+
replace: function(domNode) {
117119
if (domNode.attribs && domNode.attribs.id === 'replace') {
118120
return <span>replaced</span>;
119121
}
@@ -189,9 +191,8 @@ $ npm run lint
189191

190192
## Special Thanks
191193

192-
- To [htmlparser2](https://github.com/fb55/htmlparser2).
193-
- To all the [contributors](https://github.com/remarkablemark/html-react-parser/graphs/contributors).
194-
- To [benox3](https://github.com/benox3) and [tdlm](https://github.com/tdlm) for their feedback and review.
194+
- [html-dom-parser](https://github.com/remarkablemark/html-dom-parser)
195+
- [Contributors](https://github.com/remarkablemark/html-react-parser/graphs/contributors)
195196

196197
## License
197198

index.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
* Module dependencies.
55
*/
66
var domToReact = require('./lib/dom-to-react');
7-
var htmlToDOM = (
8-
process.browser ?
9-
require('./lib/html-to-dom-client') :
10-
require('./lib/html-to-dom-server')
11-
);
7+
var htmlToDOM = require('html-dom-parser');
128

139
/**
1410
* Convert HTML string to React elements.

lib/html-to-dom-client.js

Lines changed: 0 additions & 150 deletions
This file was deleted.

lib/html-to-dom-server.js

Lines changed: 0 additions & 26 deletions
This file was deleted.

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@
2828
"converter"
2929
],
3030
"dependencies": {
31-
"domhandler": "^2.3.0",
32-
"htmlparser2": "^3.9.1"
31+
"html-dom-parser": "0.0.2"
3332
},
3433
"devDependencies": {
3534
"coveralls": "^2.11.12",

test/dom-to-react.js

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55
*/
66
var assert = require('assert');
77
var React = require('react');
8-
var htmlToDOMServer = require('../lib/html-to-dom-server');
8+
var htmlToDOM = require('html-dom-parser');
99
var domToReact = require('../lib/dom-to-react');
1010
var helpers = require('./helpers/');
11-
var data = require('./data');
11+
var mocks = helpers.mocks;
12+
var render = helpers.render;
1213

1314
/**
1415
* Tests for `domToReact`.
1516
*/
1617
describe('dom-to-react parser', function() {
1718

1819
it('converts single DOM node to React', function() {
19-
var html = data.html.single;
20-
var reactElement = domToReact(htmlToDOMServer(html));
20+
var html = mocks.html.single;
21+
var reactElement = domToReact(htmlToDOM(html));
22+
2123
assert(React.isValidElement(reactElement));
2224
assert.deepEqual(
2325
reactElement,
@@ -26,12 +28,14 @@ describe('dom-to-react parser', function() {
2628
});
2729

2830
it('converts multiple DOM nodes to React', function() {
29-
var html = data.html.multiple;
30-
var reactElements = domToReact(htmlToDOMServer(html));
31+
var html = mocks.html.multiple;
32+
var reactElements = domToReact(htmlToDOM(html));
33+
3134
reactElements.forEach(function(reactElement) {
3235
assert(React.isValidElement(reactElement));
3336
assert(reactElement.key);
3437
});
38+
3539
assert.deepEqual(
3640
reactElements,
3741
[
@@ -43,8 +47,9 @@ describe('dom-to-react parser', function() {
4347

4448
// https://facebook.github.io/react/docs/forms.html#why-textarea-value
4549
it('converts <textarea> correctly', function() {
46-
var html = data.html.textarea;
47-
var reactElement = domToReact(htmlToDOMServer(html));
50+
var html = mocks.html.textarea;
51+
var reactElement = domToReact(htmlToDOM(html));
52+
4853
assert(React.isValidElement(reactElement));
4954
assert.deepEqual(
5055
reactElement,
@@ -55,8 +60,9 @@ describe('dom-to-react parser', function() {
5560
});
5661

5762
it('does not escape <script> content', function() {
58-
var html = data.html.script;
59-
var reactElement = domToReact(htmlToDOMServer(html));
63+
var html = mocks.html.script;
64+
var reactElement = domToReact(htmlToDOM(html));
65+
6066
assert(React.isValidElement(reactElement));
6167
assert.deepEqual(
6268
reactElement,
@@ -69,8 +75,9 @@ describe('dom-to-react parser', function() {
6975
});
7076

7177
it('does not escape <style> content', function() {
72-
var html = data.html.style;
73-
var reactElement = domToReact(htmlToDOMServer(html));
78+
var html = mocks.html.style;
79+
var reactElement = domToReact(htmlToDOM(html));
80+
7481
assert(React.isValidElement(reactElement));
7582
assert.deepEqual(
7683
reactElement,
@@ -83,32 +90,40 @@ describe('dom-to-react parser', function() {
8390
});
8491

8592
it('does not have `children` for void elements', function() {
86-
var html = data.html.img;
87-
var reactElement = domToReact(htmlToDOMServer(html));
93+
var html = mocks.html.img;
94+
var reactElement = domToReact(htmlToDOM(html));
8895
assert(!reactElement.props.children);
8996
});
9097

9198
it('does not throw an error for void elements', function() {
92-
var html = data.html.void;
93-
var reactElements = domToReact(htmlToDOMServer(html));
99+
var html = mocks.html.void;
100+
var reactElements = domToReact(htmlToDOM(html));
94101
assert.doesNotThrow(function() {
95-
helpers.render(React.createElement('div', {}, reactElements));
102+
render(React.createElement('div', {}, reactElements));
96103
});
97104
});
98105

99-
it('skips HTML comments', function() {
100-
var html = [data.html.single, data.html.comment, data.html.single].join('');
101-
var reactElements = domToReact(htmlToDOMServer(html));
106+
it('skips doctype and comments', function() {
107+
var html = [
108+
mocks.html.doctype,
109+
mocks.html.single,
110+
mocks.html.comment,
111+
mocks.html.single
112+
].join('');
113+
114+
var reactElements = domToReact(htmlToDOM(html));
102115
reactElements.forEach(function(reactElement) {
103116
assert(React.isValidElement(reactElement));
104117
assert(reactElement.key);
105118
});
119+
106120
assert.deepEqual(
107121
reactElements,
108122
[
109-
React.createElement('p', { key: 0 }, 'foo'),
123+
// doctype
124+
React.createElement('p', { key: 1 }, 'foo'),
110125
// comment is in the middle
111-
React.createElement('p', { key: 2 }, 'foo')
126+
React.createElement('p', { key: 3 }, 'foo')
112127
]
113128
);
114129
});

0 commit comments

Comments
 (0)