UNPKG

magix-combine

Version:

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

108 lines (102 loc) 4.81 kB
let configs = require('./util-config'); let escapeSlashRegExp = /\\|'/g; let escapeBreakReturnRegExp = /\r|\n/g; let mathcer = /<%([@=!])?([\s\S]*?)%>|$/g; let viewIdReg = /\x1f/g; let closeReg = /\);?\s*$/; let extraPlusReg = /\$p\+='';/g; let extraStringReg = /\$p\+=''\+/g; module.exports = (tmpl, file, globalVars) => { // Compile the template source, escaping string literals appropriately. let index = 0; let source = `$p+='`; let hasAtRule = false; tmpl.replace(mathcer, (match, operate, content, offset) => { source += tmpl.substring(index, offset).replace(escapeSlashRegExp, `\\$&`).replace(escapeBreakReturnRegExp, `\\n`); index = offset + match.length; if (configs.debug) { let expr = tmpl.substring(index - match.length + 2 + (operate ? 1 : 0), index - 2); let artReg = /^'(\d+)\x11([^\x11]+)\x11'$/; let artM = expr.match(artReg); let art = ''; let line = -1; if (artM) { expr = expr.replace(artReg, ''); art = artM[2]; line = artM[1]; } else { expr = expr.replace(escapeSlashRegExp, `\\$&`).replace(escapeBreakReturnRegExp, `\\n`); } if (operate == `@`) { hasAtRule = true; source += `'+($expr='<%${operate + expr}%>',$i($$ref,${content}))+'`; } else if (operate == `=`) { source += `'+($expr='<%${operate + expr}%>',$e(${content}))+'`; } else if (operate == `!`) { if (!content.startsWith('$eu(') || !content.endsWith(')')) { content = `$n(${content})`; } source += `'+($expr='<%${operate + expr}%>',${content})+'`; } else if (content) { if (line > -1) { source += `';$line=${line};$art='${art}';`; content = ''; } else { source += `';`; } if (source.endsWith(`+'';`)) { source = source.substring(0, source.length - 4) + ';'; } if (expr) { source += `$expr='<%` + expr + `%>';`; } source += content + `;$p+='`; } } else { if (operate == `@`) { hasAtRule = true; source += `'+$i($$ref,${content})+'`; } else if (operate == `=`) { source += `'+$e(${content})+'`; } else if (operate == `!`) { if (!content.startsWith('$eu(') || !content.endsWith(')')) { content = `$n(${content})`; } source += `'+${content}+'`; } else if (content) { source += `';`; if (source.endsWith(`+'';`)) { source = source.substring(0, source.length - 4) + ';'; } source += `${content};$p+='`; } } // Adobe VMs need the match returned to produce the correct offset. return match; }); source += `';`; source = source.replace(extraPlusReg, '') .replace(extraStringReg, '$p+='); if (configs.debug) { source = `let $expr,$art,$line;try{${source}}catch(ex){let msg='render view error:'+(ex.message||ex);if($art)msg+='\\r\\n\\tsrc art:{{'+$art+'}}\\r\\n\\tat line:'+$line;msg+='\\r\\n\\t'+($art?'translate to:':'expr:');msg+=$expr+'\\r\\n\\tat file:${file}';throw msg;}`; } source = source.replace(viewIdReg, `'+$viewId+'`); let atRule = hasAtRule ? `if(!$i){$i=(ref,v,k,f)=>{for(f=ref[$g];--f;)if(ref[k=$g+f]===v)return k;ref[k=$g+ref[$g]++]=v;return k;}}` : ''; let encode = `if(!$n){let $em={'&':'amp','<':'lt','>':'gt','"':'#34','\\'':'#39','\`':'#96'},$er=/[&<>"'\`]/g,$ef=m=>\`&\${$em[m]};\`;$n=v=>''+(v==null?'':v);$e=v=>$n(v).replace($er,$ef)}`; let encodeURIMore = `if(!$eu){let $um={'!':'%21','\\'':'%27','(':'%28',')':'%29','*':'%2A'},$uf=m=>$um[m],$uq=/[!')(*]/g;$eu=v=>encodeURIComponent($n(v)).replace($uq,$uf)}`; let encodeQuote = `if(!$eq){let $qr=/[\\\\'\"]/g;$eq=v=>$n(v).replace($qr,'\\\\$&')}`; let vars = ''; for (let key of globalVars) { vars += `,${key}=$$.${key}`; } let fns = ''; if (configs.magixTmplFnInside) { fns = `if(!$$ref)$$ref=$$;${encode}${encodeURIMore}${encodeQuote}${atRule};`; } source = `${fns}let $g='\x1e',$_temp,$p=''${vars};${source}return $p`; source = configs.compileTmplCommand(`($$,$viewId,$$ref,$e,$n,$eu,$i,$eq)=>{${source}}`, configs); if (source.startsWith('(function')) { source = source.substring(1).replace(closeReg, ''); } return source; };