cool-admin-vue/build/plugins/svg.ts

72 lines
1.7 KiB
TypeScript
Raw Normal View History

2021-03-30 18:23:08 +08:00
import { Plugin } from "vite";
import { readFileSync, readdirSync } from "fs";
let idPerfix = "";
const svgTitle = /<svg([^>+].*?)>/;
const clearHeightWidth = /(width|height)="([^>+].*?)"/g;
const hasViewBox = /(viewBox="[^>+].*?")/g;
const clearReturn = /(\r)|(\n)/g;
function findSvgFile(dir: string): string[] {
const svgRes = [];
const dirents = readdirSync(dir, {
2021-04-01 18:36:57 +08:00
withFileTypes: true
2021-03-30 18:23:08 +08:00
});
for (const dirent of dirents) {
if (dirent.isDirectory()) {
svgRes.push(...findSvgFile(dir + dirent.name + "/"));
} else {
const svg = readFileSync(dir + dirent.name)
.toString()
.replace(clearReturn, "")
2021-04-01 18:36:57 +08:00
.replace(svgTitle, (_: any, $2: any) => {
2021-03-30 18:23:08 +08:00
let width = 0;
let height = 0;
2021-04-01 18:36:57 +08:00
let content = $2.replace(clearHeightWidth, (_: any, s2: any, s3: any) => {
2021-03-30 18:23:08 +08:00
if (s2 === "width") {
width = s3;
} else if (s2 === "height") {
height = s3;
}
return "";
});
if (!hasViewBox.test($2)) {
content += `viewBox="0 0 ${width} ${height}"`;
}
return `<symbol id="${idPerfix}-${dirent.name.replace(
".svg",
""
)}" ${content}>`;
})
.replace("</svg>", "</symbol>");
svgRes.push(svg);
}
}
return svgRes;
}
2021-04-01 18:36:57 +08:00
export const svgBuilder = (path: string, perfix = "icon"): Plugin | null => {
2021-03-30 18:23:08 +08:00
if (path !== "") {
idPerfix = perfix;
const res = findSvgFile(path);
return {
name: "svg-transform",
transformIndexHtml(html): string {
return html.replace(
"<body>",
`
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">
${res.join("")}
</svg>
`
);
2021-04-01 18:36:57 +08:00
}
2021-03-30 18:23:08 +08:00
};
2021-04-01 18:36:57 +08:00
} else {
return null;
2021-03-30 18:23:08 +08:00
}
};