1 | var split = require('browser-split')
|
2 | var ClassList = require('class-list')
|
3 |
|
4 | module.exports = h
|
5 |
|
6 | function h() {
|
7 | var args = [].slice.call(arguments), e = null
|
8 | function item (l) {
|
9 | var r
|
10 | function parseClass (string) {
|
11 | var m = split(string, /([\.#]?[a-zA-Z0-9_-]+)/)
|
12 | forEach(m, function (v) {
|
13 | var s = v.substring(1,v.length)
|
14 | if(!v) return
|
15 | if(!e)
|
16 | e = document.createElement(v)
|
17 | else if (v[0] === '.')
|
18 | ClassList(e).add(s)
|
19 | else if (v[0] === '#')
|
20 | e.setAttribute('id', s)
|
21 | })
|
22 | }
|
23 |
|
24 | if(l == null)
|
25 | ;
|
26 | else if('string' === typeof l) {
|
27 | if(!e)
|
28 | parseClass(l)
|
29 | else
|
30 | e.appendChild(r = document.createTextNode(l))
|
31 | }
|
32 | else if('number' === typeof l
|
33 | || 'boolean' === typeof l
|
34 | || l instanceof Date
|
35 | || l instanceof RegExp ) {
|
36 | e.appendChild(r = document.createTextNode(l.toString()))
|
37 | }
|
38 |
|
39 | else if (isArray(l))
|
40 | forEach(l, item)
|
41 | else if(isNode(l))
|
42 | e.appendChild(r = l)
|
43 | else if(l instanceof Text)
|
44 | e.appendChild(r = l)
|
45 | else if ('object' === typeof l) {
|
46 | for (var k in l) {
|
47 | if('function' === typeof l[k]) {
|
48 | if(/^on\w+/.test(k)) {
|
49 | e.addEventListener
|
50 | ? e.addEventListener(k.substring(2), l[k])
|
51 | : e.attachEvent(k, l[k])
|
52 | } else {
|
53 | e[k] = l[k]()
|
54 | l[k](function (v) {
|
55 | e[k] = v
|
56 | })
|
57 | }
|
58 | }
|
59 | else if(k === 'style') {
|
60 | for (var s in l[k]) (function(s, v) {
|
61 | if('function' === typeof v) {
|
62 | e.style.setProperty(s, v())
|
63 | v(function (val) {
|
64 | e.style.setProperty(s, val)
|
65 | })
|
66 | } else
|
67 | e.style.setProperty(s, l[k][s])
|
68 | })(s, l[k][s])
|
69 | } else
|
70 | e[k] = l[k]
|
71 | }
|
72 | } else if ('function' === typeof l) {
|
73 |
|
74 | var v = l()
|
75 | e.appendChild(r = isNode(v) ? v : document.createTextNode(v))
|
76 |
|
77 | l(function (v) {
|
78 | if(isNode(v) && r.parentElement)
|
79 | r.parentElement.replaceChild(v, r), r = v
|
80 | else
|
81 | r.textContent = v
|
82 | })
|
83 |
|
84 | }
|
85 |
|
86 | return r
|
87 | }
|
88 | while(args.length)
|
89 | item(args.shift())
|
90 |
|
91 | return e
|
92 | }
|
93 |
|
94 | function isNode (el) {
|
95 | return typeof Node != 'undefined'
|
96 | ? el instanceof Node
|
97 | : el instanceof Element
|
98 | }
|
99 |
|
100 | function forEach (arr, fn) {
|
101 | if (arr.forEach) return arr.forEach(fn)
|
102 | for (var i = 0; i < arr.length; i++) fn(arr[i], i)
|
103 | }
|
104 |
|
105 | function isArray (arr) {
|
106 | return Object.prototype.toString.call(arr) == '[object Array]'
|
107 | }
|