123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- const path = require('path')
- const through2 = require('through2')
- const config = require('./config')
- config.plugins.sort((a, b) => {
-
- if (a === 'editable') return 1
- if (b === 'editable') return -1
-
- if (a === 'markdown') return -1
- if (b === 'markdown') return 1
-
- return 0
- })
- const tagSelector = {}
- let tagI = 0
- if (config.externStyle) {
- config.externStyle = config.externStyle.replace(/[^,\s}]+(?=[^}]*{)/g, $ => {
- if (!/[a-zA-Z_]/.test($[0])) return $
- if (tagSelector[$]) return '.' + tagSelector[$]
- tagSelector[$] = '_' + tagI++
- return '.' + tagSelector[$]
- })
- }
- module.exports = {
-
- build (platform) {
- const builds = {}
- let pluginImports = ''
- let plugins = ''
- let voidTags = ''
- let wxml = ''
- let js = ''
- let wxss = config.externStyle
- const json = {}
-
- for (let i = 0; i < config.plugins.length; i++) {
- const plugin = config.plugins[i]
- let build = {}
- try {
-
- if (platform === 'uni-app') {
- build = require(`../plugins/${plugin}/uni-app/build.js`)
- } else {
- build = require(`../plugins/${plugin}/miniprogram/build.js`)
- }
- } catch (e) { }
- try {
-
- build = Object.assign(require(`../plugins/${plugin}/build.js`), build)
- } catch (e) { }
-
- if (!build.platform || build.platform.includes(platform)) {
- builds[plugin] = build
- if (platform === 'uni-app') {
- plugins += plugin.replace(/-([a-z])/g, ($, $1) => $1.toUpperCase()) + ','
- pluginImports += `import ${plugin.replace(/-([a-z])/g, ($, $1) => $1.toUpperCase())} from './${plugin}/${build.main ? build.main : 'index.js'}'\n`
- } else {
- plugins += `require('./${plugin}/${build.main ? build.main : 'index.js'}'),`
- }
- if (build.template) {
- wxml += build.template.replace('wx:if', 'wx:elif').replace('v-if', 'v-else-if')
- }
- if (build.methods) {
- for (const method in build.methods) {
- js += build.methods[method].toString() + ','
- }
- }
- if (build.usingComponents) {
- Object.assign(json, build.usingComponents)
- }
- if (build.style) {
- wxss += build.style
- }
- }
- }
-
- for (const item of config.customElements) {
- if (platform === 'uni-app') {
- if (item.platforms) {
- wxml += '<!-- #ifdef ' + item.platforms.join(' || ').toUpperCase() + ' -->'
- }
- voidTags += item.name + ','
- wxml += '<' + item.name + ' v-else-if="n.name==\'' + item.name + '\'" :class="n.attrs.class" :style="n.attrs.style"'
- if (item.attrs) {
- for (const attr of item.attrs) {
- wxml += ' :' + attr + '="n.attrs'
- if (attr.includes('-')) {
- wxml += '[\'' + attr + '\']"'
- } else {
- wxml += '.' + attr + '"'
- }
- }
- }
- wxml += ' />'
- if (item.platforms) {
- wxml += '<!-- #endif -->'
- }
- } else if (!item.platforms || item.platforms.join(',').toLowerCase().includes(platform)) {
- voidTags += item.name + ','
- wxml += '<' + item.name + ' wx:elif="{{n.name==\'' + item.name + '\'}}" class="{{n.attrs.class}}" style="{{n.attrs.style}}"'
- if (item.attrs) {
- for (const attr of item.attrs) {
- wxml += ' ' + attr + '="{{n.attrs'
- if (attr.includes('-')) {
- wxml += '[\'' + attr + '\']}}"'
- } else {
- wxml += '.' + attr + '}}"'
- }
- }
- }
- wxml += ' />'
- }
- }
- return through2.obj(function (file, _, callback) {
- if (file.isBuffer()) {
-
- if (file.base.includes('src')) {
- let content = file.contents.toString()
- if (file.basename === 'index.js' || file.basename === 'mp-html.vue') {
-
- if (platform === 'uni-app') {
- content = content.replace(/const\s*plugins\s*=\s*\[\]/, `${pluginImports}const plugins=[${plugins}]`)
- } else {
- content = content.replace(/plugins\s*=\s*\[\]/, `plugins=[${plugins}]`)
- }
- } else if (file.basename === 'parser.js') {
-
- content = content.replace(/tagSelector\s*=\s*{}/, `tagSelector=${JSON.stringify(tagSelector)}`)
-
- .replace(/voidTags\s*:\s*makeMap\('/, 'voidTags: makeMap(\'' + voidTags)
- } else if (file.basename === 'node.wxml') {
-
- content = content.replace(/<!--\s*insert\s*-->/, wxml)
- } else if (file.basename === 'node.js') {
-
- content = content.replace(/methods\s*:\s*{/, 'methods:{' + js)
- } else if (file.basename === 'node.wxss') {
-
- content = wxss + content
- } else if (file.basename === 'node.json') {
-
- const comps = JSON.stringify(json).slice(1, -1)
- if (comps) {
- content = content.replace(/"usingComponents"\s*:\s*{/, '"usingComponents":{' + comps + ',')
- }
- } else if (file.basename === 'node.vue') {
-
- content = content.replace(/<!--\s*insert\s*-->/, wxml)
- .replace(/methods\s*:\s*{/, 'methods:{' + js)
- .replace('<style>', '<style>' + wxss.replace(/\.[a-zA-Z_][^)}]*?[{,]/g, '/deep/ $&')).replace(/,url/g, ', url')
- let importComp = ''
- let comps = ''
- for (let item in json) {
- const val = json[item]
-
- if (val.includes('plugin://')) continue
- item = item.replace(/-([a-z])/g, (_, $1) => $1.toUpperCase())
- importComp += 'import ' + item + " from '" + val + "'\n"
- comps += item + ',\n'
- }
- content = content.replace('<script>', '<script>\n' + importComp)
- .replace(/components\s*:\s*{/, 'components: {\n' + comps)
- } else if (file.basename === 'local.html' && wxss) {
-
- content = '<style>' + wxss + '</style>' + content
- }
- file.contents = Buffer.from(content)
- for (const item in builds) {
- if (builds[item].handler) {
- builds[item].handler(file, platform)
- }
- }
- } else {
-
- const name = file.relative.split(path.sep)[0]
- const build = builds[name]
-
- if (!build || file.extname === '.md' || file.basename === 'build.js') {
- callback()
- return
- }
-
- if (build.import) {
- if (typeof build.import === 'string') {
- if (file.relative.includes(build.import)) {
- file.import = true
- }
- } else {
- for (let i = 0; i < build.import.length; i++) {
- if (file.relative.includes(build.import[i])) {
- file.import = true
- break
- }
- }
- }
- }
- if (build.handler) {
- build.handler(file, platform)
- }
- }
- }
- this.push(file)
- callback()
- })
- },
-
- importCss () {
- let css = ''
- return through2.obj(function (file, _, callback) {
- if (file.isBuffer()) {
- let content = file.contents.toString()
-
- if (file.import) {
- css += content
- callback()
- return
- }
-
- if (file.basename === 'node.wxss') {
- content = css + content
- } else if (file.basename === 'node.vue') {
- content = content.replace('<style>', '<style>' + css.replace(/\.[a-z_][^)}]+?[{,]/g, '/deep/ $&')).replace(/,url/g, ', url')
- } else if (file.basename === 'local.html' && css) {
- content = '<style>' + css + '</style>' + content
- }
- file.contents = Buffer.from(content)
- }
- this.push(file)
- callback()
- })
- }
- }
|