UNPKG

magix-combine

Version:

合并Magix View的html,js,css成一个js文件,并检测html,js,css中可能存在的问题

119 lines (118 loc) 4.48 kB
/* 模板处理并回写,常用于打点等功能 */ let path = require('path'); let configs = require('./util-config'); let fd = require('./util-fd'); let tmplCmd = require('./tmpl-cmd'); let attrType = require('./tmpl-attr-type'); let consts = require('./util-const'); let ts = require('typescript'); let mxTailReg = /\.m?mx$/; let templateReg = /<template([^>]*)>([\s\S]+?)<\/template>/i; let pureTagReg = /<[\w-]+[^>]*>/g; let htmlCommentCelanReg = /<!--[\s\S]*?-->/g; let commentPHReg = /\x00\d+\x00/g; let processTmpl = (tmpl, shortFrom) => { let store = Object.create(null); let comment = Object.create(null); let cIdx = 0; /*tmpl = configs.compileTmplStart(tmpl, { shortFrom, templateLang: tLang });*/ tmpl = tmplCmd.store(tmpl, store); tmpl = tmplCmd.store(tmpl, store, consts.artCommandReg); tmpl = tmpl.replace(htmlCommentCelanReg, m => { let key = '\x00' + cIdx++ + '\x00'; comment[key] = m; return key; }); //console.log(tmpl); tmpl = tmpl.replace(pureTagReg, m => { return configs.tmplTagProcessor(m, shortFrom); }); tmpl = tmpl.replace(commentPHReg, m => comment[m]); tmpl = tmplCmd.recover(tmpl, store); //tmpl = configs.compileTmplEnd(tmpl); return tmpl; }; let processMx = (content, shortFrom) => { content = content.replace(templateReg, (match, lang, body) => { let tLang = 'html'; if (lang) { lang = attrType.extractLang(lang); if (lang) { tLang = lang; } } return '<template>' + processTmpl(body, shortFrom, tLang) + '</template>'; }); return content; }; module.exports = { process(from) { return new Promise(resolve => { let shortFrom = from.replace(configs.moduleIdRemovedPath, ''); if (configs.tmplFileExtNamesReg.test(from)) { let content = fd.read(from); if (mxTailReg.test(from)) { let mxContent = processMx(content, shortFrom); if (content != mxContent) { fd.write(from, mxContent); } resolve(); } else { let ext = path.extname(from); let tmplContent = processTmpl(content, shortFrom, ext.substring(1)); if (tmplContent != content) { fd.write(from, tmplContent); } resolve(); } } else if (configs.tmplSnippetInScript && configs.jsFileExtNamesReg.test(from)) { let content = fd.read(from); let ast; try { ast = ts.createSourceFile(from, content); } catch (ex) { console.log(from); console.error(ex); return reject(ex); } let modifiers = []; let walk = node => { if (node.kind != ts.SyntaxKind.TemplateExpression) { ts.forEachChild(node, walk); } if (node.kind == ts.SyntaxKind.StringLiteral || node.kind == ts.SyntaxKind.TemplateExpression || node.kind == ts.SyntaxKind.NoSubstitutionTemplateLiteral) { let raw = content.slice(node.pos, node.end); let newContent = processTmpl(raw, shortFrom); if (newContent != raw) { modifiers.push({ start: node.pos, end: node.end, content: newContent }); } } }; walk(ast); modifiers.sort((a, b) => { //根据start大小排序,这样修改后的fn才是正确的 return a.start - b.start; }); for (let i = modifiers.length - 1, m; i >= 0; i--) { m = modifiers[i]; content = content.substring(0, m.start) + m.content + content.substring(m.end); } fd.write(from, content); resolve(); } else { resolve(); } }); } };