UNPKG

2.69 kBJavaScriptView Raw
1var split = require('browser-split')
2var ClassList = require('class-list')
3
4module.exports = h
5
6function 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 //there might be a better way to handle this...
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 //assume it's an observable!
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
94function isNode (el) {
95 return typeof Node != 'undefined'
96 ? el instanceof Node
97 : el instanceof Element
98}
99
100function 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
105function isArray (arr) {
106 return Object.prototype.toString.call(arr) == '[object Array]'
107}