1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* @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) {
- const 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
- }
|