Blame view

node_modules/vue/src/platforms/web/util/style.js 1.89 KB
aaac7fed   liuqimichale   add
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
  /* @flow */
  
  import { cached, extend, toObject } from 'shared/util'
  
  export const parseStyleText = cached(function (cssText) {
    const res = {}
    const listDelimiter = /;(?![^(]*\))/g
    const propertyDelimiter = /:(.+)/
    cssText.split(listDelimiter).forEach(function (item) {
      if (item) {
        var tmp = item.split(propertyDelimiter)
        tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim())
      }
    })
    return res
  })
  
  // merge static and dynamic style data on the same vnode
  function normalizeStyleData (data: VNodeData): ?Object {
    const style = normalizeStyleBinding(data.style)
    // static style is pre-processed into an object during compilation
    // and is always a fresh object, so it's safe to merge into it
    return data.staticStyle
      ? extend(data.staticStyle, style)
      : style
  }
  
  // normalize possible array / string values into Object
  export function normalizeStyleBinding (bindingStyle: any): ?Object {
    if (Array.isArray(bindingStyle)) {
      return toObject(bindingStyle)
    }
    if (typeof bindingStyle === 'string') {
      return parseStyleText(bindingStyle)
    }
    return bindingStyle
  }
  
  /**
   * parent component style should be after child's
   * so that parent component's style could override it
   */
  export function getStyle (vnode: VNodeWithData, checkChild: boolean): Object {
    const res = {}
    let styleData
  
    if (checkChild) {
      let childNode = vnode
      while (childNode.componentInstance) {
        childNode = childNode.componentInstance._vnode
        if (
          childNode && childNode.data &&
          (styleData = normalizeStyleData(childNode.data))
        ) {
          extend(res, styleData)
        }
      }
    }
  
    if ((styleData = normalizeStyleData(vnode.data))) {
      extend(res, styleData)
    }
  
    let parentNode = vnode
    while ((parentNode = parentNode.parent)) {
      if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {
        extend(res, styleData)
      }
    }
    return res
  }