mirror of
https://github.com/msojocs/wx-compiler.git
synced 2025-07-19 00:00:04 +08:00
84 lines
2.7 KiB
JavaScript
84 lines
2.7 KiB
JavaScript
|
|
const path = require("path");
|
|
const fs = require("fs");
|
|
const { spawn } = require("child_process");
|
|
|
|
const wxmlParser = (()=>{
|
|
const getFileArr = (code)=>{
|
|
// 获取x数组并解析
|
|
const indexArr = eval(code.match(/var x=(\[.*\]);/)[1]);
|
|
return indexArr;
|
|
}
|
|
const parseGZFuncMap = (code)=>{
|
|
const exp = `function gz\\$(.*?)\\(\\)\\{[\\s\\S]*?__WXML_GLOBAL__\\.ops_cached\\.\\$.*?\n}`;
|
|
const gzs = code.matchAll(new RegExp(exp, 'g'));
|
|
const gzFunc = {}
|
|
for (const gz of gzs) {
|
|
gzFunc[`gz$${gz[1]}`] = gz[0];
|
|
}
|
|
return gzFunc;
|
|
}
|
|
const parseDepsMap = (code, fileArr)=>{
|
|
|
|
// 获取所有依赖 _ai函数 被引入的文件, 文件
|
|
// _ai(i, depPath, e, mainPath, r, c)
|
|
const deps = code.matchAll(
|
|
/_ai\(.*?,x\[(\d+)\],.*?,x\[(\d+)\],\d+,\d+\)/g
|
|
);
|
|
// 处理依赖
|
|
const depsResult = {}
|
|
for (let dep of deps) {
|
|
const file = fileArr[dep[2]]
|
|
let depFile = fileArr[dep[1]]
|
|
depFile = `./${path.join(path.dirname(file), depFile)}`
|
|
if(depsResult[file]){
|
|
depsResult[file].push(depFile)
|
|
}else{
|
|
depsResult[file] = [depFile]
|
|
}
|
|
}
|
|
return depsResult
|
|
}
|
|
const parseDMEMap = (code)=>{
|
|
// ti: import依赖引入
|
|
const regExp = /d_\[x\[(\d+)\]\]={}[\s\S]*?e_\[x\[\d+\]\]={f:m\d+,j:\[.*?\],i:\[.*?\],ti:\[(.*?)\],ic:\[.*?\]}/g;
|
|
const ms = code.matchAll(regExp);
|
|
const mFunc = {}
|
|
for (const m of ms) {
|
|
mFunc[`x[${m[1]}]`] = m[0]
|
|
}
|
|
return mFunc
|
|
}
|
|
const parseNvRequireCode = (code)=>{
|
|
const ret = code.match(/(__WXML_GLOBAL__\.ops_set\.\$.*?=[\s\S]*)var x=\[/)
|
|
return ret[1]
|
|
}
|
|
const parseCSCode = (code)=>{
|
|
const cs = code.match(/var cs([\s\S]*?)function gz/);
|
|
return cs[1];
|
|
}
|
|
const parse = (data, code)=>{
|
|
data.nv_require = parseNvRequireCode(code)
|
|
data.cs = parseCSCode(code)
|
|
data.gz = parseGZFuncMap(code)
|
|
data.fileArr = getFileArr(code);
|
|
data.deps = parseDepsMap(code, data.fileArr)
|
|
data.dme = parseDMEMap(code)
|
|
}
|
|
return {
|
|
parse
|
|
}
|
|
})()
|
|
|
|
const data = fs.readFileSync('/home/msojocs/Documents/Work/compiler/test/wcc/lla/miniprogram-demo/初次加载1/linux_output.js')
|
|
const code = data.toString();
|
|
|
|
const fileArr = wxmlParser.getFileArr(code)
|
|
// console.log(fileArr)
|
|
const gzFunc = wxmlParser.parseGZFuncMap(code)
|
|
// console.log(gzFunc)
|
|
const deps = wxmlParser.parseDepsMap(code, fileArr)
|
|
// console.log(deps)
|
|
const mFunc = wxmlParser.parseDMEMap(code)
|
|
const nvRequire = wxmlParser.parseNvRequireCode(code)
|
|
console.log(nvRequire) |