ovsjs
Version:
A technology similar to JSX, but unlike JSX which still uses XML syntax, OVS uses OOP syntax similar to Flutter and SwiftUI to develop UI.
46 lines • 1.47 kB
JavaScript
// Vite 插件
import { createFilter } from "vite";
import SubhutiLexer from "subhuti/SubhutiLexer.js";
import { es6Tokens } from "subhuti/syntax/es6/Es6Tokens.js";
import OvsMappingParser from "./ovs/OvsMapping.js";
import OvsParser from "./ovs/OvsParser.js";
function traverseClearTokens(currentNode) {
if (!currentNode || !currentNode.children || !currentNode.children.length)
return;
// 将当前节点添加到 Map 中
// 递归遍历子节点
if (currentNode.children && currentNode.children.length > 0) {
currentNode.children.forEach(child => traverseClearTokens(child));
}
currentNode.tokens = undefined;
return currentNode;
}
export function vitePluginOvsTransform(code) {
const lexer = new SubhutiLexer(es6Tokens);
const tokens = lexer.lexer(code);
const parser = new OvsParser(tokens);
let res = parser.Program();
let code1 = parser.exec();
const mapping = new OvsMappingParser();
mapping.openMappingMode(res);
code1 = mapping.exec(res);
return `
import { h } from "vue";\n
${code1}
`;
}
export default function vitePluginOvs() {
const filter = createFilter(/\.ovs$/, null);
// @ts-ignore
return {
enforce: 'pre',
transform(code, id) {
if (!filter(id)) {
return;
}
code = vitePluginOvsTransform(code);
return code;
}
};
}
//# sourceMappingURL=index.js.map