woodml-parser 1.0.0
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.
- package/README.md +181 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +554 -0
- package/dist/cli.js.map +1 -0
- package/dist/cost.d.ts +94 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +340 -0
- package/dist/cost.js.map +1 -0
- package/dist/cost.test.d.ts +2 -0
- package/dist/cost.test.d.ts.map +1 -0
- package/dist/cost.test.js +241 -0
- package/dist/cost.test.js.map +1 -0
- package/dist/example.d.ts +6 -0
- package/dist/example.d.ts.map +1 -0
- package/dist/example.js +136 -0
- package/dist/example.js.map +1 -0
- package/dist/formulas.d.ts +23 -0
- package/dist/formulas.d.ts.map +1 -0
- package/dist/formulas.js +442 -0
- package/dist/formulas.js.map +1 -0
- package/dist/formulas.test.d.ts +5 -0
- package/dist/formulas.test.d.ts.map +1 -0
- package/dist/formulas.test.js +360 -0
- package/dist/formulas.test.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.test.d.ts +6 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +271 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/optimizer.d.ts +119 -0
- package/dist/optimizer.d.ts.map +1 -0
- package/dist/optimizer.js +423 -0
- package/dist/optimizer.js.map +1 -0
- package/dist/optimizer.test.d.ts +2 -0
- package/dist/optimizer.test.d.ts.map +1 -0
- package/dist/optimizer.test.js +225 -0
- package/dist/optimizer.test.js.map +1 -0
- package/dist/parser.d.ts +59 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +305 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser.test.d.ts +5 -0
- package/dist/parser.test.d.ts.map +1 -0
- package/dist/parser.test.js +486 -0
- package/dist/parser.test.js.map +1 -0
- package/dist/pdf.d.ts +36 -0
- package/dist/pdf.d.ts.map +1 -0
- package/dist/pdf.js +316 -0
- package/dist/pdf.js.map +1 -0
- package/dist/svg.d.ts +73 -0
- package/dist/svg.d.ts.map +1 -0
- package/dist/svg.js +613 -0
- package/dist/svg.js.map +1 -0
- package/dist/svg.test.d.ts +5 -0
- package/dist/svg.test.d.ts.map +1 -0
- package/dist/svg.test.js +333 -0
- package/dist/svg.test.js.map +1 -0
- package/dist/templates.d.ts +126 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +448 -0
- package/dist/templates.js.map +1 -0
- package/dist/templates.test.d.ts +5 -0
- package/dist/templates.test.d.ts.map +1 -0
- package/dist/templates.test.js +630 -0
- package/dist/templates.test.js.map +1 -0
- package/dist/types.d.ts +250 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/units.d.ts +53 -0
- package/dist/units.d.ts.map +1 -0
- package/dist/units.js +359 -0
- package/dist/units.js.map +1 -0
- package/dist/units.test.d.ts +5 -0
- package/dist/units.test.d.ts.map +1 -0
- package/dist/units.test.js +364 -0
- package/dist/units.test.js.map +1 -0
- package/package.json +46 -0
package/dist/svg.test.js
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for SVG diagram generation
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const node_test_1 = require("node:test");
|
|
40
|
+
const assert = __importStar(require("node:assert"));
|
|
41
|
+
const svg_1 = require("./svg");
|
|
42
|
+
// ============================================
|
|
43
|
+
// TEST HELPERS
|
|
44
|
+
// ============================================
|
|
45
|
+
function makeDimension(value, original) {
|
|
46
|
+
return { value, unit: 'imperial', original };
|
|
47
|
+
}
|
|
48
|
+
function makeResolvedPart(id, length, width, thickness, quantity = 1, name, grain) {
|
|
49
|
+
return {
|
|
50
|
+
id,
|
|
51
|
+
name: name || id,
|
|
52
|
+
grain: grain || 'long',
|
|
53
|
+
dimensions: {
|
|
54
|
+
length: makeDimension(length, `${length}"`),
|
|
55
|
+
width: makeDimension(width, `${width}"`),
|
|
56
|
+
thickness: makeDimension(thickness, `${thickness}"`),
|
|
57
|
+
},
|
|
58
|
+
resolvedQuantity: quantity,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function makeDocument(parts) {
|
|
62
|
+
return {
|
|
63
|
+
woodml: '1.0',
|
|
64
|
+
project: {
|
|
65
|
+
name: 'Test Project',
|
|
66
|
+
units: 'imperial',
|
|
67
|
+
},
|
|
68
|
+
resolvedParts: parts,
|
|
69
|
+
resolvedVariables: {},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// ============================================
|
|
73
|
+
// SVG GENERATOR TESTS
|
|
74
|
+
// ============================================
|
|
75
|
+
(0, node_test_1.describe)('SVGGenerator', () => {
|
|
76
|
+
(0, node_test_1.describe)('constructor', () => {
|
|
77
|
+
(0, node_test_1.it)('should use default options', () => {
|
|
78
|
+
const generator = new svg_1.SVGGenerator();
|
|
79
|
+
// Just verify it creates successfully
|
|
80
|
+
assert.ok(generator instanceof svg_1.SVGGenerator);
|
|
81
|
+
});
|
|
82
|
+
(0, node_test_1.it)('should accept custom options', () => {
|
|
83
|
+
const generator = new svg_1.SVGGenerator({
|
|
84
|
+
width: 1200,
|
|
85
|
+
height: 800,
|
|
86
|
+
colorScheme: 'blueprint',
|
|
87
|
+
});
|
|
88
|
+
assert.ok(generator instanceof svg_1.SVGGenerator);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
(0, node_test_1.describe)('generatePartsDiagram', () => {
|
|
92
|
+
(0, node_test_1.it)('should generate valid SVG for single part', () => {
|
|
93
|
+
const generator = new svg_1.SVGGenerator();
|
|
94
|
+
const doc = makeDocument([
|
|
95
|
+
makeResolvedPart('top', 24, 12, 0.75),
|
|
96
|
+
]);
|
|
97
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
98
|
+
assert.ok(svg.includes('<?xml version="1.0"'));
|
|
99
|
+
assert.ok(svg.includes('<svg'));
|
|
100
|
+
assert.ok(svg.includes('</svg>'));
|
|
101
|
+
assert.ok(svg.includes('data-id="top"'));
|
|
102
|
+
});
|
|
103
|
+
(0, node_test_1.it)('should generate valid SVG for multiple parts', () => {
|
|
104
|
+
const generator = new svg_1.SVGGenerator();
|
|
105
|
+
const doc = makeDocument([
|
|
106
|
+
makeResolvedPart('top', 24, 12, 0.75),
|
|
107
|
+
makeResolvedPart('side', 12, 6, 0.75, 2),
|
|
108
|
+
makeResolvedPart('bottom', 24, 12, 0.5),
|
|
109
|
+
]);
|
|
110
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
111
|
+
assert.ok(svg.includes('data-id="top"'));
|
|
112
|
+
assert.ok(svg.includes('data-id="side"'));
|
|
113
|
+
assert.ok(svg.includes('data-id="bottom"'));
|
|
114
|
+
});
|
|
115
|
+
(0, node_test_1.it)('should handle empty parts list', () => {
|
|
116
|
+
const generator = new svg_1.SVGGenerator();
|
|
117
|
+
const doc = makeDocument([]);
|
|
118
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
119
|
+
assert.ok(svg.includes('No parts to display'));
|
|
120
|
+
});
|
|
121
|
+
(0, node_test_1.it)('should show dimensions when enabled', () => {
|
|
122
|
+
const generator = new svg_1.SVGGenerator({ showDimensions: true });
|
|
123
|
+
const doc = makeDocument([
|
|
124
|
+
makeResolvedPart('panel', 36, 18, 0.75),
|
|
125
|
+
]);
|
|
126
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
127
|
+
// Quotes are XML-escaped in SVG
|
|
128
|
+
assert.ok(svg.includes('36"'));
|
|
129
|
+
assert.ok(svg.includes('18"'));
|
|
130
|
+
});
|
|
131
|
+
(0, node_test_1.it)('should show part names when enabled', () => {
|
|
132
|
+
const generator = new svg_1.SVGGenerator({ showNames: true });
|
|
133
|
+
const doc = makeDocument([
|
|
134
|
+
makeResolvedPart('side_panel', 24, 12, 0.75, 1, 'Side Panel'),
|
|
135
|
+
]);
|
|
136
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
137
|
+
assert.ok(svg.includes('Side Panel'));
|
|
138
|
+
});
|
|
139
|
+
(0, node_test_1.it)('should show quantity badge for parts with quantity > 1', () => {
|
|
140
|
+
const generator = new svg_1.SVGGenerator();
|
|
141
|
+
const doc = makeDocument([
|
|
142
|
+
makeResolvedPart('shelf', 30, 10, 0.75, 4),
|
|
143
|
+
]);
|
|
144
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
145
|
+
assert.ok(svg.includes('×4'));
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
(0, node_test_1.describe)('generateSinglePart', () => {
|
|
149
|
+
(0, node_test_1.it)('should generate SVG for a single part', () => {
|
|
150
|
+
const generator = new svg_1.SVGGenerator();
|
|
151
|
+
const part = makeResolvedPart('door', 30, 20, 0.75);
|
|
152
|
+
const svg = generator.generateSinglePart(part);
|
|
153
|
+
assert.ok(svg.includes('<svg'));
|
|
154
|
+
assert.ok(svg.includes('data-id="door"'));
|
|
155
|
+
});
|
|
156
|
+
(0, node_test_1.it)('should scale part appropriately', () => {
|
|
157
|
+
const generator = new svg_1.SVGGenerator({ scale: 5 });
|
|
158
|
+
const part = makeResolvedPart('small', 10, 5, 0.5);
|
|
159
|
+
const svg = generator.generateSinglePart(part);
|
|
160
|
+
// Should contain the part
|
|
161
|
+
assert.ok(svg.includes('<rect'));
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
(0, node_test_1.describe)('generateCutListDiagram', () => {
|
|
165
|
+
(0, node_test_1.it)('should generate cut list layout', () => {
|
|
166
|
+
const generator = new svg_1.SVGGenerator();
|
|
167
|
+
const doc = makeDocument([
|
|
168
|
+
makeResolvedPart('piece1', 24, 6, 0.75),
|
|
169
|
+
makeResolvedPart('piece2', 24, 6, 0.75),
|
|
170
|
+
makeResolvedPart('piece3', 12, 8, 0.75),
|
|
171
|
+
]);
|
|
172
|
+
const svg = generator.generateCutListDiagram(doc);
|
|
173
|
+
assert.ok(svg.includes('<svg'));
|
|
174
|
+
assert.ok(svg.includes('stroke-dasharray')); // Stock outline
|
|
175
|
+
});
|
|
176
|
+
(0, node_test_1.it)('should handle custom stock sizes', () => {
|
|
177
|
+
const generator = new svg_1.SVGGenerator();
|
|
178
|
+
const doc = makeDocument([
|
|
179
|
+
makeResolvedPart('panel', 20, 10, 0.75),
|
|
180
|
+
]);
|
|
181
|
+
const svg = generator.generateCutListDiagram(doc, 24, 48);
|
|
182
|
+
assert.ok(svg.includes('<svg'));
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
(0, node_test_1.describe)('generateExplodedView', () => {
|
|
186
|
+
(0, node_test_1.it)('should generate 3D-style exploded view', () => {
|
|
187
|
+
const generator = new svg_1.SVGGenerator();
|
|
188
|
+
const doc = makeDocument([
|
|
189
|
+
makeResolvedPart('top', 24, 12, 0.75),
|
|
190
|
+
makeResolvedPart('side', 12, 12, 0.75, 2),
|
|
191
|
+
makeResolvedPart('bottom', 24, 12, 0.5),
|
|
192
|
+
]);
|
|
193
|
+
const svg = generator.generateExplodedView(doc);
|
|
194
|
+
assert.ok(svg.includes('<polygon')); // 3D faces are polygons
|
|
195
|
+
assert.ok(svg.includes('class="part-3d"'));
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
(0, node_test_1.describe)('color schemes', () => {
|
|
199
|
+
(0, node_test_1.it)('should apply default color scheme', () => {
|
|
200
|
+
const generator = new svg_1.SVGGenerator({ colorScheme: 'default' });
|
|
201
|
+
const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
|
|
202
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
203
|
+
assert.ok(svg.includes('#ffffff')); // White background
|
|
204
|
+
assert.ok(svg.includes('#f5deb3')); // Wheat fill
|
|
205
|
+
});
|
|
206
|
+
(0, node_test_1.it)('should apply blueprint color scheme', () => {
|
|
207
|
+
const generator = new svg_1.SVGGenerator({ colorScheme: 'blueprint' });
|
|
208
|
+
const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
|
|
209
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
210
|
+
assert.ok(svg.includes('#1a365d')); // Dark blue background
|
|
211
|
+
});
|
|
212
|
+
(0, node_test_1.it)('should apply monochrome color scheme', () => {
|
|
213
|
+
const generator = new svg_1.SVGGenerator({ colorScheme: 'monochrome' });
|
|
214
|
+
const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
|
|
215
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
216
|
+
assert.ok(svg.includes('#f0f0f0')); // Light gray fill
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
(0, node_test_1.describe)('grain direction', () => {
|
|
220
|
+
(0, node_test_1.it)('should render horizontal grain lines for long grain', () => {
|
|
221
|
+
const generator = new svg_1.SVGGenerator({ showGrain: true });
|
|
222
|
+
const doc = makeDocument([
|
|
223
|
+
makeResolvedPart('panel', 24, 12, 0.75, 1, 'Panel', 'long'),
|
|
224
|
+
]);
|
|
225
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
226
|
+
// Should contain path elements for grain
|
|
227
|
+
assert.ok(svg.includes('<path'));
|
|
228
|
+
});
|
|
229
|
+
(0, node_test_1.it)('should not render grain for any direction', () => {
|
|
230
|
+
const generator = new svg_1.SVGGenerator({ showGrain: true });
|
|
231
|
+
const part = makeResolvedPart('panel', 24, 12, 0.75, 1, 'Panel', 'any');
|
|
232
|
+
const doc = makeDocument([part]);
|
|
233
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
234
|
+
// Should still generate valid SVG
|
|
235
|
+
assert.ok(svg.includes('<svg'));
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
// ============================================
|
|
240
|
+
// CONVENIENCE FUNCTION TESTS
|
|
241
|
+
// ============================================
|
|
242
|
+
(0, node_test_1.describe)('generateSVG', () => {
|
|
243
|
+
(0, node_test_1.it)('should generate parts diagram by default', () => {
|
|
244
|
+
const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
|
|
245
|
+
const svg = (0, svg_1.generateSVG)(doc);
|
|
246
|
+
assert.ok(svg.includes('data-id="test"'));
|
|
247
|
+
});
|
|
248
|
+
(0, node_test_1.it)('should generate exploded view when specified', () => {
|
|
249
|
+
const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
|
|
250
|
+
const svg = (0, svg_1.generateSVG)(doc, 'exploded');
|
|
251
|
+
assert.ok(svg.includes('class="part-3d"'));
|
|
252
|
+
});
|
|
253
|
+
(0, node_test_1.it)('should generate cutlist diagram when specified', () => {
|
|
254
|
+
const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
|
|
255
|
+
const svg = (0, svg_1.generateSVG)(doc, 'cutlist');
|
|
256
|
+
assert.ok(svg.includes('stroke-dasharray'));
|
|
257
|
+
});
|
|
258
|
+
(0, node_test_1.it)('should accept options', () => {
|
|
259
|
+
const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
|
|
260
|
+
const svg = (0, svg_1.generateSVG)(doc, 'parts', { colorScheme: 'blueprint' });
|
|
261
|
+
assert.ok(svg.includes('#1a365d'));
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
(0, node_test_1.describe)('generatePartSVG', () => {
|
|
265
|
+
(0, node_test_1.it)('should generate SVG for a single part', () => {
|
|
266
|
+
const part = makeResolvedPart('single', 24, 12, 0.75);
|
|
267
|
+
const svg = (0, svg_1.generatePartSVG)(part);
|
|
268
|
+
assert.ok(svg.includes('<svg'));
|
|
269
|
+
assert.ok(svg.includes('data-id="single"'));
|
|
270
|
+
});
|
|
271
|
+
(0, node_test_1.it)('should respect options', () => {
|
|
272
|
+
const part = makeResolvedPart('single', 24, 12, 0.75);
|
|
273
|
+
const svg = (0, svg_1.generatePartSVG)(part, { showDimensions: false, showNames: false });
|
|
274
|
+
// Should still generate valid SVG
|
|
275
|
+
assert.ok(svg.includes('<svg'));
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
// ============================================
|
|
279
|
+
// XML ESCAPING TESTS
|
|
280
|
+
// ============================================
|
|
281
|
+
(0, node_test_1.describe)('XML escaping', () => {
|
|
282
|
+
(0, node_test_1.it)('should escape special characters in part names', () => {
|
|
283
|
+
const generator = new svg_1.SVGGenerator();
|
|
284
|
+
const part = makeResolvedPart('test', 12, 6, 0.5, 1, 'Part <A> & "B"');
|
|
285
|
+
const doc = makeDocument([part]);
|
|
286
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
287
|
+
assert.ok(svg.includes('<'));
|
|
288
|
+
assert.ok(svg.includes('>'));
|
|
289
|
+
assert.ok(svg.includes('&'));
|
|
290
|
+
assert.ok(svg.includes('"'));
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
// ============================================
|
|
294
|
+
// DIMENSION RENDERING TESTS
|
|
295
|
+
// ============================================
|
|
296
|
+
(0, node_test_1.describe)('dimension rendering', () => {
|
|
297
|
+
(0, node_test_1.it)('should render horizontal dimensions with arrows', () => {
|
|
298
|
+
const generator = new svg_1.SVGGenerator({ showDimensions: true });
|
|
299
|
+
const doc = makeDocument([makeResolvedPart('part', 20, 10, 0.5)]);
|
|
300
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
301
|
+
assert.ok(svg.includes('class="dimension dimension-h"'));
|
|
302
|
+
assert.ok(svg.includes('<polygon')); // Arrow heads
|
|
303
|
+
});
|
|
304
|
+
(0, node_test_1.it)('should render vertical dimensions', () => {
|
|
305
|
+
const generator = new svg_1.SVGGenerator({ showDimensions: true });
|
|
306
|
+
const doc = makeDocument([makeResolvedPart('part', 20, 10, 0.5)]);
|
|
307
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
308
|
+
assert.ok(svg.includes('class="dimension dimension-v"'));
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
// ============================================
|
|
312
|
+
// VIEWBOX AND SIZE TESTS
|
|
313
|
+
// ============================================
|
|
314
|
+
(0, node_test_1.describe)('SVG size and viewBox', () => {
|
|
315
|
+
(0, node_test_1.it)('should set correct width and height', () => {
|
|
316
|
+
const generator = new svg_1.SVGGenerator({ width: 1000, height: 700 });
|
|
317
|
+
const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
|
|
318
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
319
|
+
assert.ok(svg.includes('width="1000"'));
|
|
320
|
+
assert.ok(svg.includes('height="700"'));
|
|
321
|
+
assert.ok(svg.includes('viewBox="0 0 1000 700"'));
|
|
322
|
+
});
|
|
323
|
+
(0, node_test_1.it)('should include CSS styles in defs', () => {
|
|
324
|
+
const generator = new svg_1.SVGGenerator();
|
|
325
|
+
const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
|
|
326
|
+
const svg = generator.generatePartsDiagram(doc);
|
|
327
|
+
assert.ok(svg.includes('<defs>'));
|
|
328
|
+
assert.ok(svg.includes('<style>'));
|
|
329
|
+
assert.ok(svg.includes('</style>'));
|
|
330
|
+
assert.ok(svg.includes('</defs>'));
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
//# sourceMappingURL=svg.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.test.js","sourceRoot":"","sources":["../src/svg.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WoodML Template System
|
|
3
|
+
* Handles parametric template parsing and instantiation
|
|
4
|
+
*/
|
|
5
|
+
import { Part, UnitSystem, Joint } from './types';
|
|
6
|
+
export type ParamType = 'dimension' | 'number' | 'string' | 'boolean' | 'material_ref' | 'part_ref' | 'enum';
|
|
7
|
+
export interface TemplateParam {
|
|
8
|
+
type: ParamType;
|
|
9
|
+
description?: string;
|
|
10
|
+
optional?: boolean;
|
|
11
|
+
min?: string | number;
|
|
12
|
+
max?: string | number;
|
|
13
|
+
values?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface TemplateDefinition {
|
|
16
|
+
name: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
version?: string;
|
|
19
|
+
author?: string;
|
|
20
|
+
params: Record<string, ParamType | TemplateParam>;
|
|
21
|
+
defaults?: Record<string, string | number | boolean>;
|
|
22
|
+
computed?: Record<string, string>;
|
|
23
|
+
parts: TemplatePart[];
|
|
24
|
+
joinery?: TemplateJoint[];
|
|
25
|
+
}
|
|
26
|
+
export interface TemplatePart {
|
|
27
|
+
id: string;
|
|
28
|
+
name?: string;
|
|
29
|
+
material?: string;
|
|
30
|
+
dimensions?: {
|
|
31
|
+
length?: string;
|
|
32
|
+
width?: string;
|
|
33
|
+
depth?: string;
|
|
34
|
+
thickness?: string;
|
|
35
|
+
};
|
|
36
|
+
quantity?: number | string;
|
|
37
|
+
grain?: 'long' | 'short' | 'any';
|
|
38
|
+
notes?: string;
|
|
39
|
+
repeat?: number | string;
|
|
40
|
+
as?: string;
|
|
41
|
+
use?: string;
|
|
42
|
+
params?: Record<string, string | number | boolean>;
|
|
43
|
+
}
|
|
44
|
+
export interface TemplateJoint {
|
|
45
|
+
type: string;
|
|
46
|
+
parts?: string[];
|
|
47
|
+
housing?: string;
|
|
48
|
+
insert?: string;
|
|
49
|
+
tails?: string;
|
|
50
|
+
pins?: string;
|
|
51
|
+
ratio?: string;
|
|
52
|
+
depth?: string;
|
|
53
|
+
position?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface TemplateInstance {
|
|
56
|
+
use: string;
|
|
57
|
+
id: string;
|
|
58
|
+
params: Record<string, string | number | boolean>;
|
|
59
|
+
}
|
|
60
|
+
export interface InstantiatedTemplate {
|
|
61
|
+
parts: Part[];
|
|
62
|
+
joinery: Joint[];
|
|
63
|
+
}
|
|
64
|
+
export declare class TemplateParser {
|
|
65
|
+
private templates;
|
|
66
|
+
private defaultUnit;
|
|
67
|
+
constructor(defaultUnit?: UnitSystem);
|
|
68
|
+
/**
|
|
69
|
+
* Register a template definition
|
|
70
|
+
*/
|
|
71
|
+
registerTemplate(template: TemplateDefinition): void;
|
|
72
|
+
/**
|
|
73
|
+
* Parse a template definition from raw data
|
|
74
|
+
*/
|
|
75
|
+
parseTemplateDefinition(data: Record<string, unknown>): TemplateDefinition;
|
|
76
|
+
/**
|
|
77
|
+
* Validate template instance parameters
|
|
78
|
+
*/
|
|
79
|
+
validateParams(template: TemplateDefinition, providedParams: Record<string, string | number | boolean>): string[];
|
|
80
|
+
/**
|
|
81
|
+
* Instantiate a template with given parameters
|
|
82
|
+
*/
|
|
83
|
+
instantiate(templateName: string, instanceId: string, params: Record<string, string | number | boolean>, materials?: Record<string, string>): InstantiatedTemplate;
|
|
84
|
+
/**
|
|
85
|
+
* Process a nested template reference
|
|
86
|
+
*/
|
|
87
|
+
private processNestedTemplate;
|
|
88
|
+
/**
|
|
89
|
+
* Process a single template part into a Part
|
|
90
|
+
* Returns array for nested templates (which may produce multiple parts)
|
|
91
|
+
*/
|
|
92
|
+
private processTemplatePart;
|
|
93
|
+
/**
|
|
94
|
+
* Process a template joint into a Joint
|
|
95
|
+
*/
|
|
96
|
+
private processTemplateJoint;
|
|
97
|
+
/**
|
|
98
|
+
* Substitute ${param} references in a string
|
|
99
|
+
*/
|
|
100
|
+
private substituteParams;
|
|
101
|
+
/**
|
|
102
|
+
* Evaluate an expression to a number
|
|
103
|
+
*/
|
|
104
|
+
private evaluateNumber;
|
|
105
|
+
/**
|
|
106
|
+
* Get numeric value from a param value for constraint comparison
|
|
107
|
+
*/
|
|
108
|
+
private getNumericValue;
|
|
109
|
+
/**
|
|
110
|
+
* Get a registered template
|
|
111
|
+
*/
|
|
112
|
+
getTemplate(name: string): TemplateDefinition | undefined;
|
|
113
|
+
/**
|
|
114
|
+
* List all registered templates
|
|
115
|
+
*/
|
|
116
|
+
listTemplates(): string[];
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Parse template from YAML string
|
|
120
|
+
*/
|
|
121
|
+
export declare function parseTemplate(yaml: string, parser: TemplateParser): TemplateDefinition;
|
|
122
|
+
/**
|
|
123
|
+
* Create a new template parser
|
|
124
|
+
*/
|
|
125
|
+
export declare function createTemplateParser(defaultUnit?: UnitSystem): TemplateParser;
|
|
126
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|