UNPKG

rollup-plugin-dk

Version:

Seamless migration from es5 to es6 for `dk-fe` project

77 lines (73 loc) 3.36 kB
/* eslint-disable */ export default function (tmpl) { function unescape(code) { return code.replace(/\\('|\\)/g, "$1").replace(/[\r\t\n]/g, " "); } var c = { func : /{{#\s*([\w$]+)\s*(\([^)]*\)|)\s*}}([\s\S]*?){{#}}/g, evaluate: /\{\{([\s\S]+?(\}?)+)\}\}/g, interpolate: /\{\{=([\s\S]+?)\}\}/g, conditional: /\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, transclude: /\{\{\-(\-)?\s*([\s\S]*?)\s*\}\}/g, iterate: /\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g, }; var cse = { start: "'+(", end: ")+'" }, sid = 0, indv; // 只替换{{#func()}}{{#}}里面的内容 tmpl = tmpl.replace(c.func, function(m, def, args, str) { // 转译特殊字符,在html拼接的时候出现语法错误 str = str.replace(/('|\\)/g, '\\$1') // 干掉所有空白符, 通过连字符解决,保持文件格式 //str = str.replace(/(^|\r|\n)\t* +| +\t*(\r|\n|$)/g,"") //.replace(/\r|\n|\t/g,"") // 拼接方法名 str = "function " + def + (args || "()") + " {var out='" + str; // 替换各种标志符 str = str .replace(c.interpolate, function(m, code) { return cse.start + unescape(code) + cse.end; }) .replace(c.conditional, function(m, elsecase, code) { return elsecase ? (code ? "';}else if(" + unescape(code) + ") {out+='" : "';}else {out+='") : (code ? "';if(" + unescape(code) + ") {out+='" : "';}out+='"); }) .replace(c.transclude, function(m, elsecase, code) { function formatCode() { if (!/\)$/.test(code)) { // {{-page}}, 无argsBody code = code + '('; } else if (/\(\s*\)$/.test(code)) { // {{-bem(page)()}}, 有body, 但是最后一个是空括号 code = code.substr(0, code.length - 1); } else { // {{-bem(page)(1)}}, 有body, 也有内容 code = code.substr(0, code.length - 1) + ','; } return code; } return elsecase ? "';return out;})(), (function() {var out='';out+='": (code ? "';out+=" + unescape(formatCode()) + "(function() {var out=''; out+='" : "';return out;})());out+='"); }) .replace(c.iterate, function(m, iterate, vname, iname) { if (!iterate) return "';} } out+='"; sid+=1; indv=iname || "i"+sid; iterate=unescape(iterate); return "';var arr"+sid+"="+iterate+";if(arr"+sid+") {var "+vname+","+indv+"=-1,l"+sid+"=arr"+sid+".length-1;while("+indv+"<l"+sid+") {" +vname+"=arr"+sid+"["+indv+"+=1];out+='"; }) .replace(c.evaluate, function(m, code) { // 因为此处是js, 所以需要将特殊字符转回来 return "';" + unescape(code) + "out+='"; }) .replace(/(\s|;|\}|^|\{)out\+='';/g, "$1").replace(/\+''/g, ""); // 拼接方法结尾 str = str + "';return out;}"; // 把所有字符串链接起来, 并且保持行数不变 str = str.replace(/(\r|\n|\r\n)/g, '\\\n'); return str; }); return tmpl; }