-
Notifications
You must be signed in to change notification settings - Fork 264
/
converter.js
72 lines (59 loc) · 1.66 KB
/
converter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import camelize from './utils/camelize'
function capitalize(val) {
return val.charAt(0).toUpperCase() + val.slice(1)
}
function styleToObject(style) {
return style
.split(';')
.map(s => s.trim())
.filter(s => s)
.reduce((acc, pair) => {
const i = pair.indexOf(':')
const prop = camelize(pair.slice(0, i))
const value = pair.slice(i + 1).trim()
prop.startsWith('webkit')
? (acc[capitalize(prop)] = value)
: (acc[prop] = value)
return acc
}, {})
}
function convert(createElement, element, extraProps = {}) {
if (typeof element === 'string') {
return element
}
const children = (element.children || []).map(child => {
return convert(createElement, child)
})
/* eslint-disable dot-notation */
const mixins = Object.keys(element.attributes || {}).reduce(
(acc, key) => {
const val = element.attributes[key]
switch (key) {
case 'class':
acc.attrs['className'] = val
delete element.attributes['class']
break
case 'style':
acc.attrs['style'] = styleToObject(val)
break
default:
if (key.indexOf('aria-') === 0 || key.indexOf('data-') === 0) {
acc.attrs[key.toLowerCase()] = val
} else {
acc.attrs[camelize(key)] = val
}
}
return acc
},
{ attrs: {} }
)
const { style: existingStyle = {}, ...remaining } = extraProps
mixins.attrs['style'] = { ...mixins.attrs['style'], ...existingStyle }
/* eslint-enable */
return createElement(
element.tag,
{ ...mixins.attrs, ...remaining },
...children
)
}
export default convert