wx-compiler/node/test/wcc/lla/raw-parse.js
2023-06-07 20:23:39 +08:00

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)