feat: reorganize builder
This commit is contained in:
parent
ff7bb041ef
commit
362b7aa15e
18 changed files with 1094 additions and 310 deletions
78
lib/generators/LinkElementGenerator.js
Normal file
78
lib/generators/LinkElementGenerator.js
Normal file
|
@ -0,0 +1,78 @@
|
|||
const LinkProcessor = require("../utils/LinkProcessor");
|
||||
|
||||
/**
|
||||
* Generates HTML for link elements.
|
||||
*/
|
||||
class LinkElementGenerator {
|
||||
/**
|
||||
* Creates a new link element generator.
|
||||
* @param {Object} options - Options for the generator
|
||||
* @param {CSSGenerator} cssGenerator - CSS generator instance
|
||||
* @param {Object} parentGenerator - Parent HTML generator for recursion
|
||||
*/
|
||||
constructor(options, cssGenerator, parentGenerator) {
|
||||
this.options = options;
|
||||
this.cssGenerator = cssGenerator;
|
||||
this.parentGenerator = parentGenerator;
|
||||
this.linkProcessor = new LinkProcessor(options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if this generator can handle the given node.
|
||||
* @param {Object} node - The node to check
|
||||
* @returns {boolean} - True if this generator can handle the node
|
||||
*/
|
||||
canHandle(node) {
|
||||
return node.type === "element" && node.tag === "link";
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates HTML for a link element.
|
||||
* @param {Object} node - The node to generate HTML for
|
||||
* @returns {string} - The generated HTML
|
||||
*/
|
||||
generate(node) {
|
||||
if (this.options.debug) {
|
||||
console.log(`\n[LinkElementGenerator] Processing link`);
|
||||
}
|
||||
|
||||
if (
|
||||
node.children.length === 1 &&
|
||||
(node.children[0].tag === "button" || node.children[0].tag?.startsWith("button-"))
|
||||
) {
|
||||
if (this.options.debug) {
|
||||
console.log("[LinkElementGenerator] Processing button inside link - using button's HTML");
|
||||
}
|
||||
node.children[0].parent = node;
|
||||
return this.parentGenerator.generateHTML(node.children[0]);
|
||||
}
|
||||
|
||||
const className = this.cssGenerator.generateClassName(node.tag);
|
||||
const { cssProps, nestedRules } = this.cssGenerator.nodeToCSSProperties(node);
|
||||
|
||||
this.cssGenerator.cssRules.set(`.${className}`, {
|
||||
cssProps,
|
||||
nestedRules,
|
||||
});
|
||||
|
||||
const linkInfo = this.linkProcessor.processLink(node);
|
||||
const attributes = this.linkProcessor.getLinkAttributes(linkInfo);
|
||||
|
||||
let html = `<a class="${className}"${attributes}>${
|
||||
this.options.minified ? "" : "\n"
|
||||
}`;
|
||||
|
||||
node.children.forEach((child) => {
|
||||
child.parent = node;
|
||||
html += this.parentGenerator.generateHTML(child);
|
||||
});
|
||||
|
||||
html += `${this.options.minified ? "" : "\n"}</a>${
|
||||
this.options.minified ? "" : "\n"
|
||||
}`;
|
||||
|
||||
return html;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = LinkElementGenerator;
|
Loading…
Add table
Add a link
Reference in a new issue