119 lines
4.0 KiB
JavaScript
119 lines
4.0 KiB
JavaScript
import fs from 'fs';
|
||
import path from 'path';
|
||
import { Lexer } from './lexer.mjs'; // 引入 Lexer 类
|
||
|
||
// 递归遍历项目目录
|
||
function findXSchemaDirectory(directoryPath) {
|
||
fs.readdir(directoryPath, (err, files) => {
|
||
if (err) {
|
||
console.error('无法读取目录:', err);
|
||
return;
|
||
}
|
||
|
||
// 遍历目录中的所有文件和文件夹
|
||
files.forEach(file => {
|
||
const filePath = path.join(directoryPath, file);
|
||
|
||
fs.stat(filePath, (err, stats) => {
|
||
if (err) {
|
||
console.error('无法获取文件状态:', err);
|
||
return;
|
||
}
|
||
|
||
if (stats.isDirectory()) {
|
||
// 如果是文件夹,检查是否为 xschema 文件夹
|
||
if (file === 'xschema') {
|
||
// 找到 xschema 文件夹,继续查找其中的 .xschema.tsx 文件
|
||
findXSchemaFiles(filePath);
|
||
} else {
|
||
// 如果是其他文件夹,递归调用
|
||
findXSchemaDirectory(filePath);
|
||
}
|
||
}
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
// 查找 xschema 文件夹中的 .xschema.tsx 文件
|
||
function findXSchemaFiles(directoryPath) {
|
||
fs.readdir(directoryPath, (err, files) => {
|
||
if (err) {
|
||
console.error('无法读取目录:', err);
|
||
return;
|
||
}
|
||
|
||
files.forEach(file => {
|
||
const filePath = path.join(directoryPath, file);
|
||
|
||
// 如果是 .xschema.tsx 文件,进行处理
|
||
if (file.endsWith('.xschema.tsx')) {
|
||
processFile(filePath);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
|
||
// 处理找到的 .xschema.tsx 文件
|
||
function processFile(filePath) {
|
||
console.log('找到文件:', filePath);
|
||
|
||
// 读取文件内容
|
||
fs.readFile(filePath, 'utf8', (err, data) => {
|
||
if (err) {
|
||
console.error('无法读取文件:', err);
|
||
return;
|
||
}
|
||
|
||
// 在这里创建一个 Lexer 实例并进行词法分析
|
||
const lexer = new Lexer(data); // 创建 Lexer 实例
|
||
const tokens = lexer.lex(); // 获取 tokens
|
||
|
||
// 打印出解析得到的 tokens,或者根据需要进行进一步处理
|
||
console.log('生成的 Tokens:', tokens);
|
||
// 进行编译
|
||
const compiledData = compileFile(data, tokens);
|
||
|
||
// 输出编译后的数据并保存为 .tsx 文件(去除 xschema 部分)
|
||
const outputFilePath = filePath.replace('.xschema.tsx', '.schema.ts'); // 输出文件名去除 xschema 部分,保留 .tsx 后缀
|
||
fs.writeFile(outputFilePath, compiledData, 'utf8', (err) => {
|
||
if (err) {
|
||
console.error('无法写入 TSX 文件:', err);
|
||
} else {
|
||
console.log('编译后的文件已保存:', outputFilePath);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
function compileFile(fileContent, tokens) {
|
||
let compiledCode = '';
|
||
|
||
tokens.forEach(token => {
|
||
if (token === 'startTag') {
|
||
// 输出 'startTag' 标记
|
||
compiledCode += `Start Tag: ${tokens[1]} \n`;
|
||
|
||
// 输出属性
|
||
tokens[2].forEach(attr => {
|
||
const key = Object.keys(attr)[0]; // 获取属性名
|
||
const value = attr[key]; // 获取属性值
|
||
compiledCode += ` Attribute: ${key}="${value}" \n`;
|
||
});
|
||
}
|
||
else if (token === 'endTag') {
|
||
// 输出 'endTag' 标记(如果有的话)
|
||
compiledCode += `End Tag: ${tokens[1]} \n`;
|
||
}
|
||
else if (token === 'text') {
|
||
// 输出文本内容
|
||
compiledCode += `Text: ${tokens[1]} \n`;
|
||
}
|
||
});
|
||
|
||
return compiledCode; // 返回生成的简单 token 输出
|
||
}
|
||
|
||
// 启动程序并从根目录开始查找 xschema 文件夹
|
||
const projectRootDirectory = './'; // 设置项目根目录,通常为当前目录
|
||
findXSchemaDirectory(projectRootDirectory);
|