UNPKG

magix-combine

Version:

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

88 lines 3.75 kB
/* 处理class名称,前面我们把css文件处理完后,再自动处理掉模板文件中的class属性中的名称,不需要开发者界入处理 */ let configs = require('./util-config'); let checker = require('./checker'); let deps = require('./util-deps'); let classRef = require('./tmpl-attr-classref'); let classReg = /\bclass\s*=\s*"([^"]+)"/g; let classNameReg = /(\s|^|\u0007)([\w\-]+)(?=\s|$|\u0007)/g; let pureTagReg = /<([^>\s\/]+)([^>]*)>/g; let numReg = /^\d+$/; let tmplCommandAnchorReg = /\u0007\d+\u0007/g; let tmplCmdReg = /<%([=!@])?([\s\S]+?)%>/; let stringReg = /\u0017([^\u0017]*?)\u0017/g; let attrReg = /([\w\-:]+)(?:=(["'])[\s\S]*?\2)?/g; module.exports = { process(tmpl, cssNamesMap, refTmplCommands, e) { let tempCache = Object.create(null); let tagsCache = Object.create(null); let classResult = (m, h, key, fromCmd) => { if (numReg.test(key)) return m; //纯数字的是模板命令,选择器不可能是纯数字 let r = cssNamesMap[key]; if (!tempCache[key]) { tempCache[key] = 1; if (r) { let files = e.cssNamesInFiles[key + '!r']; if (files) { checker.CSS.markUsed(files, key, e.from); files.forEach(f => { deps.addFileDepend(f, e.from, e.to); }); } else { throw new Error(`[MXC Error(tmpl-attr-class)] can not find class name "${key}" at file "${e.from}"`); } } else if (!fromCmd) { checker.CSS.markUndeclared(e.srcHTMLFile, key); } } return h + (r || key); }; let cmdProcessor = (m, key) => { if (key) { return key.replace(classNameReg, (m, h, key) => classResult(m, h, key, true)); } return key; }; let classProcessor = (m, c) => { tmplCommandAnchorReg.lastIndex = 0; if (tmplCommandAnchorReg.test(m)) { tmplCommandAnchorReg.lastIndex = 0; m.replace(tmplCommandAnchorReg, tm => { let cmd = refTmplCommands[tm]; if (cmd && tmplCmdReg.test(cmd)) { refTmplCommands[tm] = cmd.replace(stringReg, cmdProcessor); } }); } return 'class="' + c.replace(classNameReg, (m, h, key) => classResult(m, h, key, false)) + '"'; }; let pureProcessor = (match, tag, content) => { content.replace(attrReg, (m, name) => { let attr = '[' + name + ']'; if (!tagsCache[attr]) { tagsCache[attr] = 1; let files = e.cssTagsInFiles[attr]; if (files) { checker.CSS.markUsedTags(Object.keys(files), attr, e.from); } } }); if (!tagsCache[tag]) { tagsCache[tag] = 1; let files = e.cssTagsInFiles[tag]; if (files) { checker.CSS.markUsedTags(Object.keys(files), tag, e.from); } } match = configs.cssNamesProcessor(match, cssNamesMap); match = match.replace(classReg, classProcessor); //保证是class属性 return classRef(match, e, tempCache); }; if (cssNamesMap) { //为了保证安全,我们一层层进入 tmpl = tmpl.replace(pureTagReg, pureProcessor); //保证是标签 } return tmpl; } };