const {
|
module: autoComponentsModule,
|
compileTemplate
|
} = require('@dcloudio/uni-template-compiler/lib/auto-components')
|
|
const {
|
isUnaryTag
|
} = require('@dcloudio/uni-template-compiler/lib/util')
|
|
const TAGS = [
|
'text',
|
'image',
|
'input',
|
'textarea',
|
'video',
|
'web-view',
|
// 'switch',
|
'slider'
|
]
|
|
function isTextElement (node) {
|
return node.type === 1 /* NodeTypes.ELEMENT */ && node.tag === 'text'
|
}
|
|
/*
|
1. 转换 \\n 为 \n
|
2. u-text 下只能有一个文本节点(不支持 children),需要移除子组件并合并文本
|
*/
|
function parseText (el) {
|
const children = el.children
|
if (children.length > 1) {
|
const expression = []
|
children.forEach(child => {
|
if (child.type === 3) {
|
expression.push(`" ${child.text}"`)
|
} else if (child.type === 2) {
|
expression.push(child.expression.replace(/\\n/g, ''))
|
}
|
})
|
el.children = [{ type: 2, expression: expression.join('+'), tokens: [] }]
|
} else if (children.length === 1 && children[0].text) {
|
children[0].text = children[0].text.replace(/\n/g, '').replace(/\\n/g, '\n')
|
}
|
}
|
|
const modules = [{
|
// render-whole => append="tree"
|
preTransformNode (el, options) {
|
if (!Object.hasOwnProperty.call(el.attrsMap, 'append')) {
|
const name = 'render-whole'
|
const value = el.attrsMap[name]
|
if (value === true || value === 'true') {
|
// remove
|
delete el.attrsMap.append
|
const index = el.attrsList.findIndex(item => item.name === name)
|
const attr = el.attrsList[index]
|
el.attrsList.splice(index, 1)
|
|
el.appendAsTree = true
|
el.attrsMap.append = 'tree'
|
el.attrsList.push({
|
name: 'append',
|
value: 'tree',
|
bool: false,
|
start: attr.start,
|
end: attr.end
|
})
|
}
|
}
|
}
|
}]
|
|
const deprecated = {
|
events: {
|
tap: 'click'
|
}
|
}
|
|
if (process.env.UNI_USING_NVUE_COMPILER) {
|
const wrapperTextTag = function (el, options) {
|
const tag = el.tag
|
if (isTextElement(el)) {
|
parseText(el)
|
}
|
if (tag === 'text' || tag === 'u-text' || tag === 'button') {
|
return
|
}
|
const children = el.children
|
children.forEach((child, index) => {
|
if (child.text) {
|
children.splice(index, 1, {
|
type: 1,
|
tag: 'u-text',
|
attrsList: [],
|
attrsMap: {},
|
rawAttrsMap: {},
|
parent: el,
|
children: [child],
|
plain: true
|
})
|
}
|
})
|
}
|
|
modules.push({
|
postTransformNode (el, options) {
|
wrapperTextTag(el, options)
|
|
if (TAGS.includes(el.tag)) {
|
el.tag = 'u-' + el.tag
|
}
|
if (el.events) {
|
const {
|
events: eventsMap
|
} = deprecated
|
Object.keys(el.events).forEach(name => {
|
// 过时事件类型转换
|
if (eventsMap[name]) {
|
if (!(name === 'tap' && el.tag === 'map')) { // map 的 tap 事件不做转换
|
el.events[eventsMap[name]] = el.events[name]
|
delete el.events[name]
|
name = eventsMap[name]
|
}
|
}
|
})
|
}
|
if (el.tag === 'u-video') {
|
if (
|
Array.isArray(el.children) &&
|
el.children.length &&
|
el.children[0].tag !== 'u-scalable'
|
) {
|
el.children = [{
|
type: 1,
|
tag: 'u-scalable',
|
attrsList: [],
|
attrsMap: {
|
style: 'position: absolute;left: 0;right: 0;top: 0;bottom: 0;'
|
},
|
rawAttrsMap: {
|
style: {
|
name: 'style',
|
value: 'position: absolute;left: 0;right: 0;top: 0;bottom: 0;'
|
}
|
},
|
plain: false,
|
staticStyle: '{position:"absolute",left:"0",right:"0",top:"0",bottom:"0"}',
|
children: el.children
|
}]
|
}
|
}
|
}
|
})
|
}
|
|
const compiler = require('weex-template-compiler')
|
const oldCompile = compiler.compile
|
compiler.compile = function (source, options = {}) {
|
(options.modules || (options.modules = [])).push(autoComponentsModule)
|
|
options.modules.push(require('@dcloudio/uni-template-compiler/lib/asset-url'))
|
options.modules.push(require('@dcloudio/uni-template-compiler/lib/bool-attr'))
|
|
options.isUnaryTag = isUnaryTag
|
// 将 autoComponents 挂在 isUnaryTag 上边
|
options.isUnaryTag.autoComponents = new Set()
|
options.preserveWhitespace = false
|
return compileTemplate(source, options, oldCompile)
|
}
|
|
module.exports = {
|
isAppNVue: true,
|
compiler,
|
compilerOptions: {
|
modules
|
}
|
}
|