@ifc-lite/parser 6.4.0 → 7.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.
Files changed (105) hide show
  1. package/README.md +21 -0
  2. package/dist/cost-category-buckets.d.ts +5 -0
  3. package/dist/cost-category-buckets.d.ts.map +1 -0
  4. package/dist/cost-category-buckets.js +37 -0
  5. package/dist/cost-category-buckets.js.map +1 -0
  6. package/dist/cost-compatibility-tree.d.ts +4 -0
  7. package/dist/cost-compatibility-tree.d.ts.map +1 -0
  8. package/dist/cost-compatibility-tree.js +46 -0
  9. package/dist/cost-compatibility-tree.js.map +1 -0
  10. package/dist/cost-evaluation-arithmetic.d.ts +16 -0
  11. package/dist/cost-evaluation-arithmetic.d.ts.map +1 -0
  12. package/dist/cost-evaluation-arithmetic.js +181 -0
  13. package/dist/cost-evaluation-arithmetic.js.map +1 -0
  14. package/dist/cost-evaluation-context.d.ts +20 -0
  15. package/dist/cost-evaluation-context.d.ts.map +1 -0
  16. package/dist/cost-evaluation-context.js +54 -0
  17. package/dist/cost-evaluation-context.js.map +1 -0
  18. package/dist/cost-evaluation-result.d.ts +5 -0
  19. package/dist/cost-evaluation-result.d.ts.map +1 -0
  20. package/dist/cost-evaluation-result.js +20 -0
  21. package/dist/cost-evaluation-result.js.map +1 -0
  22. package/dist/cost-evaluator.d.ts +6 -0
  23. package/dist/cost-evaluator.d.ts.map +1 -0
  24. package/dist/cost-evaluator.js +396 -0
  25. package/dist/cost-evaluator.js.map +1 -0
  26. package/dist/cost-extractor.d.ts +3 -8
  27. package/dist/cost-extractor.d.ts.map +1 -1
  28. package/dist/cost-extractor.js +330 -335
  29. package/dist/cost-extractor.js.map +1 -1
  30. package/dist/cost-quantities.d.ts +5 -0
  31. package/dist/cost-quantities.d.ts.map +1 -0
  32. package/dist/cost-quantities.js +116 -0
  33. package/dist/cost-quantities.js.map +1 -0
  34. package/dist/cost-quantity-evaluator.d.ts +23 -0
  35. package/dist/cost-quantity-evaluator.d.ts.map +1 -0
  36. package/dist/cost-quantity-evaluator.js +153 -0
  37. package/dist/cost-quantity-evaluator.js.map +1 -0
  38. package/dist/cost-reader.d.ts +26 -0
  39. package/dist/cost-reader.d.ts.map +1 -0
  40. package/dist/cost-reader.js +117 -0
  41. package/dist/cost-reader.js.map +1 -0
  42. package/dist/cost-relationships.d.ts +7 -0
  43. package/dist/cost-relationships.d.ts.map +1 -0
  44. package/dist/cost-relationships.js +237 -0
  45. package/dist/cost-relationships.js.map +1 -0
  46. package/dist/cost-step-lexemes.d.ts +16 -0
  47. package/dist/cost-step-lexemes.d.ts.map +1 -0
  48. package/dist/cost-step-lexemes.js +131 -0
  49. package/dist/cost-step-lexemes.js.map +1 -0
  50. package/dist/cost-types.d.ts +210 -76
  51. package/dist/cost-types.d.ts.map +1 -1
  52. package/dist/cost-units.d.ts +38 -0
  53. package/dist/cost-units.d.ts.map +1 -0
  54. package/dist/cost-units.js +348 -0
  55. package/dist/cost-units.js.map +1 -0
  56. package/dist/cost-value-evaluation-session.d.ts +19 -0
  57. package/dist/cost-value-evaluation-session.d.ts.map +1 -0
  58. package/dist/cost-value-evaluation-session.js +25 -0
  59. package/dist/cost-value-evaluation-session.js.map +1 -0
  60. package/dist/cost.d.ts +4 -0
  61. package/dist/cost.d.ts.map +1 -0
  62. package/dist/cost.js +6 -0
  63. package/dist/cost.js.map +1 -0
  64. package/dist/entity-extractor.d.ts.map +1 -1
  65. package/dist/entity-extractor.js +5 -2
  66. package/dist/entity-extractor.js.map +1 -1
  67. package/dist/index.d.ts +2 -3
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +3 -2
  70. package/dist/index.js.map +1 -1
  71. package/dist/relationship-schema-slots.d.ts.map +1 -1
  72. package/dist/relationship-schema-slots.js +36 -1
  73. package/dist/relationship-schema-slots.js.map +1 -1
  74. package/dist/schedule-calendar-types.d.ts +89 -0
  75. package/dist/schedule-calendar-types.d.ts.map +1 -0
  76. package/dist/schedule-calendar-types.js +175 -0
  77. package/dist/schedule-calendar-types.js.map +1 -0
  78. package/dist/schedule-control-extractor.d.ts +41 -0
  79. package/dist/schedule-control-extractor.d.ts.map +1 -0
  80. package/dist/schedule-control-extractor.js +91 -0
  81. package/dist/schedule-control-extractor.js.map +1 -0
  82. package/dist/schedule-extractor.d.ts +1 -0
  83. package/dist/schedule-extractor.d.ts.map +1 -1
  84. package/dist/schedule-extractor.js +51 -61
  85. package/dist/schedule-extractor.js.map +1 -1
  86. package/dist/schedule-serializer-calendar-builders.d.ts +50 -0
  87. package/dist/schedule-serializer-calendar-builders.d.ts.map +1 -0
  88. package/dist/schedule-serializer-calendar-builders.js +126 -0
  89. package/dist/schedule-serializer-calendar-builders.js.map +1 -0
  90. package/dist/schedule-serializer.d.ts +21 -3
  91. package/dist/schedule-serializer.d.ts.map +1 -1
  92. package/dist/schedule-serializer.js +56 -0
  93. package/dist/schedule-serializer.js.map +1 -1
  94. package/dist/schedule-types.d.ts +24 -0
  95. package/dist/schedule-types.d.ts.map +1 -1
  96. package/dist/schedule-types.js.map +1 -1
  97. package/dist/step-entity-parameters.d.ts +9 -0
  98. package/dist/step-entity-parameters.d.ts.map +1 -0
  99. package/dist/step-entity-parameters.js +30 -0
  100. package/dist/step-entity-parameters.js.map +1 -0
  101. package/package.json +4 -3
  102. package/dist/cost-schedule-2x3.d.ts +0 -31
  103. package/dist/cost-schedule-2x3.d.ts.map +0 -1
  104. package/dist/cost-schedule-2x3.js +0 -75
  105. package/dist/cost-schedule-2x3.js.map +0 -1
@@ -0,0 +1,237 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { asEnum, asRef, asRefList, asString } from './cost-reader.js';
5
+ import { getInheritanceChain } from './ifc-schema.js';
6
+ function base(expressId, Type, a) {
7
+ return { expressId, Type, GlobalId: asString(a[0]), Name: asString(a[2]), Description: asString(a[3]) };
8
+ }
9
+ function reference(reader, expressId, index, required = true) {
10
+ const value = reader.referenceLexeme(expressId, index);
11
+ return { value, invalid: value === undefined && (required || reader.attributePresent(expressId, index)) };
12
+ }
13
+ function references(reader, expressId, index, required = true) {
14
+ const value = reader.referenceListLexeme(expressId, index);
15
+ return { value: value ?? [], invalid: value === undefined && (required || reader.attributePresent(expressId, index)) };
16
+ }
17
+ function targetIs(reader, expressId, roots) {
18
+ const type = reader.typeOf(expressId);
19
+ if (type === undefined)
20
+ return false;
21
+ return getInheritanceChain(type).some(entry => roots.has(entry.toUpperCase()));
22
+ }
23
+ const OBJECT_DEFINITION_ROOT = new Set(['IFCOBJECTDEFINITION']);
24
+ const CONTROL_ROOT = new Set(['IFCCONTROL']);
25
+ const CONTEXT_ROOT = new Set(['IFCCONTEXT']);
26
+ const DEFINITION_SELECT_ROOTS = new Set(['IFCOBJECTDEFINITION', 'IFCPROPERTYDEFINITION']);
27
+ const PROCESS_ROOT = new Set(['IFCPROCESS']);
28
+ const PROCESS_SELECT_ROOTS = new Set(['IFCPROCESS', 'IFCTYPEPROCESS']);
29
+ const PRODUCT_ROOT = new Set(['IFCPRODUCT']);
30
+ const PRODUCT_SELECT_ROOTS = new Set([...PRODUCT_ROOT, 'IFCTYPEPRODUCT']);
31
+ const ROOT = new Set(['IFCROOT']);
32
+ const APPLIED_VALUE_ROOT = new Set(['IFCAPPLIEDVALUE']);
33
+ const COST_ITEM = new Set(['IFCCOSTITEM']);
34
+ const COST_SCHEDULE = new Set(['IFCCOSTSCHEDULE']);
35
+ /** Preserve every cost-relevant edge with its original relationship identity. */
36
+ export function extractCostRelationships(reader, itemIds, scheduleIds, valueIds) {
37
+ const result = [];
38
+ const assignedTasks = new Set();
39
+ for (const expressId of reader.ids('IFCRELASSIGNSTOCONTROL')) {
40
+ const a = reader.get(expressId)?.attributes ?? [];
41
+ const related = references(reader, expressId, 4);
42
+ const control = reference(reader, expressId, 6);
43
+ const candidates = asRefList(a[4]) ?? [];
44
+ const candidateControl = asRef(a[6]);
45
+ if (!itemIds.has(candidateControl ?? -1) && !scheduleIds.has(candidateControl ?? -1) &&
46
+ !candidates.some(id => itemIds.has(id)))
47
+ continue;
48
+ const InvalidReferences = related.invalid || control.invalid ||
49
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
50
+ (control.value !== undefined && !targetIs(reader, control.value, CONTROL_ROOT));
51
+ const RelatedObjects = related.value;
52
+ const RelatingControl = control.value;
53
+ result.push({ ...base(expressId, 'IfcRelAssignsToControl', a), RelatedObjects, RelatingControl,
54
+ InvalidReferences: InvalidReferences || undefined });
55
+ if (RelatingControl !== undefined && itemIds.has(RelatingControl)) {
56
+ for (const id of RelatedObjects)
57
+ if (reader.typeOf(id) === 'IFCTASK')
58
+ assignedTasks.add(id);
59
+ }
60
+ }
61
+ for (const expressId of reader.ids('IFCRELASSIGNSTOPRODUCT')) {
62
+ const a = reader.get(expressId)?.attributes ?? [];
63
+ const related = references(reader, expressId, 4);
64
+ const product = reference(reader, expressId, 6);
65
+ if ((asRefList(a[4]) ?? []).some(id => itemIds.has(id))) {
66
+ const InvalidReferences = related.invalid || product.invalid ||
67
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
68
+ (product.value !== undefined && !targetIs(reader, product.value, reader.schemaVersion === 'IFC2X3' ? PRODUCT_ROOT : PRODUCT_SELECT_ROOTS));
69
+ result.push({ ...base(expressId, 'IfcRelAssignsToProduct', a), RelatedObjects: related.value,
70
+ RelatingProduct: product.value, InvalidReferences: InvalidReferences || undefined });
71
+ }
72
+ }
73
+ for (const expressId of reader.ids('IFCRELNESTS')) {
74
+ const a = reader.get(expressId)?.attributes ?? [];
75
+ const parent = reference(reader, expressId, 4);
76
+ const related = references(reader, expressId, 5);
77
+ const RelatingObject = parent.value;
78
+ const RelatedObjects = related.value;
79
+ const candidateParent = asRef(a[4]);
80
+ const candidateRelated = asRefList(a[5]) ?? [];
81
+ const InvalidRelatedObjects = related.invalid;
82
+ if ((candidateParent !== undefined && itemIds.has(candidateParent)) || candidateRelated.some(id => itemIds.has(id))) {
83
+ result.push({ ...base(expressId, 'IfcRelNests', a), RelatingObject, RelatedObjects,
84
+ InvalidRelatedObjects: InvalidRelatedObjects || undefined,
85
+ InvalidReferences: (parent.invalid || related.invalid ||
86
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
87
+ (parent.value !== undefined && !targetIs(reader, parent.value, OBJECT_DEFINITION_ROOT))) || undefined });
88
+ }
89
+ }
90
+ for (const expressId of reader.ids('IFCRELDECLARES')) {
91
+ const a = reader.get(expressId)?.attributes ?? [];
92
+ const definitions = references(reader, expressId, 5);
93
+ const context = reference(reader, expressId, 4);
94
+ if ((asRefList(a[5]) ?? []).some(id => scheduleIds.has(id) || itemIds.has(id))) {
95
+ const InvalidReferences = definitions.invalid || context.invalid ||
96
+ definitions.value.some(id => !targetIs(reader, id, DEFINITION_SELECT_ROOTS)) ||
97
+ (context.value !== undefined && !targetIs(reader, context.value, CONTEXT_ROOT));
98
+ result.push({ ...base(expressId, 'IfcRelDeclares', a), RelatingContext: context.value,
99
+ RelatedDefinitions: definitions.value, InvalidReferences: InvalidReferences || undefined });
100
+ }
101
+ }
102
+ for (const expressId of reader.ids('IFCRELASSIGNSTOPROCESS')) {
103
+ const a = reader.get(expressId)?.attributes ?? [];
104
+ const related = references(reader, expressId, 4);
105
+ const process = reference(reader, expressId, 6);
106
+ const candidateProcess = asRef(a[6]);
107
+ if ((candidateProcess !== undefined && assignedTasks.has(candidateProcess)) ||
108
+ (asRefList(a[4]) ?? []).some(id => itemIds.has(id))) {
109
+ const InvalidReferences = related.invalid || process.invalid ||
110
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
111
+ (process.value !== undefined && !targetIs(reader, process.value, reader.schemaVersion === 'IFC2X3' ? PROCESS_ROOT : PROCESS_SELECT_ROOTS));
112
+ result.push({ ...base(expressId, 'IfcRelAssignsToProcess', a), RelatedObjects: related.value,
113
+ RelatingProcess: process.value, InvalidReferences: InvalidReferences || undefined });
114
+ }
115
+ }
116
+ for (const expressId of reader.ids('IFCRELASSOCIATESAPPLIEDVALUE')) {
117
+ const a = reader.get(expressId)?.attributes ?? [];
118
+ const related = references(reader, expressId, 4);
119
+ const applied = reference(reader, expressId, 5);
120
+ const candidateApplied = asRef(a[5]);
121
+ if ((asRefList(a[4]) ?? []).some(id => itemIds.has(id)) ||
122
+ (candidateApplied !== undefined && valueIds.has(candidateApplied))) {
123
+ const InvalidReferences = related.invalid || applied.invalid ||
124
+ related.value.some(id => !targetIs(reader, id, ROOT)) ||
125
+ (applied.value !== undefined && !targetIs(reader, applied.value, APPLIED_VALUE_ROOT));
126
+ result.push({ ...base(expressId, 'IfcRelAssociatesAppliedValue', a), RelatedObjects: related.value,
127
+ RelatingAppliedValue: applied.value, InvalidReferences: InvalidReferences || undefined });
128
+ }
129
+ }
130
+ for (const expressId of reader.ids('IFCRELSCHEDULESCOSTITEMS')) {
131
+ const a = reader.get(expressId)?.attributes ?? [];
132
+ const related = references(reader, expressId, 4);
133
+ const control = reference(reader, expressId, 6);
134
+ const InvalidReferences = related.invalid || control.invalid ||
135
+ related.value.some(id => !targetIs(reader, id, COST_ITEM)) ||
136
+ (control.value !== undefined && !targetIs(reader, control.value, COST_SCHEDULE));
137
+ result.push({ ...base(expressId, 'IfcRelSchedulesCostItems', a), RelatedObjects: related.value,
138
+ RelatingControl: control.value, InvalidReferences: InvalidReferences || undefined });
139
+ }
140
+ for (const expressId of reader.ids('IFCAPPLIEDVALUERELATIONSHIP')) {
141
+ const a = reader.get(expressId)?.attributes ?? [];
142
+ const total = reference(reader, expressId, 0);
143
+ const components = references(reader, expressId, 1);
144
+ result.push({
145
+ expressId, Type: 'IfcAppliedValueRelationship', ComponentOfTotal: total.value,
146
+ Components: components.value, ArithmeticOperator: asEnum(a[2]),
147
+ Name: asString(a[3]), Description: asString(a[4]),
148
+ InvalidReferences: (total.invalid || components.invalid ||
149
+ (total.value !== undefined && !targetIs(reader, total.value, APPLIED_VALUE_ROOT)) ||
150
+ components.value.some(id => !targetIs(reader, id, APPLIED_VALUE_ROOT))) || undefined,
151
+ });
152
+ }
153
+ return result;
154
+ }
155
+ /** Diagnose malformed nesting and value graphs without discarding them. */
156
+ export function diagnoseCostGraphs(relationships, values, itemIds, diagnostics) {
157
+ for (const relationship of relationships) {
158
+ if (relationship.InvalidReferences)
159
+ diagnostics.push({
160
+ Code: 'INVALID_LIST', Message: `${relationship.Type} #${relationship.expressId} contains an invalid endpoint`,
161
+ Severity: 'error', expressId: relationship.expressId,
162
+ });
163
+ }
164
+ const parents = new Map();
165
+ const children = new Map();
166
+ for (const rel of relationships) {
167
+ if (rel.Type !== 'IfcRelNests' || rel.RelatingObject === undefined || !itemIds.has(rel.RelatingObject))
168
+ continue;
169
+ if (rel.InvalidRelatedObjects)
170
+ diagnostics.push({
171
+ Code: 'INVALID_LIST', Message: `RelatedObjects on IfcRelNests #${rel.expressId} is malformed`,
172
+ Severity: 'error', expressId: rel.expressId,
173
+ });
174
+ const list = children.get(rel.RelatingObject) ?? [];
175
+ for (const child of rel.RelatedObjects ?? []) {
176
+ if (!itemIds.has(child))
177
+ continue;
178
+ const previous = parents.get(child);
179
+ if (previous !== undefined) {
180
+ diagnostics.push({ Code: 'MULTIPLE_NESTING_PARENTS', Message: `Cost item #${child} participates in multiple nesting relationships`, Severity: 'error', expressId: child, RelatedExpressId: rel.expressId });
181
+ }
182
+ else
183
+ parents.set(child, { parent: rel.RelatingObject, relationship: rel.expressId });
184
+ list.push(child);
185
+ }
186
+ children.set(rel.RelatingObject, list);
187
+ }
188
+ const valueMap = new Map();
189
+ for (const value of values)
190
+ if (value.expressId !== undefined)
191
+ valueMap.set(value.expressId, value);
192
+ const valueEdges = new Map();
193
+ for (const [id, value] of valueMap)
194
+ valueEdges.set(id, [...(value.Components ?? [])]);
195
+ for (const relationship of relationships) {
196
+ if (relationship.Type !== 'IfcAppliedValueRelationship' || relationship.ComponentOfTotal === undefined)
197
+ continue;
198
+ const edges = valueEdges.get(relationship.ComponentOfTotal) ?? [];
199
+ for (const component of relationship.Components ?? [])
200
+ edges.push(component);
201
+ valueEdges.set(relationship.ComponentOfTotal, edges);
202
+ }
203
+ diagnoseCycles(children, itemIds, 'NESTING_CYCLE', 'Cost item nesting', diagnostics);
204
+ diagnoseCycles(valueEdges, new Set(valueEdges.keys()), 'VALUE_CYCLE', 'IfcAppliedValue', diagnostics);
205
+ }
206
+ function diagnoseCycles(edges, nodes, Code, label, diagnostics) {
207
+ const state = new Map();
208
+ const reported = new Set();
209
+ for (const root of nodes) {
210
+ if (state.has(root))
211
+ continue;
212
+ const stack = [{ id: root, next: 0 }];
213
+ state.set(root, 1);
214
+ while (stack.length > 0) {
215
+ const frame = stack[stack.length - 1];
216
+ const adjacent = edges.get(frame.id) ?? [];
217
+ if (frame.next >= adjacent.length) {
218
+ state.set(frame.id, 2);
219
+ stack.pop();
220
+ continue;
221
+ }
222
+ const child = adjacent[frame.next++];
223
+ if (!nodes.has(child))
224
+ continue;
225
+ const childState = state.get(child);
226
+ if (childState === 1 && !reported.has(child)) {
227
+ diagnostics.push({ Code, Message: `${label} cycle includes #${child}`, Severity: 'error', expressId: child });
228
+ reported.add(child);
229
+ }
230
+ else if (childState === undefined) {
231
+ state.set(child, 1);
232
+ stack.push({ id: child, next: 0 });
233
+ }
234
+ }
235
+ }
236
+ }
237
+ //# sourceMappingURL=cost-relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-relationships.js","sourceRoot":"","sources":["../src/cost-relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function withoutStepComments(token: string): string;
2
+ /** Distinguish an omitted STEP attribute from malformed-but-present input. */
3
+ export declare function costAttributePresent(token: string | undefined): boolean;
4
+ /** Split one entity parameter list while retaining the original STEP lexemes. */
5
+ export declare function splitCostAttributeLexemes(record: string): string[];
6
+ /** Return the exact numeric token, unwrapping an IFC typed value when present. */
7
+ export declare function costNumericLexeme(token: string | undefined): string | undefined;
8
+ /** Return the EXPRESS wrapper around an exact numeric token, if one was supplied. */
9
+ export declare function costNumericTypeLexeme(token: string | undefined): string | undefined;
10
+ /** True only when the STEP significand is zero; exponent digits do not count. */
11
+ export declare function isZeroCostNumericLexeme(token: string): boolean;
12
+ /** Read one exact STEP entity-reference token, rejecting integer literals. */
13
+ export declare function costReferenceLexeme(token: string | undefined): number | undefined;
14
+ /** Read a flat non-empty aggregate of exact STEP entity-reference tokens. */
15
+ export declare function costReferenceListLexeme(token: string | undefined): number[] | undefined;
16
+ //# sourceMappingURL=cost-step-lexemes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-step-lexemes.d.ts","sourceRoot":"","sources":["../src/cost-step-lexemes.ts"],"names":[],"mappings":"AASA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBzD;AAID,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIvE;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA+ClE;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM/E;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAInF;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIjF;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAQvF"}
@@ -0,0 +1,131 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ const STEP_NUMBER = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?$/i;
5
+ const TYPED_VALUE = /^[A-Z][A-Z0-9_]*\s*\(([\s\S]*)\)$/i;
6
+ const STEP_REFERENCE = /^#(0|[1-9]\d*)$/;
7
+ const STEP_ZERO = /^[+-]?(?:0+(?:\.0*)?|\.0+)(?:E[+-]?\d+)?$/i;
8
+ export function withoutStepComments(token) {
9
+ const scan = new StepTextScan(token);
10
+ const pieces = [];
11
+ let retainedFrom = 0;
12
+ for (let index = 0; index < token.length;) {
13
+ const skipped = scan.skipLexicalAt(index);
14
+ if (skipped > index) {
15
+ if (token[index] === '/') {
16
+ pieces.push(token.slice(retainedFrom, index), ' ');
17
+ retainedFrom = skipped;
18
+ }
19
+ index = skipped;
20
+ continue;
21
+ }
22
+ index++;
23
+ }
24
+ pieces.push(token.slice(retainedFrom));
25
+ return pieces.join('').trim();
26
+ }
27
+ const withoutComments = withoutStepComments;
28
+ /** Distinguish an omitted STEP attribute from malformed-but-present input. */
29
+ export function costAttributePresent(token) {
30
+ if (token === undefined)
31
+ return false;
32
+ const candidate = withoutComments(token);
33
+ return candidate !== '$' && candidate !== '*';
34
+ }
35
+ /** Split one entity parameter list while retaining the original STEP lexemes. */
36
+ export function splitCostAttributeLexemes(record) {
37
+ let open = -1;
38
+ let close = -1;
39
+ let depth = 0;
40
+ const recordScan = new StepTextScan(record);
41
+ for (let index = 0; index < record.length;) {
42
+ const skipped = recordScan.skipLexicalAt(index);
43
+ if (skipped > index) {
44
+ index = skipped;
45
+ continue;
46
+ }
47
+ const char = record[index];
48
+ if (char === '(') {
49
+ if (open < 0)
50
+ open = index;
51
+ depth++;
52
+ }
53
+ else if (char === ')' && open >= 0) {
54
+ depth--;
55
+ if (depth === 0) {
56
+ close = index;
57
+ break;
58
+ }
59
+ }
60
+ index++;
61
+ }
62
+ if (open < 0 || close <= open)
63
+ return [];
64
+ const params = record.slice(open + 1, close);
65
+ const result = [];
66
+ let start = 0;
67
+ depth = 0;
68
+ const parameterScan = new StepTextScan(params);
69
+ for (let index = 0; index < params.length;) {
70
+ const skipped = parameterScan.skipLexicalAt(index);
71
+ if (skipped > index) {
72
+ index = skipped;
73
+ continue;
74
+ }
75
+ const char = params[index];
76
+ if (char === '(')
77
+ depth++;
78
+ else if (char === ')')
79
+ depth--;
80
+ else if (char === ',' && depth === 0) {
81
+ result.push(params.slice(start, index).trim());
82
+ start = index + 1;
83
+ }
84
+ index++;
85
+ }
86
+ result.push(params.slice(start).trim());
87
+ return result;
88
+ }
89
+ /** Return the exact numeric token, unwrapping an IFC typed value when present. */
90
+ export function costNumericLexeme(token) {
91
+ if (!token)
92
+ return undefined;
93
+ let candidate = withoutComments(token);
94
+ const typed = TYPED_VALUE.exec(candidate);
95
+ if (typed)
96
+ candidate = typed[1].trim();
97
+ return STEP_NUMBER.test(candidate) ? candidate : undefined;
98
+ }
99
+ /** Return the EXPRESS wrapper around an exact numeric token, if one was supplied. */
100
+ export function costNumericTypeLexeme(token) {
101
+ if (!token)
102
+ return undefined;
103
+ const typed = TYPED_VALUE.exec(withoutComments(token));
104
+ return typed ? withoutComments(token).slice(0, withoutComments(token).indexOf('(')).trim().toUpperCase() : undefined;
105
+ }
106
+ /** True only when the STEP significand is zero; exponent digits do not count. */
107
+ export function isZeroCostNumericLexeme(token) {
108
+ return STEP_ZERO.test(token);
109
+ }
110
+ /** Read one exact STEP entity-reference token, rejecting integer literals. */
111
+ export function costReferenceLexeme(token) {
112
+ if (!token)
113
+ return undefined;
114
+ const match = STEP_REFERENCE.exec(withoutComments(token));
115
+ return match ? Number(match[1]) : undefined;
116
+ }
117
+ /** Read a flat non-empty aggregate of exact STEP entity-reference tokens. */
118
+ export function costReferenceListLexeme(token) {
119
+ if (!token)
120
+ return undefined;
121
+ const candidate = withoutComments(token);
122
+ if (!candidate.startsWith('(') || !candidate.endsWith(')'))
123
+ return undefined;
124
+ const entries = candidate.slice(1, -1).split(',').map(entry => entry.trim());
125
+ if (entries.length === 0 || entries.some(entry => entry.length === 0))
126
+ return undefined;
127
+ const refs = entries.map(entry => costReferenceLexeme(entry));
128
+ return refs.every((ref) => ref !== undefined) ? refs : undefined;
129
+ }
130
+ import { StepTextScan } from './step-lexing.js';
131
+ //# sourceMappingURL=cost-step-lexemes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-step-lexemes.js","sourceRoot":"","sources":["../src/cost-step-lexemes.ts"],"names":[],"mappings":"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"}