/* @flow */
|
|
import { addIfCondition } from 'compiler/parser/index'
|
import { getAndRemoveAttr, addRawAttr } from 'compiler/helpers'
|
|
function hasConditionDirective (el: ASTElement): boolean {
|
for (const attr in el.attrsMap) {
|
if (/^v\-if|v\-else|v\-else\-if$/.test(attr)) {
|
return true
|
}
|
}
|
return false
|
}
|
|
function getPreviousConditions (el: ASTElement): Array<string> {
|
const conditions = []
|
if (el.parent && el.parent.children) {
|
for (let c = 0, n = el.parent.children.length; c < n; ++c) {
|
// $flow-disable-line
|
const ifConditions = el.parent.children[c].ifConditions
|
if (ifConditions) {
|
for (let i = 0, l = ifConditions.length; i < l; ++i) {
|
const condition = ifConditions[i]
|
if (condition && condition.exp) {
|
conditions.push(condition.exp)
|
}
|
}
|
}
|
}
|
}
|
return conditions
|
}
|
|
export function preTransformVIf (el: ASTElement, options: WeexCompilerOptions) {
|
if (hasConditionDirective(el)) {
|
let exp
|
const ifExp = getAndRemoveAttr(el, 'v-if', true /* remove from attrsMap */)
|
const elseifExp = getAndRemoveAttr(el, 'v-else-if', true)
|
// don't need the value, but remove it to avoid being generated as a
|
// custom directive
|
getAndRemoveAttr(el, 'v-else', true)
|
if (ifExp) {
|
exp = ifExp
|
addIfCondition(el, { exp: ifExp, block: el })
|
} else {
|
elseifExp && addIfCondition(el, { exp: elseifExp, block: el })
|
const prevConditions = getPreviousConditions(el)
|
if (prevConditions.length) {
|
const prevMatch = prevConditions.join(' || ')
|
exp = elseifExp
|
? `!(${prevMatch}) && (${elseifExp})` // v-else-if
|
: `!(${prevMatch})` // v-else
|
} else if (process.env.NODE_ENV !== 'production' && options.warn) {
|
options.warn(
|
`v-${elseifExp ? ('else-if="' + elseifExp + '"') : 'else'} ` +
|
`used on element <${el.tag}> without corresponding v-if.`
|
)
|
return
|
}
|
}
|
addRawAttr(el, '[[match]]', exp)
|
}
|
}
|