1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | module.exports = parse;
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | var map = {
|
13 | option: [1, '<select multiple="multiple">', '</select>'],
|
14 | optgroup: [1, '<select multiple="multiple">', '</select>'],
|
15 | legend: [1, '<fieldset>', '</fieldset>'],
|
16 | thead: [1, '<table>', '</table>'],
|
17 | tbody: [1, '<table>', '</table>'],
|
18 | tfoot: [1, '<table>', '</table>'],
|
19 | colgroup: [1, '<table>', '</table>'],
|
20 | caption: [1, '<table>', '</table>'],
|
21 | tr: [2, '<table><tbody>', '</tbody></table>'],
|
22 | td: [3, '<table><tbody><tr>', '</tr></tbody></table>'],
|
23 | th: [3, '<table><tbody><tr>', '</tr></tbody></table>'],
|
24 | col: [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
|
25 | _default: [0, '', '']
|
26 | };
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 | function parse(html) {
|
37 | if ('string' != typeof html) throw new TypeError('String expected');
|
38 |
|
39 |
|
40 | var m = /<([\w:]+)/.exec(html);
|
41 | if (!m) throw new Error('No elements were generated.');
|
42 | var tag = m[1];
|
43 |
|
44 |
|
45 | if (tag == 'body') {
|
46 | var el = document.createElement('html');
|
47 | el.innerHTML = html;
|
48 | return el.removeChild(el.lastChild);
|
49 | }
|
50 |
|
51 |
|
52 | var wrap = map[tag] || map._default;
|
53 | var depth = wrap[0];
|
54 | var prefix = wrap[1];
|
55 | var suffix = wrap[2];
|
56 | var el = document.createElement('div');
|
57 | el.innerHTML = prefix + html + suffix;
|
58 | while (depth--) el = el.lastChild;
|
59 |
|
60 | var els = el.children;
|
61 | if (1 == els.length) {
|
62 | return el.removeChild(els[0]);
|
63 | }
|
64 |
|
65 | var fragment = document.createDocumentFragment();
|
66 | while (els.length) {
|
67 | fragment.appendChild(el.removeChild(els[0]));
|
68 | }
|
69 |
|
70 | return fragment;
|
71 | }
|