via-icons/scripts/generateIcons.js

113 lines
3.0 KiB
JavaScript
Raw Normal View History

2024-07-28 22:55:15 -06:00
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
function toPascalCase(str) {
return str.replace(/(^\w|-\w)/g, (match) =>
match.replace(/-/, "").toUpperCase()
);
2024-07-28 22:55:15 -06:00
}
function parseAttributes(attributeString) {
const attributes = {};
2024-08-07 21:53:10 -06:00
attributeString.replace(/(\w+)=["']([^"']*)["']/g, (match, name, value) => {
const newName = name.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
if (newName !== "xmlns" && newName !== "hidden" && newName !== "slot") {
attributes[newName] = value;
}
return match;
});
return attributes;
}
function parseSvgContent(svgContent) {
const svgMatch = svgContent.match(/<svg\s+([^>]+)>([\s\S]*?)<\/svg>/);
if (!svgMatch) return null;
const [_, svgAttributes, svgInner] = svgMatch;
const svgData = {
tag: "svg",
attr: parseAttributes(svgAttributes),
child: parseChildren(svgInner),
};
return svgData;
}
function parseChildren(innerContent) {
const children = [];
innerContent.replace(
/<(\w+)\s+([^>]+)>([\s\S]*?)<\/\1>/g,
(match, tag, attributes, inner) => {
const child = {
tag,
attr: parseAttributes(attributes),
child: parseChildren(inner),
};
children.push(child);
return match;
}
);
innerContent.replace(/<(\w+)\s+([^>]+)\/>/g, (match, tag, attributes) => {
const child = {
tag,
attr: parseAttributes(attributes),
child: [],
};
children.push(child);
return match;
});
return children;
}
2024-07-28 22:55:15 -06:00
function generateIconComponents(prefix, folderPath, outputPath) {
const files = fs.readdirSync(folderPath);
let outputContent = `// THIS FILE IS AUTO GENERATED\nimport { GenIcon, IconBaseProps } from '../lib';\n\n`;
files.forEach((file) => {
if (path.extname(file) === ".svg") {
const iconName = path.basename(file, ".svg");
const svgContent = fs.readFileSync(path.join(folderPath, file), "utf8");
const svgData = parseSvgContent(svgContent);
if (svgData) {
const componentName = `${prefix}${toPascalCase(iconName)}`;
outputContent += `export const ${componentName} = (props: IconBaseProps) => GenIcon(${JSON.stringify(
svgData
)})(props);\n\n`;
}
2024-07-28 22:55:15 -06:00
}
});
2024-07-28 22:55:15 -06:00
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
fs.writeFileSync(outputPath, outputContent);
}
generateIconComponents(
"Fa",
path.join(__dirname, "..", "src", "svgs", "fa"),
path.join(__dirname, "..", "src", "fa", "index.ts")
);
generateIconComponents(
"Fc",
path.join(__dirname, "..", "src", "svgs", "fc"),
path.join(__dirname, "..", "src", "fc", "index.ts")
);
generateIconComponents(
"Rx",
path.join(__dirname, "..", "src", "svgs", "rx"),
path.join(__dirname, "..", "src", "rx", "index.ts")
);
generateIconComponents(
"Tfi",
path.join(__dirname, "..", "src", "svgs", "tfi"),
path.join(__dirname, "..", "src", "tfi", "index.ts")
);