class.js
1.74 KB
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
73
74
75
76
/* @flow */
import { isObject } from 'shared/util'
export function genClassForVnode (vnode: VNode): string {
let data = vnode.data
let parentNode = vnode
let childNode = vnode
while (childNode.componentInstance) {
childNode = childNode.componentInstance._vnode
if (childNode.data) {
data = mergeClassData(childNode.data, data)
}
}
while ((parentNode = parentNode.parent)) {
if (parentNode.data) {
data = mergeClassData(data, parentNode.data)
}
}
return genClassFromData(data)
}
function mergeClassData (child: VNodeData, parent: VNodeData): {
staticClass: string,
class: any
} {
return {
staticClass: concat(child.staticClass, parent.staticClass),
class: child.class
? [child.class, parent.class]
: parent.class
}
}
function genClassFromData (data: Object): string {
const dynamicClass = data.class
const staticClass = data.staticClass
if (staticClass || dynamicClass) {
return concat(staticClass, stringifyClass(dynamicClass))
}
/* istanbul ignore next */
return ''
}
export function concat (a: ?string, b: ?string): string {
return a ? b ? (a + ' ' + b) : a : (b || '')
}
export function stringifyClass (value: any): string {
let res = ''
if (!value) {
return res
}
if (typeof value === 'string') {
return value
}
if (Array.isArray(value)) {
let stringified
for (let i = 0, l = value.length; i < l; i++) {
if (value[i]) {
if ((stringified = stringifyClass(value[i]))) {
res += stringified + ' '
}
}
}
return res.slice(0, -1)
}
if (isObject(value)) {
for (const key in value) {
if (value[key]) res += key + ' '
}
return res.slice(0, -1)
}
/* istanbul ignore next */
return res
}