Skip to content

Commit 078a86d

Browse files
committed
convert xml generation to use generator
1 parent df17ffd commit 078a86d

File tree

2 files changed

+79
-38
lines changed

2 files changed

+79
-38
lines changed

internal/svg/render.ts

Lines changed: 76 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {loopAccess} from "./util";
22
import {Point, interpolate} from "./point";
3+
import {Xml} from "../xml";
34

45
export interface RenderOptions {
56
// Viewport size.
@@ -65,17 +66,50 @@ export const render = (p: Point[], opt: RenderOptions): string => {
6566
path += `C${hands.x1},${hands.y1},${hands.x2},${hands.y2},${point.x},${point.y}`;
6667
}
6768

69+
const stroke = opt.stroke || (opt.guides ? "black" : "none");
70+
const strokeWidth = opt.strokeWidth || (opt.guides ? 1 : 0);
71+
72+
const xmlRoot = new Xml("svg", {
73+
width: opt.width,
74+
height: opt.height,
75+
viewBox: `0 0 ${opt.width} ${opt.height}`,
76+
xmlns: "http://www.w3.org/2000/svg",
77+
});
78+
79+
const xmlContent = new Xml("g", {
80+
transform: opt.transform || "",
81+
});
82+
83+
xmlRoot.children.push(xmlContent);
84+
85+
xmlContent.children.push(
86+
new Xml("path", {
87+
stroke,
88+
"stroke-width": strokeWidth,
89+
fill: opt.fill || "none",
90+
d: path,
91+
}),
92+
);
93+
6894
// Render guides if configured to do so.
69-
let guides = "";
7095
if (opt.guides) {
7196
const color = opt.stroke || "black";
7297
const size = opt.strokeWidth || 1;
7398

7499
// Bounding box.
75100
if (opt.boundingBox) {
76-
guides += `
77-
<rect x="0" y="0" width="${opt.width}" height="${opt.height}" fill="none"
78-
stroke="${color}" stroke-width="${2 * size}" stroke-dasharray="${2 * size}" />`;
101+
xmlContent.children.push(
102+
new Xml("rect", {
103+
x: 0,
104+
y: 0,
105+
width: opt.width,
106+
height: opt.height,
107+
fill: "none",
108+
stroke: color,
109+
"stroke-width": 2 * size,
110+
"stroke-dasharray": 2 * size,
111+
}),
112+
);
79113
}
80114

81115
// Points and handles.
@@ -84,38 +118,45 @@ export const render = (p: Point[], opt: RenderOptions): string => {
84118
const hands = loopAccess(handles)(i);
85119
const nextPoint = loopAccess(points)(i + 1);
86120

87-
guides += `
88-
<line x1="${x}" y1="${y}" x2="${hands.x1}" y2="${hands.y1}"
89-
stroke-width="${size}" stroke="${color}" />
90-
<line x1="${nextPoint.x}" y1="${nextPoint.y}" x2="${hands.x2}" y2="${hands.y2}"
91-
stroke-width="${size}" stroke="${color}" stroke-dasharray="${2 * size}" />
92-
<circle cx="${hands.x1}" cy="${hands.y1}" r="${size}"
93-
fill="${color}" />
94-
<circle cx="${hands.x2}" cy="${hands.y2}" r="${size}"
95-
fill="${color}" />
96-
<circle cx="${x}" cy="${y}" r="${2 * size}" fill="${color}" />`;
121+
xmlContent.children.push(
122+
new Xml("line", {
123+
x1: x,
124+
y1: y,
125+
x2: hands.x1,
126+
y2: hands.y1,
127+
"stroke-width": size,
128+
stroke: color,
129+
}),
130+
new Xml("line", {
131+
x1: nextPoint.x,
132+
y1: nextPoint.y,
133+
x2: hands.x2,
134+
y2: hands.y2,
135+
"stroke-width": size,
136+
stroke: color,
137+
"stroke-dasharray": 2 * size,
138+
}),
139+
new Xml("circle", {
140+
cx: hands.x1,
141+
cy: hands.y1,
142+
r: size,
143+
fill: color,
144+
}),
145+
new Xml("circle", {
146+
cx: hands.x2,
147+
cy: hands.y2,
148+
r: size,
149+
fill: color,
150+
}),
151+
new Xml("circle", {
152+
cx: x,
153+
cy: y,
154+
r: 2 * size,
155+
fill: color,
156+
}),
157+
);
97158
}
98159
}
99160

100-
const stroke = opt.stroke || (opt.guides ? "black" : "none");
101-
const strokeWidth = opt.strokeWidth || (opt.guides ? 1 : 0);
102-
103-
return `
104-
<svg
105-
width="${opt.width}"
106-
height="${opt.height}"
107-
viewBox="0 0 ${opt.width} ${opt.height}"
108-
xmlns="http://www.w3.org/2000/svg"
109-
>
110-
<g transform="${opt.transform || ""}">
111-
<path
112-
stroke="${stroke}"
113-
stroke-width="${strokeWidth}"
114-
fill="${opt.fill || "none"}"
115-
d="${path}"
116-
/>
117-
${guides}
118-
</g>
119-
</svg>
120-
`.replace(/\s+/g, " ");
161+
return xmlRoot.render();
121162
};

0 commit comments

Comments
 (0)