@ifc-lite/bcf 2.0.1 → 3.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.
@@ -2,6 +2,7 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { generateUuid } from '@ifc-lite/encoding';
5
+ import { DEFAULT_ASPECT_RATIO, computeCameraFromBounds, requireAspectRatioOption, requireCamerasForVersion, unionBoundsForEveryKey, } from './ids-camera.js';
5
6
  // ============================================================================
6
7
  // Internal BCF helpers (avoiding index.js import to prevent jszip dependency)
7
8
  // ============================================================================
@@ -68,7 +69,10 @@ const MAX_COMMENTS_PER_TOPIC = 50;
68
69
  * @returns BCF project ready for writeBCF()
69
70
  */
70
71
  export function createBCFFromIDSReport(report, options = {}) {
71
- const { author = DEFAULT_AUTHOR, projectName, version = '2.1', topicGrouping = 'per-entity', includePassingEntities = false, failureTopicType = DEFAULT_FAILURE_TOPIC_TYPE, passTopicType = DEFAULT_PASS_TOPIC_TYPE, maxTopics = DEFAULT_MAX_TOPICS, failureColor = DEFAULT_FAILURE_COLOR, entityBounds, entitySnapshots, } = options;
72
+ const { author = DEFAULT_AUTHOR, projectName, version = '2.1', topicGrouping = 'per-entity', includePassingEntities = false, failureTopicType = DEFAULT_FAILURE_TOPIC_TYPE, passTopicType = DEFAULT_PASS_TOPIC_TYPE, maxTopics = DEFAULT_MAX_TOPICS, failureColor = DEFAULT_FAILURE_COLOR, aspectRatio: requestedAspectRatio = DEFAULT_ASPECT_RATIO, entityBounds, entitySnapshots, } = options;
73
+ // Checked here, where the caller set it, rather than left to writeBCF --
74
+ // which can only name a viewpoint GUID this file generated (#3849).
75
+ const aspectRatio = requireAspectRatioOption(requestedAspectRatio);
72
76
  const project = createProject(projectName ?? report.title, version);
73
77
  switch (topicGrouping) {
74
78
  case 'per-entity':
@@ -79,6 +83,7 @@ export function createBCFFromIDSReport(report, options = {}) {
79
83
  passTopicType,
80
84
  maxTopics,
81
85
  failureColor,
86
+ aspectRatio,
82
87
  entityBounds,
83
88
  entitySnapshots,
84
89
  });
@@ -89,6 +94,7 @@ export function createBCFFromIDSReport(report, options = {}) {
89
94
  failureTopicType,
90
95
  maxTopics,
91
96
  failureColor,
97
+ aspectRatio,
92
98
  entityBounds,
93
99
  entitySnapshots,
94
100
  });
@@ -99,11 +105,15 @@ export function createBCFFromIDSReport(report, options = {}) {
99
105
  failureTopicType,
100
106
  maxTopics,
101
107
  failureColor,
108
+ aspectRatio,
102
109
  entityBounds,
103
110
  entitySnapshots,
104
111
  });
105
112
  break;
106
113
  }
114
+ // Refuse an unwritable 3.0 project here, where the caller can still see
115
+ // which option produced it, rather than leaving it to writeBCF (#3849).
116
+ requireCamerasForVersion(project);
107
117
  return project;
108
118
  }
109
119
  /**
@@ -146,6 +156,13 @@ function addTruncationNoticeTopic(project, author, remaining, itemLabel) {
146
156
  });
147
157
  project.topics.set(topic.guid, topic);
148
158
  }
159
+ // ============================================================================
160
+ // Per-entity grouping (default — recommended)
161
+ // ============================================================================
162
+ /** How `entityBounds` and `entitySnapshots` are keyed. */
163
+ function boundsKeyOf(entity) {
164
+ return `${entity.modelId}:${entity.expressId}`;
165
+ }
149
166
  function buildTopicsPerEntity(project, report, opts) {
150
167
  let topicCount = 0;
151
168
  let qualifyingCount = 0;
@@ -189,10 +206,10 @@ function buildTopicsPerEntity(project, report, opts) {
189
206
  // Viewpoint MUST be created first so comments can reference it via viewpointGuid
190
207
  let viewpointGuid;
191
208
  if (entity.globalId) {
192
- const boundsKey = `${entity.modelId}:${entity.expressId}`;
209
+ const boundsKey = boundsKeyOf(entity);
193
210
  const bounds = opts.entityBounds?.get(boundsKey);
194
211
  const snapshot = opts.entitySnapshots?.get(boundsKey);
195
- const viewpoint = buildEntityViewpoint(entity.globalId, isFailed ? opts.failureColor : undefined, bounds, snapshot);
212
+ const viewpoint = buildEntityViewpoint(entity.globalId, isFailed ? opts.failureColor : undefined, bounds, opts.aspectRatio, snapshot);
196
213
  topic.viewpoints.push(viewpoint);
197
214
  viewpointGuid = viewpoint.guid;
198
215
  }
@@ -239,7 +256,7 @@ function buildTopicsPerSpecification(project, report, opts) {
239
256
  .filter((g) => g !== undefined);
240
257
  let viewpointGuid;
241
258
  if (failedGuids.length > 0) {
242
- const viewpoint = buildMultiEntityViewpoint(failedGuids, opts.failureColor);
259
+ const viewpoint = buildMultiEntityViewpoint(failedGuids, opts.failureColor, unionBoundsForEveryKey(failedEntities.map(boundsKeyOf), opts.entityBounds), opts.aspectRatio);
243
260
  topic.viewpoints.push(viewpoint);
244
261
  viewpointGuid = viewpoint.guid;
245
262
  }
@@ -313,10 +330,10 @@ function buildTopicsPerRequirement(project, report, opts) {
313
330
  // Viewpoint for single entity (must be first for comment linking)
314
331
  let viewpointGuid;
315
332
  if (entity.globalId) {
316
- const boundsKey = `${entity.modelId}:${entity.expressId}`;
333
+ const boundsKey = boundsKeyOf(entity);
317
334
  const bounds = opts.entityBounds?.get(boundsKey);
318
335
  const snapshot = opts.entitySnapshots?.get(boundsKey);
319
- const viewpoint = buildEntityViewpoint(entity.globalId, opts.failureColor, bounds, snapshot);
336
+ const viewpoint = buildEntityViewpoint(entity.globalId, opts.failureColor, bounds, opts.aspectRatio, snapshot);
320
337
  topic.viewpoints.push(viewpoint);
321
338
  viewpointGuid = viewpoint.guid;
322
339
  }
@@ -387,61 +404,6 @@ function buildRequirementComment(req) {
387
404
  return lines.join('\n');
388
405
  }
389
406
  // ============================================================================
390
- // Helpers — Camera computation
391
- // ============================================================================
392
- /**
393
- * Compute a BCF perspective camera from entity bounds.
394
- *
395
- * Bounds are in viewer coordinates (Y-up).
396
- * BCF uses Z-up, so we convert:
397
- * BCF.x = Viewer.x
398
- * BCF.y = -Viewer.z
399
- * BCF.z = Viewer.y
400
- *
401
- * Camera is placed at a southeast-isometric angle from the entity center,
402
- * at a distance that frames the entity's bounding box with padding.
403
- */
404
- function computeCameraFromBounds(bounds) {
405
- // Center in viewer coords (Y-up)
406
- const cx = (bounds.min.x + bounds.max.x) / 2;
407
- const cy = (bounds.min.y + bounds.max.y) / 2;
408
- const cz = (bounds.min.z + bounds.max.z) / 2;
409
- // Max extent for framing distance
410
- const sx = bounds.max.x - bounds.min.x;
411
- const sy = bounds.max.y - bounds.min.y;
412
- const sz = bounds.max.z - bounds.min.z;
413
- const maxSize = Math.max(sx, sy, sz, 0.1); // Floor to avoid zero
414
- // Camera distance: fit maxSize into 60deg FOV with 1.5x padding
415
- const fovRad = (60 * Math.PI) / 180;
416
- const distance = (maxSize / 2) / Math.tan(fovRad / 2) * 1.5;
417
- // Southeast-isometric offset in viewer coords (Y-up):
418
- // camera position = center + normalized(0.6, 0.5, 0.6) * distance
419
- const offsetLen = Math.sqrt(0.6 * 0.6 + 0.5 * 0.5 + 0.6 * 0.6);
420
- const ox = (0.6 / offsetLen) * distance;
421
- const oy = (0.5 / offsetLen) * distance;
422
- const oz = (0.6 / offsetLen) * distance;
423
- const camX = cx + ox;
424
- const camY = cy + oy;
425
- const camZ = cz + oz;
426
- // Direction: from camera to center (viewer coords)
427
- const dx = cx - camX;
428
- const dy = cy - camY;
429
- const dz = cz - camZ;
430
- const dLen = Math.sqrt(dx * dx + dy * dy + dz * dz);
431
- // Convert to BCF coords (Z-up)
432
- // Viewer (x, y, z) → BCF (x, -z, y)
433
- return {
434
- cameraViewPoint: { x: camX, y: -camZ, z: camY },
435
- cameraDirection: {
436
- x: dx / dLen,
437
- y: -dz / dLen,
438
- z: dy / dLen,
439
- },
440
- cameraUpVector: { x: 0, y: 0, z: 1 }, // BCF Z-up
441
- fieldOfView: 60,
442
- };
443
- }
444
- // ============================================================================
445
407
  // Helpers — Viewpoint builders
446
408
  // ============================================================================
447
409
  /**
@@ -449,7 +411,7 @@ function computeCameraFromBounds(bounds) {
449
411
  * Optionally includes a perspective camera computed from entity bounds,
450
412
  * and a snapshot image if provided.
451
413
  */
452
- function buildEntityViewpoint(globalId, failureColor, bounds, snapshot) {
414
+ function buildEntityViewpoint(globalId, failureColor, bounds, aspectRatio, snapshot) {
453
415
  // Create independent component objects to prevent mutation side effects
454
416
  const viewpoint = {
455
417
  guid: generateUuid(),
@@ -471,7 +433,7 @@ function buildEntityViewpoint(globalId, failureColor, bounds, snapshot) {
471
433
  }
472
434
  // Compute camera from bounds (viewer Y-up → BCF Z-up)
473
435
  if (bounds) {
474
- viewpoint.perspectiveCamera = computeCameraFromBounds(bounds);
436
+ viewpoint.perspectiveCamera = computeCameraFromBounds(bounds, aspectRatio);
475
437
  }
476
438
  // Attach snapshot
477
439
  if (snapshot) {
@@ -482,8 +444,11 @@ function buildEntityViewpoint(globalId, failureColor, bounds, snapshot) {
482
444
  /**
483
445
  * Build a viewpoint for multiple entities: all selected and visible, colored.
484
446
  * Used by per-specification grouping where one topic covers many entities.
447
+ *
448
+ * `bounds` is the union of the entities' boxes (see `unionBounds`), so the
449
+ * camera frames the whole failing set rather than whichever entity came first.
485
450
  */
486
- function buildMultiEntityViewpoint(globalIds, failureColor) {
451
+ function buildMultiEntityViewpoint(globalIds, failureColor, bounds, aspectRatio) {
487
452
  // Use independent arrays per field to prevent mutation side effects
488
453
  const viewpoint = {
489
454
  guid: generateUuid(),
@@ -503,6 +468,9 @@ function buildMultiEntityViewpoint(globalIds, failureColor) {
503
468
  },
504
469
  ];
505
470
  }
471
+ if (bounds) {
472
+ viewpoint.perspectiveCamera = computeCameraFromBounds(bounds, aspectRatio);
473
+ }
506
474
  return viewpoint;
507
475
  }
508
476
  //# sourceMappingURL=ids-reporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ids-reporter.js","sourceRoot":"","sources":["../src/ids-reporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ids-reporter.js","sourceRoot":"","sources":["../src/ids-reporter.ts"],"names":[],"mappings":"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"}
@@ -11,5 +11,5 @@ import type { BCFComponents } from './types.js';
11
11
  /**
12
12
  * Parse components (selection/visibility/coloring)
13
13
  */
14
- export declare function parseComponents(content: string): BCFComponents | undefined;
14
+ export declare function parseComponents(content: string, versionId: '2.1' | '3.0'): BCFComponents | undefined;
15
15
  //# sourceMappingURL=reader-components.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reader-components.d.ts","sourceRoot":"","sources":["../src/reader-components.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAGV,aAAa,EAGd,MAAM,YAAY,CAAC;AA+BpB;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAyC1E"}
1
+ {"version":3,"file":"reader-components.d.ts","sourceRoot":"","sources":["../src/reader-components.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAGV,aAAa,EAGd,MAAM,YAAY,CAAC;AA+BpB;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,KAAK,GAAG,KAAK,GACvB,aAAa,GAAG,SAAS,CA6C3B"}
@@ -1,7 +1,7 @@
1
1
  /* This Source Code Form is subject to the terms of the Mozilla Public
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
- import { extractElement, unescapeXml } from './xml-text.js';
4
+ import { extractElement, parseXsBoolean, unescapeXml } from './xml-text.js';
5
5
  /**
6
6
  * Every `<Component>` element in an XML fragment.
7
7
  *
@@ -32,7 +32,7 @@ function parseComponentElements(xml) {
32
32
  /**
33
33
  * Parse components (selection/visibility/coloring)
34
34
  */
35
- export function parseComponents(content) {
35
+ export function parseComponents(content, versionId) {
36
36
  const componentsMatch = content.match(/<Components>([\s\S]*?)<\/Components>/);
37
37
  if (!componentsMatch)
38
38
  return undefined;
@@ -40,7 +40,7 @@ export function parseComponents(content) {
40
40
  // Parse selection
41
41
  const selection = parseComponentList(componentsContent, 'Selection');
42
42
  // Parse visibility
43
- let visibility = parseVisibility(componentsContent);
43
+ let visibility = parseVisibility(componentsContent, versionId);
44
44
  // Parse coloring
45
45
  const coloring = parseColoring(componentsContent);
46
46
  // Nothing read `ViewSetupHints` back, so every hint was lost on read —
@@ -55,9 +55,13 @@ export function parseComponents(content) {
55
55
  // read half the files we produce.
56
56
  const viewSetupHints = parseViewSetupHints(componentsContent);
57
57
  if (viewSetupHints) {
58
- // Visibility is required by the schema, but tolerate a file that omits it:
59
- // DefaultVisibility's schema default is true.
60
- visibility = { ...(visibility ?? { defaultVisibility: true }), viewSetupHints };
58
+ // Visibility is required by the schema, but tolerate a file that omits
59
+ // it entirely: fall back to the same per-version DefaultVisibility
60
+ // default used below when the attribute itself is present-but-omitted.
61
+ visibility = {
62
+ ...(visibility ?? { defaultVisibility: defaultVisibilityFallback(versionId) }),
63
+ viewSetupHints,
64
+ };
61
65
  }
62
66
  if (!selection && !visibility && !coloring) {
63
67
  return undefined;
@@ -128,10 +132,29 @@ function parseComponent(content) {
128
132
  originatingSystem,
129
133
  };
130
134
  }
135
+ /**
136
+ * The `DefaultVisibility` attribute's value when a `<Visibility>` element
137
+ * omits it entirely.
138
+ *
139
+ * visinfo.xsd disagrees by version: 2.1 declares
140
+ * `<xs:attribute name="DefaultVisibility" type="xs:boolean"/>` with no
141
+ * schema default, while 3.0 changes this to
142
+ * `<xs:attribute name="DefaultVisibility" type="xs:boolean" default="false"/>`.
143
+ * Per XML Schema attribute defaulting, an omitted attribute with a declared
144
+ * default takes that default, so a spec-legal 3.0 file that omits it means
145
+ * "hide everything except the listed exceptions". ifc-lite's own writer
146
+ * always emits the attribute explicitly (writeVisibility in writer.ts), so
147
+ * this only matters for a third-party file -- which is why no round-trip
148
+ * fixture caught the reader treating every omission as `true` regardless of
149
+ * version.
150
+ */
151
+ function defaultVisibilityFallback(versionId) {
152
+ return versionId !== '3.0';
153
+ }
131
154
  /**
132
155
  * Parse visibility settings
133
156
  */
134
- function parseVisibility(content) {
157
+ function parseVisibility(content, versionId) {
135
158
  // Both branches, for the same reason as `COMPONENT_ELEMENT`: `<Exceptions>`
136
159
  // and `<ViewSetupHints>` are optional, so `<Visibility DefaultVisibility=
137
160
  // "false"/>` is schema-legal. Matching only the paired form made the whole
@@ -146,7 +169,18 @@ function parseVisibility(content) {
146
169
  // `<Selection>` component, say) won the match and inverted the answer, so a
147
170
  // file saying show-all hid everything.
148
171
  const defaultVisMatch = visibilityMatch[0].match(/DefaultVisibility="([^"]+)"/);
149
- const defaultVisibility = defaultVisMatch?.[1] !== 'false';
172
+ // A whitespace-only value collapses to '' under xs:boolean's whiteSpace=
173
+ // collapse, which is not in the {true, false, 1, 0} lexical space at all --
174
+ // the same as the attribute being absent -- so both fall back to the
175
+ // per-version default via parseXsBoolean's caller-owns-absent contract,
176
+ // rather than surviving into parseXsBoolean's unrecognized-value branch.
177
+ // An unrecognized but non-blank value (e.g. "yes") leans true here: this
178
+ // site's existing behavior for garbage input, preserved via
179
+ // `ifUnrecognized: true`.
180
+ const rawDefaultVis = defaultVisMatch?.[1].trim();
181
+ const defaultVisibility = rawDefaultVis !== undefined && rawDefaultVis !== ''
182
+ ? parseXsBoolean(rawDefaultVis, { ifUnrecognized: true })
183
+ : defaultVisibilityFallback(versionId);
150
184
  const exceptions = parseComponentList(visibilityMatch[0], 'Exceptions');
151
185
  return {
152
186
  defaultVisibility,
@@ -185,9 +219,14 @@ function parseViewSetupHints(content) {
185
219
  const attrs = match[1];
186
220
  const flag = (name) => {
187
221
  const raw = attrs.match(new RegExp(`\\b${name}="([^"]*)"`))?.[1];
188
- if (raw === undefined)
222
+ // Blank (whitespace-only, or empty) is treated the same as absent -- see
223
+ // parseXsBoolean's absent-vs-blank note -- so both stay `undefined` here
224
+ // rather than reading as false. Unrecognized-but-non-blank content also
225
+ // leans false: unlike DefaultVisibility, an unset hint should not be
226
+ // read as an emphatic "show it".
227
+ if (raw === undefined || raw.trim() === '')
189
228
  return undefined;
190
- return raw === 'true' || raw === '1';
229
+ return parseXsBoolean(raw, { ifUnrecognized: false });
191
230
  };
192
231
  const spacesVisible = flag('SpacesVisible');
193
232
  const spaceBoundariesVisible = flag('SpaceBoundariesVisible');
@@ -1 +1 @@
1
- {"version":3,"file":"reader-components.js","sourceRoot":"","sources":["../src/reader-components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reader-components.js","sourceRoot":"","sources":["../src/reader-components.ts"],"names":[],"mappings":"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"}
package/dist/reader.js CHANGED
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import JSZip from 'jszip';
10
10
  import { parseComponents } from './reader-components.js';
11
- import { extractElement, unescapeXml } from './xml-text.js';
11
+ import { extractElement, unescapeXml, parseLabels, parseXsBoolean } from './xml-text.js';
12
12
  import { parseFiniteFloat } from './numeric.js';
13
13
  /**
14
14
  * Resource caps guarding against a malicious (zip-bomb) .bcfzip: a tiny
@@ -138,7 +138,7 @@ export async function readBCF(file, limits) {
138
138
  // Read project file (optional)
139
139
  const { projectId, name, extensions } = await readProjectFile(zip, budget);
140
140
  // Read topics
141
- const topics = await readTopics(zip, budget);
141
+ const topics = await readTopics(zip, budget, version.versionId);
142
142
  return {
143
143
  version: version.versionId,
144
144
  projectId,
@@ -178,21 +178,21 @@ async function readProjectFile(zip, budget) {
178
178
  return {};
179
179
  }
180
180
  const content = await readEntryCapped(projectFile, 'string', budget);
181
- const projectIdMatch = content.match(/ProjectId="([^"]+)"/);
181
+ const projectIdMatch = content.match(/ProjectId="([^"]+)"/); // unescaped below, same reason as extractElement underneath
182
182
  // extractElement, not a raw regex: writeProjectFile escapes the name with
183
183
  // escapeXml, so a raw match hands back the literal entities (`A &amp; B`) and
184
184
  // the next export escapes them again. Every other element in this reader goes
185
185
  // through extractElement precisely so the escape has an inverse.
186
186
  const name = extractElement(content, 'Name');
187
187
  return {
188
- projectId: projectIdMatch?.[1],
188
+ projectId: projectIdMatch?.[1] !== undefined ? unescapeXml(projectIdMatch[1]) : undefined,
189
189
  name,
190
190
  };
191
191
  }
192
192
  /**
193
193
  * Read all topics from the BCF archive
194
194
  */
195
- async function readTopics(zip, budget) {
195
+ async function readTopics(zip, budget, versionId) {
196
196
  const topics = new Map();
197
197
  // Find all topic folders (folders with markup.bcf)
198
198
  const topicFolders = new Set();
@@ -205,7 +205,7 @@ async function readTopics(zip, budget) {
205
205
  // Parse each topic
206
206
  for (const topicGuid of topicFolders) {
207
207
  try {
208
- const topic = await readTopic(zip, topicGuid, budget);
208
+ const topic = await readTopic(zip, topicGuid, budget, versionId);
209
209
  if (topic) {
210
210
  topics.set(topic.guid, topic);
211
211
  }
@@ -221,7 +221,7 @@ async function readTopics(zip, budget) {
221
221
  /**
222
222
  * Read a single topic from the BCF archive
223
223
  */
224
- async function readTopic(zip, topicFolder, budget) {
224
+ async function readTopic(zip, topicFolder, budget, versionId) {
225
225
  const markupFile = zip.file(`${topicFolder}/markup.bcf`);
226
226
  if (!markupFile) {
227
227
  return null;
@@ -253,19 +253,15 @@ async function readTopic(zip, topicFolder, budget) {
253
253
  const description = extractElement(topicContent, 'Description');
254
254
  const priority = extractElement(topicContent, 'Priority');
255
255
  const index = extractElement(topicContent, 'Index');
256
- const creationDate = extractElement(topicContent, 'CreationDate') || new Date().toISOString();
257
- const creationAuthor = extractElement(topicContent, 'CreationAuthor') || 'Unknown';
256
+ const creationDate = extractElement(topicContent, 'CreationDate'); // required no-default in markup.xsd; leave undefined, don't fabricate
257
+ const creationAuthor = extractElement(topicContent, 'CreationAuthor'); // same: required no-default, don't fabricate 'Unknown'
258
258
  const modifiedDate = extractElement(topicContent, 'ModifiedDate');
259
259
  const modifiedAuthor = extractElement(topicContent, 'ModifiedAuthor');
260
260
  const dueDate = extractElement(topicContent, 'DueDate');
261
261
  const assignedTo = extractElement(topicContent, 'AssignedTo');
262
262
  const stage = extractElement(topicContent, 'Stage');
263
- // Extract labels
264
- const labels = [];
265
- const labelMatches = topicContent.matchAll(/<Labels>([^<]+)<\/Labels>/g);
266
- for (const match of labelMatches) {
267
- labels.push(unescapeXml(match[1]));
268
- }
263
+ // Extract labels (tolerant of both BCF 2.1 and 3.0 markup.xsd shapes; see parseLabels)
264
+ const labels = parseLabels(topicContent);
269
265
  // Extract BIM snippet
270
266
  const bimSnippet = extractBimSnippet(topicContent);
271
267
  // Extract document references
@@ -281,7 +277,7 @@ async function readTopic(zip, topicFolder, budget) {
281
277
  // Parse comments
282
278
  const comments = parseComments(markupContent);
283
279
  // Parse viewpoints
284
- const viewpoints = await parseViewpoints(zip, topicFolder, markupContent, budget);
280
+ const viewpoints = await parseViewpoints(zip, topicFolder, markupContent, budget, versionId);
285
281
  return {
286
282
  guid,
287
283
  title,
@@ -325,12 +321,12 @@ function parseHeaderFiles(markupContent) {
325
321
  const ifcProject = attrs.match(/IfcProject="([^"]*)"/)?.[1];
326
322
  const ifcSpatial = attrs.match(/IfcSpatialStructureElement="([^"]*)"/)?.[1];
327
323
  // BCF 2.1 spells this `isExternal`, 3.0 `IsExternal`; accept either casing
328
- // (and the xs:boolean `1`/`0` forms a foreign tool may emit).
324
+ // and the xs:boolean `1`/`0` forms. Blank is absent, per parseXsBoolean.
329
325
  const isExternalRaw = attrs.match(/\b[Ii]sExternal="([^"]*)"/)?.[1];
330
326
  files.push({
331
327
  ifcProject: ifcProject || undefined,
332
328
  ifcSpatialStructureElement: ifcSpatial || undefined,
333
- isExternal: isExternalRaw === undefined ? undefined : (isExternalRaw === 'true' || isExternalRaw === '1'),
329
+ isExternal: isExternalRaw?.trim() ? parseXsBoolean(isExternalRaw, { ifUnrecognized: false }) : undefined,
334
330
  filename: extractElement(body, 'Filename'),
335
331
  date: extractElement(body, 'Date'),
336
332
  reference: extractElement(body, 'Reference'),
@@ -370,15 +366,15 @@ function extractBimSnippet(content) {
370
366
  if (!snippetType)
371
367
  return undefined;
372
368
  // BCF 2.1 spells this `isExternal`, 3.0 `IsExternal` (same rename as the
373
- // Header `<File>` attribute in reader.ts's parseHeaderFiles); accept either
374
- // casing so a spec-correct 3.0 file's flag isn't silently read as false, and
375
- // the xs:boolean `1`/`0` forms alongside `true`/`false`.
369
+ // Header `<File>` site above); accept either casing and `1`/`0`. Unlike
370
+ // that site, `isExternal` here is a required boolean, so absent and blank
371
+ // both resolve to `false`, not `undefined`.
376
372
  const isExternalRaw = match[1].match(/\b[Ii]sExternal="([^"]*)"/)?.[1];
377
373
  const reference = extractElement(match[2], 'Reference');
378
374
  const referenceSchema = extractElement(match[2], 'ReferenceSchema');
379
375
  return {
380
376
  snippetType,
381
- isExternal: isExternalRaw === 'true' || isExternalRaw === '1',
377
+ isExternal: isExternalRaw?.trim() ? parseXsBoolean(isExternalRaw, { ifUnrecognized: false }) : false,
382
378
  reference: reference || '',
383
379
  referenceSchema,
384
380
  };
@@ -402,7 +398,9 @@ function extractDocumentReferences(content) {
402
398
  const matches = content.matchAll(/<DocumentReference(?![A-Za-z])[^>]*>([\s\S]*?)<\/DocumentReference>/g);
403
399
  for (const match of matches) {
404
400
  const guidMatch = match[0].match(/Guid="([^"]+)"/);
405
- const isExternalMatch = match[0].match(/\bisExternal="([^"]+)"/);
401
+ // xs:boolean's lexical space is {true, false, 1, 0}; see isExternal above.
402
+ // Blank is absent, per parseXsBoolean (same as the header <File> site).
403
+ const isExternalRaw = match[0].match(/\bisExternal="([^"]*)"/)?.[1];
406
404
  const referencedDoc = extractElement(match[1], 'ReferencedDocument');
407
405
  const documentGuid = extractElement(match[1], 'DocumentGuid');
408
406
  const url = extractElement(match[1], 'Url');
@@ -410,7 +408,7 @@ function extractDocumentReferences(content) {
410
408
  if (referencedDoc || documentGuid || url) {
411
409
  refs.push({
412
410
  guid: guidMatch?.[1],
413
- isExternal: isExternalMatch ? isExternalMatch[1] === 'true' : undefined,
411
+ isExternal: isExternalRaw?.trim() ? parseXsBoolean(isExternalRaw, { ifUnrecognized: false }) : undefined,
414
412
  referencedDocument: referencedDoc,
415
413
  documentGuid,
416
414
  url,
@@ -459,8 +457,8 @@ function parseComments(markupContent) {
459
457
  if (close < 0)
460
458
  continue; // malformed: no wrapper closer, skip rather than throw
461
459
  const content = span.slice(0, close);
462
- const date = extractElement(content, 'Date') || new Date().toISOString();
463
- const author = extractElement(content, 'Author') || 'Unknown';
460
+ const date = extractElement(content, 'Date'); // don't fabricate; see CreationDate above
461
+ const author = extractElement(content, 'Author'); // same: required no-default, don't fabricate 'Unknown'
464
462
  const comment = extractElement(content, 'Comment') || '';
465
463
  const modifiedDate = extractElement(content, 'ModifiedDate');
466
464
  const modifiedAuthor = extractElement(content, 'ModifiedAuthor');
@@ -482,7 +480,7 @@ function parseComments(markupContent) {
482
480
  /**
483
481
  * Parse viewpoints from the BCF archive
484
482
  */
485
- async function parseViewpoints(zip, topicFolder, markupContent, budget) {
483
+ async function parseViewpoints(zip, topicFolder, markupContent, budget, versionId) {
486
484
  const viewpoints = [];
487
485
  // Parse viewpoint references from markup.bcf to get snapshot filenames.
488
486
  // The markup element is plural -- <Viewpoints Guid="xxx"><Viewpoint>file.bcfv</Viewpoint>
@@ -561,7 +559,7 @@ async function parseViewpoints(zip, topicFolder, markupContent, budget) {
561
559
  if (!viewpointFile)
562
560
  continue;
563
561
  const viewpointContent = await readEntryCapped(viewpointFile, 'string', budget);
564
- const viewpoint = parseViewpointContent(viewpointContent);
562
+ const viewpoint = parseViewpointContent(viewpointContent, versionId);
565
563
  if (viewpoint) {
566
564
  // Get snapshot filename from markup.bcf if available
567
565
  const viewpointInfo = viewpointInfoMap.get(viewpoint.guid);
@@ -642,7 +640,7 @@ async function parseViewpoints(zip, topicFolder, markupContent, budget) {
642
640
  /**
643
641
  * Parse viewpoint XML content
644
642
  */
645
- function parseViewpointContent(content) {
643
+ function parseViewpointContent(content, versionId) {
646
644
  // Extract viewpoint GUID from root element (Guid can be anywhere in the tag)
647
645
  const guidMatch = content.match(/<VisualizationInfo[^>]+Guid="([^"]+)"/);
648
646
  const guid = guidMatch?.[1] || crypto.randomUUID?.() || `vp-${Date.now()}`;
@@ -651,7 +649,7 @@ function parseViewpointContent(content) {
651
649
  // Parse orthogonal camera
652
650
  const orthogonalCamera = parseOrthogonalCamera(content);
653
651
  // Parse components
654
- const components = parseComponents(content);
652
+ const components = parseComponents(content, versionId);
655
653
  // Parse lines
656
654
  const lines = parseLines(content);
657
655
  // Parse clipping planes