@alanchenchen/cbml-processor
Version:
基于cbml parser和cbml规范实现的构建工具
94 lines (93 loc) • 3.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateCode = void 0;
const constant_1 = require("./constant");
/**
* 基于CBML-AST的CBMLNodeList递归生成code block string
*
* @param CBMLNodeList
* @param codeBlockList
* @todo 需要优化成尾递归
*/
const generateCodeRecursivly = (CBMLNodeList, codeBlockList) => {
try {
for (const CBMLChildNode of CBMLNodeList) {
const { type, attributes, tag, body, language, content } = CBMLChildNode;
if (type === 'TextNode') {
codeBlockList.push(content.trim());
}
else {
let commentLeftCode = '';
let commentRightCode = '';
const attrCode = Object.entries(attributes).reduce((total, item) => {
const key = item[0];
const val = item[1];
return total += ` ${key}=${val.quoted}${val.value}${val.quoted}`;
}, '');
switch (type) {
case 'BlockElement':
commentLeftCode =
(0, constant_1.languageCommentLocFlag)(language).start +
`<${tag}` +
attrCode +
'>' +
(0, constant_1.languageCommentLocFlag)(language).end;
commentRightCode =
(0, constant_1.languageCommentLocFlag)(language).start +
`</${tag}>` +
(0, constant_1.languageCommentLocFlag)(language).end;
break;
case 'CommentElement':
commentLeftCode =
(0, constant_1.languageCommentLocFlag)(language).start +
`<${tag}` +
attrCode +
'>';
commentRightCode =
`</${tag}>` +
(0, constant_1.languageCommentLocFlag)(language).end;
break;
case 'VoidElement':
commentLeftCode =
(0, constant_1.languageCommentLocFlag)(language).start +
`<${tag}` +
attrCode +
` />` +
(0, constant_1.languageCommentLocFlag)(language).end;
commentRightCode = undefined;
break;
}
codeBlockList.push(commentLeftCode);
// 如果存在body,则递归补充到数组
if (Array.isArray(body)) {
generateCodeRecursivly(body, codeBlockList);
}
// 如果需要右侧闭合代码,则push,VoidElement不需要,因为自闭合
if (commentRightCode !== undefined) {
codeBlockList.push(commentRightCode);
}
}
}
}
catch (error) {
throw new Error(error);
}
};
/**
* 基于CBML的AST tree,生成code string
*
* @param CBMLRootNode
* @returns
*/
const generateCode = (CBMLRootNode) => {
try {
const genCodeList = [];
generateCodeRecursivly(CBMLRootNode.body, genCodeList);
return genCodeList.join('\r\n');
}
catch (error) {
console.log('generate code errors: ', error);
throw new Error(error);
}
};
exports.generateCode = generateCode;