plotboilerplate 1.19.0 → 1.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +2 -1
  2. package/dist/index.esm.js +81 -27
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.esm.min.js +1 -1
  5. package/dist/index.esm.min.js.map +1 -1
  6. package/dist/plotboilerplate.browser.min.js +1 -1
  7. package/dist/plotboilerplate.browser.min.js.map +1 -1
  8. package/dist/plotboilerplate.js +81 -39
  9. package/dist/plotboilerplate.min.js +1 -1
  10. package/package.json +1 -1
  11. package/src/cjs/Bounds.d.ts +4 -5
  12. package/src/cjs/Bounds.js +6 -8
  13. package/src/cjs/Bounds.js.map +1 -1
  14. package/src/cjs/PlotBoilerplate.d.ts +2 -1
  15. package/src/cjs/PlotBoilerplate.js +9 -3
  16. package/src/cjs/PlotBoilerplate.js.map +1 -1
  17. package/src/cjs/VEllipseSector.d.ts +4 -3
  18. package/src/cjs/VEllipseSector.js +15 -8
  19. package/src/cjs/VEllipseSector.js.map +1 -1
  20. package/src/cjs/Vertex.d.ts +33 -1
  21. package/src/cjs/Vertex.js +43 -1
  22. package/src/cjs/Vertex.js.map +1 -1
  23. package/src/cjs/drawutilssvg.d.ts +2 -1
  24. package/src/cjs/drawutilssvg.js +7 -19
  25. package/src/cjs/drawutilssvg.js.map +1 -1
  26. package/src/cjs/entry.js +1 -0
  27. package/src/cjs/interfaces/core.d.ts +3 -0
  28. package/src/cjs/interfaces/core.js +1 -0
  29. package/src/cjs/interfaces/core.js.map +1 -1
  30. package/src/cjs/utils/algorithms/detectPaths.d.ts +3 -2
  31. package/src/cjs/utils/creategui.js +7 -0
  32. package/src/cjs/utils/datastructures/Color.d.ts +1 -1
  33. package/src/cjs/utils/datastructures/Color.js +4 -2
  34. package/src/cjs/utils/datastructures/Color.js.map +1 -1
  35. package/src/cjs/utils/io/FileDrop.d.ts +11 -1
  36. package/src/cjs/utils/io/FileDrop.js +41 -10
  37. package/src/cjs/utils/io/FileDrop.js.map +1 -1
  38. package/src/cjs/utils/parsers/svg/parseSVGPathData.d.ts +27 -0
  39. package/src/cjs/utils/parsers/svg/parseSVGPathData.js +486 -0
  40. package/src/cjs/utils/parsers/svg/parseSVGPathData.js.map +1 -0
  41. package/src/cjs/utils/parsers/svg/splitSVGPathData.d.ts +20 -0
  42. package/src/cjs/utils/parsers/svg/splitSVGPathData.js +53 -0
  43. package/src/cjs/utils/parsers/svg/splitSVGPathData.js.map +1 -0
  44. package/src/cjs/utils/parsers/svg/types.d.ts +63 -0
  45. package/src/cjs/utils/parsers/svg/types.js +17 -0
  46. package/src/cjs/utils/parsers/svg/types.js.map +1 -0
  47. package/src/esm/Bounds.d.ts +4 -5
  48. package/src/esm/Bounds.js +6 -8
  49. package/src/esm/Bounds.js.map +1 -1
  50. package/src/esm/PlotBoilerplate.d.ts +2 -1
  51. package/src/esm/PlotBoilerplate.js +10 -4
  52. package/src/esm/PlotBoilerplate.js.map +1 -1
  53. package/src/esm/VEllipseSector.d.ts +4 -3
  54. package/src/esm/VEllipseSector.js +15 -8
  55. package/src/esm/VEllipseSector.js.map +1 -1
  56. package/src/esm/Vertex.d.ts +33 -1
  57. package/src/esm/Vertex.js +43 -1
  58. package/src/esm/Vertex.js.map +1 -1
  59. package/src/esm/drawutilssvg.d.ts +2 -1
  60. package/src/esm/drawutilssvg.js +7 -19
  61. package/src/esm/drawutilssvg.js.map +1 -1
  62. package/src/esm/entry.js +1 -0
  63. package/src/esm/interfaces/core.d.ts +3 -0
  64. package/src/esm/interfaces/core.js +1 -0
  65. package/src/esm/interfaces/core.js.map +1 -1
  66. package/src/esm/utils/algorithms/detectPaths.d.ts +3 -2
  67. package/src/esm/utils/algorithms/detectPaths.js.map +1 -1
  68. package/src/esm/utils/datastructures/Color.d.ts +1 -1
  69. package/src/esm/utils/datastructures/Color.js +4 -2
  70. package/src/esm/utils/datastructures/Color.js.map +1 -1
  71. package/src/esm/utils/io/FileDrop.d.ts +11 -1
  72. package/src/esm/utils/io/FileDrop.js +41 -10
  73. package/src/esm/utils/io/FileDrop.js.map +1 -1
  74. package/src/esm/utils/parsers/svg/parseSVGPathData.d.ts +27 -0
  75. package/src/esm/utils/parsers/svg/parseSVGPathData.js +482 -0
  76. package/src/esm/utils/parsers/svg/parseSVGPathData.js.map +1 -0
  77. package/src/esm/utils/parsers/svg/splitSVGPathData.d.ts +20 -0
  78. package/src/esm/utils/parsers/svg/splitSVGPathData.js +49 -0
  79. package/src/esm/utils/parsers/svg/splitSVGPathData.js.map +1 -0
  80. package/src/esm/utils/parsers/svg/types.d.ts +63 -0
  81. package/src/esm/utils/parsers/svg/types.js +16 -0
  82. package/src/esm/utils/parsers/svg/types.js.map +1 -0
  83. package/src/ts/Bounds.ts +6 -8
  84. package/src/ts/PlotBoilerplate.ts +11 -4
  85. package/src/ts/VEllipseSector.ts +22 -15
  86. package/src/ts/Vertex.ts +46 -1
  87. package/src/ts/drawutilssvg.ts +8 -19
  88. package/src/ts/interfaces/core.ts +3 -0
  89. package/src/ts/utils/algorithms/detectPaths.ts +1 -1
  90. package/src/ts/utils/datastructures/Color.ts +8 -4
  91. package/src/ts/utils/io/FileDrop.ts +51 -10
  92. package/src/ts/utils/parsers/svg/parseSVGPathData.ts +631 -0
  93. package/src/ts/utils/parsers/svg/splitSVGPathData.ts +54 -0
  94. package/src/ts/utils/parsers/svg/types.ts +90 -0
@@ -0,0 +1,482 @@
1
+ /**
2
+ * Parse SVG path data strings and convert to PlotBoilerplate path objects.
3
+ *
4
+ * As this parser function does not detect all possible path data strings it should cover the most daily use-cases.
5
+ *
6
+ * For more insight see
7
+ * https://www.w3.org/TR/SVG/paths.html
8
+ *
9
+ * @author Ikaros Kappler
10
+ * @date 2022-11-06
11
+ * @modified 2022-12-21 (winter solstice) Porting this to Typescript.
12
+ * @modified 2023-01-17 Handling multiple parameter sets now.
13
+ * @version 0.0.2-alpha
14
+ **/
15
+ import { CubicBezierCurve } from "../../../CubicBezierCurve";
16
+ import { Line } from "../../../Line";
17
+ import { VEllipseSector } from "../../../VEllipseSector";
18
+ import { Vertex } from "../../../Vertex";
19
+ import { splitSVGPathData } from "./splitSVGPathData";
20
+ const DEG_TO_RAD = Math.PI / 180;
21
+ /**
22
+ * Transform the given path data (translate and scale. rotating is not intended here).
23
+ *
24
+ * @date 2022-11-06
25
+ *
26
+ * @name parseSVGPathData
27
+ * @static
28
+ * @param {string} data - The data to parse.
29
+ * @return An array of straight line segments (Line) or curve segments (CubicBezierCurve) representing the path.
30
+ */
31
+ export const parseSVGPathData = (dataString) => {
32
+ const dataElements = splitSVGPathData(dataString);
33
+ if (!dataElements) {
34
+ return null;
35
+ }
36
+ // Array<PathSegments>
37
+ const result = [];
38
+ var i = 0;
39
+ const firstPoint = { x: NaN, y: NaN };
40
+ const lastPoint = { x: NaN, y: NaN };
41
+ const lastControlPoint = { x: NaN, y: NaN };
42
+ const lastQuadraticControlPoint = { x: NaN, y: NaN };
43
+ while (i < dataElements.length) {
44
+ // Could this also be SVGPathShorthandQuadraticCurveToCommand?
45
+ const data = dataElements[i];
46
+ const cmd = data[0];
47
+ // console.log("cmd", cmd, "data", data);
48
+ switch (data[0]) {
49
+ case "M":
50
+ // MoveTo: M|m x y
51
+ _handleMove(data, false, firstPoint, lastPoint, lastControlPoint, result);
52
+ break;
53
+ case "m":
54
+ // MoveTo: M|m x y
55
+ _handleMove(data, true, firstPoint, lastPoint, lastControlPoint, result);
56
+ break;
57
+ case "L":
58
+ // LineTo L|l x y
59
+ _handleLineTo(data, false, firstPoint, lastPoint, lastControlPoint, result);
60
+ break;
61
+ case "l":
62
+ // LineTo L|l x y
63
+ _handleLineTo(data, true, firstPoint, lastPoint, lastControlPoint, result);
64
+ break;
65
+ case "H":
66
+ // HorizontalLineTo: H|h x
67
+ _handleHorizontalLineTo(data, false, firstPoint, lastPoint, lastControlPoint, result);
68
+ break;
69
+ case "h":
70
+ // HorizontalLineTo: H|h x
71
+ _handleHorizontalLineTo(data, true, firstPoint, lastPoint, lastControlPoint, result);
72
+ break;
73
+ case "V":
74
+ // VerticalLineTo: V|v y
75
+ _handleVerticalLineTo(data, false, firstPoint, lastPoint, lastControlPoint, result);
76
+ break;
77
+ case "v":
78
+ // VerticalLineTo: V|v y
79
+ _handleVerticalLineTo(data, true, firstPoint, lastPoint, lastControlPoint, result);
80
+ break;
81
+ case "C":
82
+ // CurveTo: C|c x1 y1 x2 y2 x y
83
+ _handleCubicBezierTo(data, false, firstPoint, lastPoint, lastControlPoint, result);
84
+ break;
85
+ case "c":
86
+ // CurveTo: C|c x1 y1 x2 y2 x y
87
+ _handleCubicBezierTo(data, true, firstPoint, lastPoint, lastControlPoint, result);
88
+ break;
89
+ case "S":
90
+ _handleShorthandCubicCurveTo(data, false, firstPoint, lastPoint, lastControlPoint, result);
91
+ break;
92
+ case "s":
93
+ _handleShorthandCubicCurveTo(data, true, firstPoint, lastPoint, lastControlPoint, result);
94
+ break;
95
+ case "Q":
96
+ // QuadraticCurveTo: Q|q x1 y1 x y
97
+ _handleQuadraticCurveTo(data, false, firstPoint, lastPoint, lastControlPoint, result);
98
+ break;
99
+ case "q":
100
+ // QuadraticCurveTo: Q|q x1 y1 x y
101
+ _handleQuadraticCurveTo(data, true, firstPoint, lastPoint, lastControlPoint, result);
102
+ break;
103
+ case "A":
104
+ // EllipticalArcTo: A|a rx ry x-axis-rotation large-arc-flag sweep-flag x y
105
+ _handleArcTo(data, false, firstPoint, lastPoint, lastControlPoint, result);
106
+ break;
107
+ case "a":
108
+ // EllipticalArcTo: A|a rx ry x-axis-rotation large-arc-flag sweep-flag x y
109
+ _handleArcTo(data, true, firstPoint, lastPoint, lastControlPoint, result);
110
+ break;
111
+ case "z":
112
+ _handleClosePath(data, false, firstPoint, lastPoint, lastControlPoint, result);
113
+ break;
114
+ case "Z":
115
+ // ClosePath: Z|z (no arguments)
116
+ _handleClosePath(data, true, firstPoint, lastPoint, lastControlPoint, result);
117
+ // i++;
118
+ break;
119
+ default:
120
+ if (cmd === "T") {
121
+ throw "T command only allowed after q command.";
122
+ }
123
+ if (cmd === "t") {
124
+ throw "t command only allowed after q command.";
125
+ }
126
+ throw "Unknown SVG path command found: " + cmd + ".";
127
+ }
128
+ // Safepoint: continue reading token by token until something is recognized again
129
+ i++;
130
+ } // END while
131
+ return result;
132
+ }; // END parseSVGPathData
133
+ // Just update the current position
134
+ const _handleMove = (data, isRelative, firstPoint, lastPoint, lastControlPoint, _result) => {
135
+ if (data.length < 3) {
136
+ throw "Unsufficient params for MOVE";
137
+ }
138
+ // result.push( new)
139
+ if (isRelative && !isNaN(lastPoint.x) && !isNaN(lastPoint.y)) {
140
+ lastPoint.x += Number(data[1]);
141
+ lastPoint.y += Number(data[2]);
142
+ lastControlPoint.x = lastPoint.x;
143
+ lastControlPoint.y = lastPoint.y;
144
+ }
145
+ else {
146
+ lastPoint.x = Number(data[1]);
147
+ lastPoint.y = Number(data[2]);
148
+ lastControlPoint.x = lastPoint.x;
149
+ lastControlPoint.y = lastPoint.y;
150
+ }
151
+ // console.log("AFTER MOVE", lastPoint);
152
+ if (isNaN(firstPoint.y)) {
153
+ firstPoint.x = lastPoint.x;
154
+ firstPoint.y = lastPoint.y;
155
+ }
156
+ };
157
+ // Draw a line segment from the current position
158
+ const _handleLineTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
159
+ if (data.length < 3) {
160
+ throw "Unsufficient params for LINETO";
161
+ }
162
+ for (var i = 1; i + 1 < data.length; i += 2) {
163
+ const line = new Line(new Vertex(lastPoint), new Vertex(lastPoint));
164
+ if (isRelative) {
165
+ line.b.x += Number(data[i]);
166
+ line.b.y += Number(data[i + 1]);
167
+ }
168
+ else {
169
+ line.b.x = Number(data[i]);
170
+ line.b.y = Number(data[i + 1]);
171
+ }
172
+ result.push(line);
173
+ lastPoint.x = line.b.x;
174
+ lastPoint.y = line.b.y;
175
+ lastControlPoint.x = line.b.x;
176
+ lastControlPoint.y = line.b.y;
177
+ if (isNaN(firstPoint.y)) {
178
+ firstPoint.x = line.a.x;
179
+ firstPoint.y = line.a.y;
180
+ }
181
+ console.log("LINETO LINE", i, line.toString());
182
+ }
183
+ };
184
+ const _handleHorizontalLineTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
185
+ // console.log("Handle HORIZONTALLINETO", data);
186
+ if (data.length < 2) {
187
+ throw "Unsufficient params for HORIZONTALLINETO";
188
+ }
189
+ for (var i = 1; i < data.length; i++) {
190
+ const line = new Line(new Vertex(lastPoint), new Vertex(lastPoint));
191
+ if (isRelative) {
192
+ line.b.x += Number(data[i]);
193
+ // line.b.y += Number(data[2]);
194
+ }
195
+ else {
196
+ line.b.x = Number(data[i]);
197
+ // line.b.y = Number(data[2]);
198
+ }
199
+ result.push(line);
200
+ lastPoint.x = line.b.x;
201
+ // lastPoint.y = line.b.y;
202
+ lastControlPoint.x = line.b.x;
203
+ if (isNaN(firstPoint.y)) {
204
+ firstPoint.x = line.a.x;
205
+ firstPoint.y = line.a.y;
206
+ }
207
+ }
208
+ };
209
+ const _handleVerticalLineTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
210
+ if (data.length < 2) {
211
+ throw "Unsufficient params for VERTICALLINETO";
212
+ }
213
+ for (var i = 1; i < data.length; i++) {
214
+ const line = new Line(new Vertex(lastPoint), new Vertex(lastPoint));
215
+ if (isRelative) {
216
+ line.b.y += Number(data[i]);
217
+ }
218
+ else {
219
+ line.b.y = Number(data[i]);
220
+ }
221
+ result.push(line);
222
+ // lastPoint.x = line.b.x;
223
+ lastPoint.y = line.b.y;
224
+ lastControlPoint.y = line.b.y;
225
+ if (isNaN(firstPoint.y)) {
226
+ firstPoint.x = line.a.x;
227
+ firstPoint.y = line.a.y;
228
+ }
229
+ }
230
+ };
231
+ // CurveTo: C|c x1 y1 x2 y2 x y
232
+ const _handleCubicBezierTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
233
+ // console.log("Handle CUBICBEZIERTO", data);
234
+ if (data.length < 7) {
235
+ throw "Unsufficient params for CUBICBEZIERTO";
236
+ }
237
+ for (var i = 1; i + 5 < data.length; i += 6) {
238
+ const curve = new CubicBezierCurve(new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint));
239
+ if (isRelative) {
240
+ curve.startControlPoint.x += Number(data[i]);
241
+ curve.startControlPoint.y += Number(data[i + 1]);
242
+ curve.endControlPoint.x += Number(data[i + 2]);
243
+ curve.endControlPoint.y += Number(data[i + 3]);
244
+ curve.endPoint.x += Number(data[i + 4]);
245
+ curve.endPoint.y += Number(data[i + 5]);
246
+ }
247
+ else {
248
+ curve.startControlPoint.x = Number(data[i]);
249
+ curve.startControlPoint.y = Number(data[i + 1]);
250
+ curve.endControlPoint.x = Number(data[i + 2]);
251
+ curve.endControlPoint.y = Number(data[i + 3]);
252
+ curve.endPoint.x = Number(data[i + 4]);
253
+ curve.endPoint.y = Number(data[i + 5]);
254
+ }
255
+ result.push(curve);
256
+ lastPoint.x = curve.endPoint.x;
257
+ lastPoint.y = curve.endPoint.y;
258
+ lastControlPoint.x = curve.endControlPoint.x;
259
+ lastControlPoint.y = curve.endControlPoint.y;
260
+ if (isNaN(firstPoint.x)) {
261
+ firstPoint.x = curve.startPoint.x;
262
+ firstPoint.y = curve.startPoint.y;
263
+ }
264
+ }
265
+ };
266
+ // QuadraticCurveTo: Q|q x1 y1 x y
267
+ const _handleQuadraticCurveTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
268
+ // console.log("Handle QUADRATICBEZIERTO", data);
269
+ if (data.length < 5) {
270
+ throw "Unsufficient params for QUADRATICBEZIERTO";
271
+ }
272
+ var i = 1;
273
+ var localLastQuadraticControlPoint = { x: 0, y: 0 };
274
+ // This loops runs at least once
275
+ while (i + 3 < data.length && data[i] !== "t" && data[i] !== "T") {
276
+ const curve = new CubicBezierCurve(new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint));
277
+ if (isRelative) {
278
+ curve.startControlPoint.x += curve.startPoint.x + (Number(data[i]) - curve.startControlPoint.x); // * 0.666;
279
+ curve.startControlPoint.y += curve.startPoint.y + (Number(data[i + 1]) - curve.startControlPoint.y); // * 0.666;
280
+ curve.endPoint.x += Number(data[i + 2]);
281
+ curve.endPoint.y += Number(data[i + 3]);
282
+ curve.endControlPoint.x = curve.startControlPoint.x;
283
+ curve.endControlPoint.y = curve.startControlPoint.y;
284
+ }
285
+ else {
286
+ curve.startControlPoint.x = curve.startPoint.x + (Number(data[i]) - curve.startControlPoint.x); // * 0.666;
287
+ curve.startControlPoint.y = curve.startPoint.y + (Number(data[i + 1]) - curve.startControlPoint.y); // * 0.666;
288
+ curve.endPoint.x = Number(data[i + 2]);
289
+ curve.endPoint.y = Number(data[i + 3]);
290
+ curve.endControlPoint.x = curve.startControlPoint.x;
291
+ curve.endControlPoint.y = curve.startControlPoint.y;
292
+ }
293
+ // var lastQuadraticControlPoint = { x: Number(data[1]), y: Number(data[2]) };
294
+ localLastQuadraticControlPoint = { x: curve.endControlPoint.x, y: curve.endControlPoint.y };
295
+ // Convert quadratic curve to cubic curve
296
+ curve.startControlPoint.x = curve.startPoint.x + (curve.startControlPoint.x - curve.startPoint.x) * 0.666;
297
+ curve.startControlPoint.y = curve.startPoint.y + (curve.startControlPoint.y - curve.startPoint.y) * 0.666;
298
+ curve.endControlPoint.x = curve.endPoint.x + (curve.endControlPoint.x - curve.endPoint.x) * 0.666;
299
+ curve.endControlPoint.y = curve.endPoint.y + (curve.endControlPoint.y - curve.endPoint.y) * 0.666;
300
+ result.push(curve);
301
+ lastPoint.x = curve.endPoint.x;
302
+ lastPoint.y = curve.endPoint.y;
303
+ lastControlPoint.x = curve.endControlPoint.x;
304
+ lastControlPoint.y = curve.endControlPoint.y;
305
+ if (isNaN(firstPoint.x)) {
306
+ firstPoint.x = curve.startPoint.x;
307
+ firstPoint.y = curve.startPoint.y;
308
+ }
309
+ i += 4;
310
+ } // END while
311
+ // 'T' or 't' command may follow
312
+ // if (data.length >= 8) {
313
+ if (i < data.length && (data[i] == "t" || data[i] === "T")) {
314
+ // TODO: think about this type cast!
315
+ const subData = data.slice(5);
316
+ // var lastQuadraticControlPoint = { x: Number(data[1]), y: Number(data[2]) };
317
+ if (subData[0] === "T") {
318
+ // _handleShorthandQuadraticCurveTo(subData, false, firstPoint, lastPoint, lastControlPoint, lastQuadraticControlPoint, result);
319
+ _handleShorthandQuadraticCurveTo(subData, false, firstPoint, lastPoint, lastControlPoint, localLastQuadraticControlPoint, result);
320
+ }
321
+ else if (subData[0] === "t") {
322
+ // _handleShorthandQuadraticCurveTo(subData, true, firstPoint, lastPoint, lastControlPoint, lastQuadraticControlPoint, result);
323
+ _handleShorthandQuadraticCurveTo(subData, true, firstPoint, lastPoint, lastControlPoint, localLastQuadraticControlPoint, result);
324
+ }
325
+ }
326
+ };
327
+ // This is a helper function and works only in combination with Quadratic Bézier Curves
328
+ // T|t (x y)+
329
+ const _handleShorthandQuadraticCurveTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, lastQuadraticControlPoint, result) => {
330
+ if (data.length < 3) {
331
+ throw "Unsufficient params for SHORTHANDQUADRATICCURVETO";
332
+ }
333
+ var i = 1;
334
+ while (i + 1 < data.length) {
335
+ // Respect multiple 'T|t' commands here
336
+ if (data[i] === "T" || data[i] === "t") {
337
+ i++;
338
+ continue;
339
+ }
340
+ const curve = new CubicBezierCurve(new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint));
341
+ if (isRelative) {
342
+ curve.endPoint.x += Number(data[i]);
343
+ curve.endPoint.y += Number(data[i + 1]);
344
+ curve.startControlPoint.x += curve.startPoint.x - (lastQuadraticControlPoint.x - lastPoint.x);
345
+ curve.startControlPoint.y += curve.startPoint.y - (lastQuadraticControlPoint.y - lastPoint.y);
346
+ }
347
+ else {
348
+ curve.endPoint.x = Number(data[i]);
349
+ curve.endPoint.y = Number(data[i + 1]);
350
+ curve.startControlPoint.x = curve.startPoint.x - (lastQuadraticControlPoint.x - lastPoint.x);
351
+ curve.startControlPoint.y = curve.startPoint.y - (lastQuadraticControlPoint.y - lastPoint.y);
352
+ }
353
+ // First handle as symmetrical cubic curve
354
+ curve.endControlPoint.x = curve.startControlPoint.x;
355
+ curve.endControlPoint.y = curve.startControlPoint.y;
356
+ lastQuadraticControlPoint.y = curve.endControlPoint.y;
357
+ lastQuadraticControlPoint.x = curve.endControlPoint.x;
358
+ // Convert quadratic curve to cubic curve
359
+ var scaleFactor = 0.666; // i === 1 ? 0.666 : 1.0;
360
+ curve.startControlPoint.x = curve.startPoint.x + (curve.startControlPoint.x - curve.startPoint.x) * scaleFactor;
361
+ curve.startControlPoint.y = curve.startPoint.y + (curve.startControlPoint.y - curve.startPoint.y) * scaleFactor;
362
+ curve.endControlPoint.x = curve.endPoint.x + (curve.endControlPoint.x - curve.endPoint.x) * scaleFactor;
363
+ curve.endControlPoint.y = curve.endPoint.y + (curve.endControlPoint.y - curve.endPoint.y) * scaleFactor;
364
+ // console.log("ADDING T CURVE", curve);
365
+ result.push(curve);
366
+ lastPoint.x = curve.endPoint.x;
367
+ lastPoint.y = curve.endPoint.y;
368
+ lastControlPoint.x = curve.endControlPoint.x;
369
+ lastControlPoint.y = curve.endControlPoint.y;
370
+ if (isNaN(firstPoint.x)) {
371
+ firstPoint.x = curve.startPoint.x;
372
+ firstPoint.y = curve.startPoint.y;
373
+ }
374
+ i += 2;
375
+ }
376
+ };
377
+ // The S|s x2 y2 x y
378
+ const _handleShorthandCubicCurveTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
379
+ // console.log("Handle SHORTHANDCUBICBEZIERTO", data);
380
+ if (data.length < 5) {
381
+ throw "Unsufficient params for SHORTHANDCUBICBEZIERTO";
382
+ }
383
+ const curve = new CubicBezierCurve(new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint), new Vertex(lastPoint));
384
+ if (isRelative) {
385
+ curve.startControlPoint.x = lastPoint.x - (lastControlPoint.x - lastPoint.x);
386
+ curve.startControlPoint.y = lastPoint.y - (lastControlPoint.y - lastPoint.y);
387
+ curve.endControlPoint.x += Number(data[1]);
388
+ curve.endControlPoint.y += Number(data[2]);
389
+ curve.endPoint.x += Number(data[3]);
390
+ curve.endPoint.y += Number(data[4]);
391
+ }
392
+ else {
393
+ curve.startControlPoint.x = lastPoint.x - (lastControlPoint.x - lastPoint.x);
394
+ curve.startControlPoint.y = lastPoint.y - (lastControlPoint.y - lastPoint.y);
395
+ curve.endControlPoint.x = Number(data[1]);
396
+ curve.endControlPoint.y = Number(data[2]);
397
+ curve.endPoint.x = Number(data[3]);
398
+ curve.endPoint.y = Number(data[4]);
399
+ }
400
+ result.push(curve);
401
+ lastPoint.x = curve.endPoint.x;
402
+ lastPoint.y = curve.endPoint.y;
403
+ lastControlPoint.x = curve.endControlPoint.x;
404
+ lastControlPoint.y = curve.endControlPoint.y;
405
+ if (isNaN(firstPoint.x)) {
406
+ firstPoint.x = curve.startPoint.x;
407
+ firstPoint.y = curve.startPoint.y;
408
+ }
409
+ };
410
+ // EllipticalArcTo: A|a rx ry x-axis-rotation large-arc-flag sweep-flag x y
411
+ const _handleArcTo = (data, isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
412
+ if (data.length < 8) {
413
+ throw "Unsufficient params for ARCTO";
414
+ }
415
+ for (var i = 1; i + 6 < data.length; i += 7) {
416
+ const arcEndPoint = { x: Number(data[i + 5]), y: Number(data[i + 6]) };
417
+ if (isRelative) {
418
+ arcEndPoint.x += lastPoint.x;
419
+ arcEndPoint.y += lastPoint.y;
420
+ }
421
+ // console.log(
422
+ // "ARC",
423
+ // "data.length",
424
+ // data.length,
425
+ // "i",
426
+ // i,
427
+ // "lastPoint.x",
428
+ // lastPoint.x, // x1
429
+ // "lastPoint.y",
430
+ // lastPoint.y, // y1
431
+ // "data[i]",
432
+ // Number(data[i]), // rx
433
+ // "data[i+1]",
434
+ // Number(data[i + 1]), // ry
435
+ // "data[i+2]",
436
+ // Number(data[i + 2]), // phi: number,
437
+ // "data[i+3]",
438
+ // Boolean(data[i + 3]), // fa: boolean,
439
+ // "data[i+4]",
440
+ // Boolean(data[i + 4]), // fs: boolean,
441
+ // "data[i+5]",
442
+ // arcEndPoint.x, // Number(data[6]), // x2: number,
443
+ // "data[i+6]",
444
+ // arcEndPoint.y // Number(data[7]) // y2: number
445
+ // );
446
+ // A 5 4 0 1 1 -10 -5
447
+ // TODO: respect relative/absolute here
448
+ const ellipseSector = VEllipseSector.ellipseSectorUtils.endpointToCenterParameters(lastPoint.x, lastPoint.y, Number(data[i]), Number(data[i + 1]), Number(data[i + 2]) * DEG_TO_RAD, Boolean(data[i + 3]), Boolean(data[i + 4]), arcEndPoint.x, arcEndPoint.y // Number(data[7]) // y2: number
449
+ );
450
+ // console.log("ellipseSector", ellipseSector);
451
+ const curves = ellipseSector.toCubicBezier(4); // 4 segments already seems to be a good approximation
452
+ for (var j = 0; j < curves.length; j++) {
453
+ result.push(curves[j]); // Destruct!
454
+ }
455
+ // result.push(ellipseSector.ellipse);
456
+ if (curves.length > 0) {
457
+ // console.log("curves", curves);
458
+ const lastCurve = curves[curves.length - 1];
459
+ // lastPoint.x = lastCurve.endPoint.x;
460
+ // lastPoint.y = lastCurve.endPoint.y;
461
+ lastControlPoint.x = lastCurve.endControlPoint.x;
462
+ lastControlPoint.y = lastCurve.endControlPoint.y;
463
+ if (isNaN(firstPoint.x)) {
464
+ firstPoint.x = curves[0].startPoint.x;
465
+ firstPoint.y = curves[0].startPoint.y;
466
+ }
467
+ }
468
+ lastPoint.x = arcEndPoint.x;
469
+ lastPoint.y = arcEndPoint.y;
470
+ } // END for
471
+ // TODO: track first/last/control point
472
+ };
473
+ const _handleClosePath = (_data, _isRelative, firstPoint, lastPoint, lastControlPoint, result) => {
474
+ // console.log("Handle CLOSEPATH", "lastPoint", lastPoint, "firstPoint", firstPoint);
475
+ const line = new Line(new Vertex(lastPoint), new Vertex(firstPoint));
476
+ result.push(line);
477
+ lastPoint.x = line.b.x;
478
+ lastPoint.y = line.b.y;
479
+ lastControlPoint.x = line.b.x;
480
+ lastControlPoint.y = line.b.y;
481
+ };
482
+ //# sourceMappingURL=parseSVGPathData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseSVGPathData.js","sourceRoot":"","sources":["../../../../ts/utils/parsers/svg/parseSVGPathData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Split SVG path data `d` strings.
3
+ *
4
+ * As this helper function does not detect all possible path data strings it should cover the most daily use-cases.
5
+ *
6
+ * For more insight see
7
+ * https://www.w3.org/TR/SVG/paths.html
8
+ *
9
+ * @author Ikaros Kappler
10
+ * @date 2022-11-22
11
+ * @modified 2022-12-21 Ported to Typescript
12
+ * @version 0.0.1-alpha
13
+ */
14
+ import { SVGPathCommand } from "./types";
15
+ /**
16
+ * @name splitSVGPathData
17
+ * @static
18
+ * @param {string} dataString - The SVG path data to split. This should be some string
19
+ **/
20
+ export declare const splitSVGPathData: (dataString: string) => Array<SVGPathCommand> | null;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Split SVG path data `d` strings.
3
+ *
4
+ * As this helper function does not detect all possible path data strings it should cover the most daily use-cases.
5
+ *
6
+ * For more insight see
7
+ * https://www.w3.org/TR/SVG/paths.html
8
+ *
9
+ * @author Ikaros Kappler
10
+ * @date 2022-11-22
11
+ * @modified 2022-12-21 Ported to Typescript
12
+ * @version 0.0.1-alpha
13
+ */
14
+ /**
15
+ * @name splitSVGPathData
16
+ * @static
17
+ * @param {string} dataString - The SVG path data to split. This should be some string
18
+ **/
19
+ export const splitSVGPathData = (dataString) => {
20
+ // I used a modified version of this Josh Frank's SVG path data RexEx.
21
+ // Source
22
+ // https://javascript.plainenglish.io/june-3-parsing-and-validating-svg-paths-with-regex-7bd0e245115
23
+ // const validCommand =
24
+ // /([ml](\s?-?((\d+(\.\d+)?)|(\.\d+)))[,\s]?(-?((\d+(\.\d+)?)|(\.\d+))))|([hv](\s?-?((\d+(\.\d+)?)|(\.\d+))))|(c(\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){5})|(q(\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){3}(\s?t?(\s?-?((\d+(\.\d+)?)|(\.\d+)))[,\s]?(-?((\d+(\.\d+)?)|(\.\d+))))*)|(a(\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){2}[,\s]?[01][,\s]+[01][,\s]+([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){2})|(s(\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){3})|z/gi;
25
+ //
26
+ // My Version allows multiple param sets, too, like 'm|M (x y)+' or 'q|Q (x1 y1 x y)+'. Look at the plus.
27
+ const validCommand = /([ml]((\s?-?((\d+(\.\d+)?)|(\.\d+)))[,\s]?(-?((\d+(\.\d+)?)|(\.\d+))))+)|([hv]((\s?-?((\d+(\.\d+)?)|(\.\d+))))+)|(c((\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){5})+)|(q((\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){3})+(\s?(t?(\s?-?((\d+(\.\d+)?)|(\.\d+)))[,\s]?(-?((\d+(\.\d+)?)|(\.\d+))))*)+)|(a((\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){2}[,\s]?[01][,\s]+[01][,\s]+([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){2})+)|(s(\s?-?((\d+(\.\d+)?)|(\.\d+)))([,\s]?(-?((\d+(\.\d+)?)|(\.\d+)))){3})|z/gi;
28
+ const dataElements = dataString.match(validCommand);
29
+ if (!dataElements) {
30
+ return null;
31
+ }
32
+ const result = [];
33
+ var i = 0;
34
+ while (i < dataElements.length) {
35
+ const token = dataElements[i];
36
+ // Ctwheels comment was really useful here
37
+ // https://stackoverflow.com/questions/47801455/what-is-the-regex-that-properly-splits-svg-d-attributes-into-tokens
38
+ const dataRaw = token.match(/-?(?:\d*\.)?\d+|[a-z]/gi);
39
+ if (dataRaw) {
40
+ result.push(dataRaw);
41
+ }
42
+ else {
43
+ // throw Error?
44
+ }
45
+ i++;
46
+ }
47
+ return result;
48
+ }; // END splitSVGPathData
49
+ //# sourceMappingURL=splitSVGPathData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitSVGPathData.js","sourceRoot":"","sources":["../../../../ts/utils/parsers/svg/splitSVGPathData.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;;IAII;AACJ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAgC,EAAE;IACnF,sEAAsE;IACtE,SAAS;IACT,uGAAuG;IACvG,uBAAuB;IACvB,2hBAA2hB;IAC3hB,EAAE;IACF,yGAAyG;IACzG,MAAM,YAAY,GAChB,yiBAAyiB,CAAC;IAE5iB,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,IAAI,CAAC;KACb;IAED,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE;QAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,0CAA0C;QAC1C,sHAAsH;QACtH,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE;YACX,MAAM,CAAC,IAAI,CAAC,OAAyB,CAAC,CAAC;SACxC;aAAM;YACL,eAAe;SAChB;QACD,CAAC,EAAE,CAAC;KACL;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,CAAC,uBAAuB"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Defining some basic SVG command types.
3
+ *
4
+ * As these types do not define all very possible path data strings they should cover the most daily use-cases.
5
+ *
6
+ * For more insight see
7
+ * https://www.w3.org/TR/SVG/paths.html
8
+ *
9
+ *
10
+ * @author Ikaros Kappler
11
+ * @date 2022-12-21 (winter solstice night – yes the days & nights are dark and I have nothing else to do)
12
+ * @modified 2023-01-17 Added multiple parameter sets.
13
+ * @version 0.0.2-alpha
14
+ */
15
+ export declare type NumericString = `${number}`;
16
+ export declare type BooleanString = "0" | "1" | `${boolean}`;
17
+ export declare type SVGPathMoveToCommand = ["M" | "m", NumericString, NumericString];
18
+ export declare type SVGPathLineToCommand = ["L" | "l", NumericString, NumericString, ...Array<NumericString>];
19
+ export declare type SVGPathVerticalLineToCommand = ["V" | "v", NumericString];
20
+ export declare type SVGPathHorizontalLineToCommand = ["H" | "h", NumericString];
21
+ export declare type SVGPathQuadraticCurveToCommand = ["Q" | "q", NumericString, NumericString, NumericString, NumericString] | [
22
+ "Q" | "q",
23
+ NumericString,
24
+ NumericString,
25
+ NumericString,
26
+ NumericString,
27
+ "T" | "t",
28
+ NumericString,
29
+ NumericString,
30
+ ...Array<NumericString>
31
+ ];
32
+ export declare type SVGPathCubicCurveToCommand = [
33
+ "C" | "c",
34
+ NumericString,
35
+ NumericString,
36
+ NumericString,
37
+ NumericString,
38
+ NumericString,
39
+ NumericString,
40
+ ...Array<NumericString>
41
+ ];
42
+ export declare type SVGPathShorthandCubicCurveToCommand = [
43
+ "S" | "s",
44
+ NumericString,
45
+ NumericString,
46
+ NumericString,
47
+ NumericString,
48
+ ...Array<NumericString>
49
+ ];
50
+ export declare type SVGPathArcToCommand = [
51
+ "A" | "a",
52
+ NumericString,
53
+ NumericString,
54
+ NumericString,
55
+ BooleanString,
56
+ BooleanString,
57
+ NumericString,
58
+ NumericString,
59
+ ...Array<NumericString>
60
+ ];
61
+ export declare type SVGPathCloseCommand = ["Z" | "z"];
62
+ export declare type SVGPathShorthandQuadraticCurveToCommand = ["T" | "t", NumericString, NumericString, ...Array<NumericString>];
63
+ export declare type SVGPathCommand = SVGPathMoveToCommand | SVGPathLineToCommand | SVGPathVerticalLineToCommand | SVGPathHorizontalLineToCommand | SVGPathQuadraticCurveToCommand | SVGPathCubicCurveToCommand | SVGPathShorthandCubicCurveToCommand | SVGPathArcToCommand | SVGPathCloseCommand;