UNPKG

1.7 kBJavaScriptView Raw
1
2/**
3 * Expose `parse`.
4 */
5
6module.exports = parse;
7
8/**
9 * Wrap map from jquery.
10 */
11
12var 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 * Parse `html` and return the children.
30 *
31 * @param {String} html
32 * @return {Array}
33 * @api private
34 */
35
36function parse(html) {
37 if ('string' != typeof html) throw new TypeError('String expected');
38
39 // tag name
40 var m = /<([\w:]+)/.exec(html);
41 if (!m) throw new Error('No elements were generated.');
42 var tag = m[1];
43
44 // body support
45 if (tag == 'body') {
46 var el = document.createElement('html');
47 el.innerHTML = html;
48 return el.removeChild(el.lastChild);
49 }
50
51 // wrap map
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}