mirror of
https://github.com/wkulhanek/bonob.git
synced 2025-12-21 17:33:29 +01:00
Removed libxmljs2 (#219)
This commit is contained in:
51
src/icon.ts
51
src/icon.ts
@@ -1,4 +1,5 @@
|
||||
import libxmljs, { Element, Attribute } from "libxmljs2";
|
||||
import * as xpath from "xpath";
|
||||
import { DOMParser, Node } from '@xmldom/xmldom';
|
||||
import _ from "underscore";
|
||||
import fs from "fs";
|
||||
|
||||
@@ -13,11 +14,10 @@ import {
|
||||
isMay4,
|
||||
SystemClock,
|
||||
} from "./clock";
|
||||
import { xmlTidy } from "./utils";
|
||||
import path from "path";
|
||||
|
||||
const SVG_NS = {
|
||||
svg: "http://www.w3.org/2000/svg",
|
||||
};
|
||||
const SVG_NS = "http://www.w3.org/2000/svg";
|
||||
|
||||
class ViewBox {
|
||||
minX: number;
|
||||
@@ -117,38 +117,39 @@ export class SvgIcon implements Icon {
|
||||
});
|
||||
|
||||
public toString = () => {
|
||||
const xml = libxmljs.parseXmlString(this.svg, {
|
||||
noblanks: true,
|
||||
net: false,
|
||||
});
|
||||
const viewBoxAttr = xml.get("//svg:svg/@viewBox", SVG_NS) as Attribute;
|
||||
let viewBox = new ViewBox(viewBoxAttr.value());
|
||||
const doc = new DOMParser().parseFromString(this.svg, 'text/xml') as unknown as Document;
|
||||
const select = xpath.useNamespaces({ svg: SVG_NS });
|
||||
|
||||
const elements = (path: string) => (select(path, doc) as Element[])
|
||||
const element = (path: string) => elements(path)[0]!
|
||||
|
||||
let viewBox = new ViewBox(select("string(//svg:svg/@viewBox)", doc) as string);
|
||||
if (
|
||||
this.features.viewPortIncreasePercent &&
|
||||
this.features.viewPortIncreasePercent > 0
|
||||
) {
|
||||
viewBox = viewBox.increasePercent(this.features.viewPortIncreasePercent);
|
||||
viewBoxAttr.value(viewBox.toString());
|
||||
element("//svg:svg").setAttribute("viewBox", viewBox.toString());
|
||||
}
|
||||
if (this.features.backgroundColor) {
|
||||
(xml.get("//svg:svg/*[1]", SVG_NS) as Element).addPrevSibling(
|
||||
new Element(xml, "rect").attr({
|
||||
x: `${viewBox.minX}`,
|
||||
y: `${viewBox.minY}`,
|
||||
width: `${Math.abs(viewBox.minX) + viewBox.width}`,
|
||||
height: `${Math.abs(viewBox.minY) + viewBox.height}`,
|
||||
fill: this.features.backgroundColor,
|
||||
})
|
||||
);
|
||||
const rect = doc.createElementNS(SVG_NS, "rect");
|
||||
rect.setAttribute("x", `${viewBox.minX}`);
|
||||
rect.setAttribute("y", `${viewBox.minY}`);
|
||||
rect.setAttribute("width", `${Math.abs(viewBox.minX) + viewBox.width}`);
|
||||
rect.setAttribute("height", `${Math.abs(viewBox.minY) + viewBox.height}`);
|
||||
rect.setAttribute("fill", this.features.backgroundColor);
|
||||
|
||||
const svg = element("//svg:svg")
|
||||
svg.insertBefore(rect, svg.childNodes[0]!);
|
||||
}
|
||||
if (this.features.foregroundColor) {
|
||||
(xml.find("//svg:path", SVG_NS) as Element[]).forEach((path) => {
|
||||
if (path.attr("fill"))
|
||||
path.attr({ stroke: this.features.foregroundColor! });
|
||||
else path.attr({ fill: this.features.foregroundColor! });
|
||||
elements("//svg:path").forEach((path) => {
|
||||
if (path.getAttribute("fill")) path.setAttribute("stroke", this.features.foregroundColor!);
|
||||
else path.setAttribute("fill", this.features.foregroundColor!);
|
||||
});
|
||||
}
|
||||
return xml.toString();
|
||||
|
||||
return xmlTidy(doc as unknown as Node);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
29
src/utils.ts
29
src/utils.ts
@@ -1,7 +1,34 @@
|
||||
import { DOMParser, XMLSerializer, Node } from '@xmldom/xmldom';
|
||||
|
||||
export function takeWithRepeats<T>(things:T[], count: number) {
|
||||
const result = [];
|
||||
for(let i = 0; i < count; i++) {
|
||||
result.push(things[i % things.length])
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
function xmlRemoveWhitespaceNodes(node: Node) {
|
||||
let child = node.firstChild;
|
||||
while (child) {
|
||||
const nextSibling = child.nextSibling;
|
||||
if (child.nodeType === 3 && !child.nodeValue?.trim()) {
|
||||
// Remove empty text nodes
|
||||
node.removeChild(child);
|
||||
} else {
|
||||
// Recursively process child nodes
|
||||
xmlRemoveWhitespaceNodes(child);
|
||||
}
|
||||
child = nextSibling;
|
||||
}
|
||||
}
|
||||
|
||||
export function xmlTidy(xml: string | Node) {
|
||||
const xmlToString = new XMLSerializer().serializeToString
|
||||
|
||||
const xmlString = xml instanceof Node ? xmlToString(xml as any) : xml
|
||||
const doc = new DOMParser().parseFromString(xmlString, 'text/xml') as unknown as Node;
|
||||
xmlRemoveWhitespaceNodes(doc);
|
||||
return xmlToString(doc as any);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user