@ifc-lite/parser 4.3.2 → 5.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/dist/attribute-helpers.d.ts +38 -4
- package/dist/attribute-helpers.d.ts.map +1 -1
- package/dist/attribute-helpers.js +71 -4
- package/dist/attribute-helpers.js.map +1 -1
- package/dist/columnar-parser-attributes.d.ts.map +1 -1
- package/dist/columnar-parser-attributes.js +35 -5
- package/dist/columnar-parser-attributes.js.map +1 -1
- package/dist/columnar-parser-indexes.d.ts.map +1 -1
- package/dist/columnar-parser-indexes.js +14 -2
- package/dist/columnar-parser-indexes.js.map +1 -1
- package/dist/columnar-parser-relationships.d.ts.map +1 -1
- package/dist/columnar-parser-relationships.js +6 -1
- package/dist/columnar-parser-relationships.js.map +1 -1
- package/dist/columnar-parser.d.ts +3 -1
- package/dist/columnar-parser.d.ts.map +1 -1
- package/dist/columnar-parser.js +16 -25
- package/dist/columnar-parser.js.map +1 -1
- package/dist/compact-entity-index-transport.d.ts +23 -0
- package/dist/compact-entity-index-transport.d.ts.map +1 -0
- package/dist/compact-entity-index-transport.js +28 -0
- package/dist/compact-entity-index-transport.js.map +1 -0
- package/dist/compact-entity-index.d.ts +0 -10
- package/dist/compact-entity-index.d.ts.map +1 -1
- package/dist/compact-entity-index.js +31 -24
- package/dist/compact-entity-index.js.map +1 -1
- package/dist/data-store-transport.d.ts +2 -12
- package/dist/data-store-transport.d.ts.map +1 -1
- package/dist/data-store-transport.js +7 -20
- package/dist/data-store-transport.js.map +1 -1
- package/dist/entity-extractor.d.ts.map +1 -1
- package/dist/entity-extractor.js +101 -6
- package/dist/entity-extractor.js.map +1 -1
- package/dist/entity-refs-from-index.d.ts.map +1 -1
- package/dist/entity-refs-from-index.js +12 -2
- package/dist/entity-refs-from-index.js.map +1 -1
- package/dist/entity-scanner.d.ts +63 -0
- package/dist/entity-scanner.d.ts.map +1 -1
- package/dist/entity-scanner.js +79 -2
- package/dist/entity-scanner.js.map +1 -1
- package/dist/express-id.d.ts +47 -0
- package/dist/express-id.d.ts.map +1 -0
- package/dist/express-id.js +57 -0
- package/dist/express-id.js.map +1 -0
- package/dist/generated/entities.d.ts +1 -1
- package/dist/generated/entities.d.ts.map +1 -1
- package/dist/generated/schema-registry.js +146 -146
- package/dist/generated/schema-registry.js.map +1 -1
- package/dist/georef-epset.d.ts +25 -0
- package/dist/georef-epset.d.ts.map +1 -0
- package/dist/georef-epset.js +214 -0
- package/dist/georef-epset.js.map +1 -0
- package/dist/georef-extractor.d.ts.map +1 -1
- package/dist/georef-extractor.js +38 -175
- package/dist/georef-extractor.js.map +1 -1
- package/dist/georef-map-conversion.d.ts +29 -0
- package/dist/georef-map-conversion.d.ts.map +1 -0
- package/dist/georef-map-conversion.js +75 -0
- package/dist/georef-map-conversion.js.map +1 -0
- package/dist/ifc-schema.d.ts +4 -2
- package/dist/ifc-schema.d.ts.map +1 -1
- package/dist/ifc-schema.js +15 -5
- package/dist/ifc-schema.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/material-extractor.d.ts +2 -17
- package/dist/material-extractor.d.ts.map +1 -1
- package/dist/material-extractor.js +12 -37
- package/dist/material-extractor.js.map +1 -1
- package/dist/material-layer-reader.d.ts +45 -0
- package/dist/material-layer-reader.d.ts.map +1 -0
- package/dist/material-layer-reader.js +63 -0
- package/dist/material-layer-reader.js.map +1 -0
- package/dist/material-resolver.d.ts.map +1 -1
- package/dist/material-resolver.js +14 -14
- package/dist/material-resolver.js.map +1 -1
- package/dist/measure-unit-scale.d.ts +41 -0
- package/dist/measure-unit-scale.d.ts.map +1 -0
- package/dist/measure-unit-scale.js +53 -0
- package/dist/measure-unit-scale.js.map +1 -0
- package/dist/on-demand-extractors.d.ts +3 -19
- package/dist/on-demand-extractors.d.ts.map +1 -1
- package/dist/on-demand-extractors.js +54 -264
- package/dist/on-demand-extractors.js.map +1 -1
- package/dist/owning-project.d.ts +54 -0
- package/dist/owning-project.d.ts.map +1 -0
- package/dist/owning-project.js +76 -0
- package/dist/owning-project.js.map +1 -0
- package/dist/parser.worker.d.ts +14 -0
- package/dist/parser.worker.d.ts.map +1 -1
- package/dist/parser.worker.js +2 -0
- package/dist/parser.worker.js.map +1 -1
- package/dist/project-units-symbols.d.ts +33 -0
- package/dist/project-units-symbols.d.ts.map +1 -0
- package/dist/project-units-symbols.js +265 -0
- package/dist/project-units-symbols.js.map +1 -0
- package/dist/project-units.d.ts +11 -19
- package/dist/project-units.d.ts.map +1 -1
- package/dist/project-units.js +9 -267
- package/dist/project-units.js.map +1 -1
- package/dist/property-set-merge.d.ts +65 -8
- package/dist/property-set-merge.d.ts.map +1 -1
- package/dist/property-set-merge.js +130 -29
- package/dist/property-set-merge.js.map +1 -1
- package/dist/property-value-parser.d.ts +55 -0
- package/dist/property-value-parser.d.ts.map +1 -0
- package/dist/property-value-parser.js +277 -0
- package/dist/property-value-parser.js.map +1 -0
- package/dist/quantity-collect.d.ts +42 -3
- package/dist/quantity-collect.d.ts.map +1 -1
- package/dist/quantity-collect.js +114 -7
- package/dist/quantity-collect.js.map +1 -1
- package/dist/query-backend-maps.d.ts +5 -8
- package/dist/query-backend-maps.d.ts.map +1 -1
- package/dist/query-backend-maps.js +155 -15
- package/dist/query-backend-maps.js.map +1 -1
- package/dist/relationship-extractor.d.ts.map +1 -1
- package/dist/relationship-extractor.js +18 -0
- package/dist/relationship-extractor.js.map +1 -1
- package/dist/scan-entities-balanced.d.ts +38 -0
- package/dist/scan-entities-balanced.d.ts.map +1 -0
- package/dist/scan-entities-balanced.js +258 -0
- package/dist/scan-entities-balanced.js.map +1 -0
- package/dist/scan-worker-inline.d.ts +17 -11
- package/dist/scan-worker-inline.d.ts.map +1 -1
- package/dist/scan-worker-inline.js +9 -235
- package/dist/scan-worker-inline.js.map +1 -1
- package/dist/scan-worker-source.d.ts +9 -0
- package/dist/scan-worker-source.d.ts.map +1 -0
- package/dist/scan-worker-source.js +383 -0
- package/dist/scan-worker-source.js.map +1 -0
- package/dist/spatial-hierarchy-builder.js +3 -3
- package/dist/spatial-hierarchy-builder.js.map +1 -1
- package/dist/step-lexing.d.ts +2 -0
- package/dist/step-lexing.d.ts.map +1 -1
- package/dist/step-lexing.js +116 -18
- package/dist/step-lexing.js.map +1 -1
- package/dist/step-trivia.d.ts +60 -0
- package/dist/step-trivia.d.ts.map +1 -0
- package/dist/step-trivia.js +63 -0
- package/dist/step-trivia.js.map +1 -0
- package/dist/tokenizer.d.ts +20 -21
- package/dist/tokenizer.d.ts.map +1 -1
- package/dist/tokenizer.js +164 -203
- package/dist/tokenizer.js.map +1 -1
- package/dist/unit-extractor.d.ts +43 -1
- package/dist/unit-extractor.d.ts.map +1 -1
- package/dist/unit-extractor.js +63 -4
- package/dist/unit-extractor.js.map +1 -1
- package/dist/worker-parser.d.ts +11 -1
- package/dist/worker-parser.d.ts.map +1 -1
- package/dist/worker-parser.js +16 -2
- package/dist/worker-parser.js.map +1 -1
- package/package.json +6 -6
package/dist/tokenizer.js
CHANGED
|
@@ -5,97 +5,44 @@
|
|
|
5
5
|
* STEP tokenizer - fast byte-level scanning for entity markers
|
|
6
6
|
* Leverages Spike 1 approach: ~1,259 MB/s throughput
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { isIndexableExpressId } from './express-id.js';
|
|
9
|
+
import { BalancedEntityScan } from './scan-entities-balanced.js';
|
|
10
|
+
import { countNewlines, opensComment, opensLiteralOrComment, skipComment, skipLexical, skipTrivia, } from './step-lexing.js';
|
|
10
11
|
export class StepTokenizer {
|
|
11
12
|
buffer;
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
oversizedIds = 0;
|
|
14
|
+
malformedRecords = 0;
|
|
14
15
|
constructor(buffer) {
|
|
15
16
|
this.buffer = buffer;
|
|
16
17
|
}
|
|
18
|
+
/** Records the last scan refused for an out-of-contract express id
|
|
19
|
+
* (express-id.ts, #3395). Reset per scan; the caller reports it. */
|
|
20
|
+
get oversizedIdCount() { return this.oversizedIds; }
|
|
21
|
+
/** 0 or 1: whether the last `scanEntitiesFast`/`scanEntities` run stopped
|
|
22
|
+
* early on an unclosed `'` string, an unclosed block comment, or a
|
|
23
|
+
* declaration cut off before its own '(' -- never a count of how many,
|
|
24
|
+
* since the scan has no reliable way to resume past the first one it
|
|
25
|
+
* hits. Reset at the start of every scan; the caller reports it. */
|
|
26
|
+
get malformedRecordCount() { return this.malformedRecords; }
|
|
17
27
|
/**
|
|
18
28
|
* Scan for all entity declarations (#EXPRESS_ID = TYPE(...))
|
|
19
|
-
* Returns entity references without parsing full content
|
|
29
|
+
* Returns entity references without parsing full content.
|
|
30
|
+
*
|
|
31
|
+
* Closes each record on the ')' balancing its argument list. The scan itself
|
|
32
|
+
* lives in `scan-entities-balanced.ts`; only the refusal count comes back
|
|
33
|
+
* here, and it comes back in a `finally` so an abandoned generator still
|
|
34
|
+
* reports what it refused.
|
|
20
35
|
*/
|
|
21
36
|
*scanEntities() {
|
|
22
|
-
|
|
23
|
-
this.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (expressId === null) {
|
|
32
|
-
this.position++;
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
// Skip whitespace
|
|
36
|
-
this.skipWhitespace();
|
|
37
|
-
// Check for '=' (assignment)
|
|
38
|
-
if (this.position >= this.buffer.length || this.buffer[this.position] !== 0x3D) {
|
|
39
|
-
this.position++;
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
this.position++; // Skip '='
|
|
43
|
-
// Skip whitespace
|
|
44
|
-
this.skipWhitespace();
|
|
45
|
-
// Read type name
|
|
46
|
-
const type = this.readTypeName();
|
|
47
|
-
if (!type) {
|
|
48
|
-
this.position++;
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
// Skip whitespace
|
|
52
|
-
this.skipWhitespace();
|
|
53
|
-
// Check for '(' (start of parameters)
|
|
54
|
-
if (this.position >= this.buffer.length || this.buffer[this.position] !== 0x28) {
|
|
55
|
-
this.position++;
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
// Find matching closing parenthesis to get full entity length
|
|
59
|
-
const entityLength = this.findEntityLength(startOffset);
|
|
60
|
-
if (entityLength > 0) {
|
|
61
|
-
// Step past the whole record, as Rust's next_entity does. Leaving
|
|
62
|
-
// `position` at the '(' made this loop re-walk the body, which was
|
|
63
|
-
// harmless only while it ignored quotes and comments.
|
|
64
|
-
//
|
|
65
|
-
// Count from `position`, not from `startOffset`: `position` is on the
|
|
66
|
-
// '(' here, and every newline before it was already counted by the
|
|
67
|
-
// three skipWhitespace calls above. Counting the whole record instead
|
|
68
|
-
// double-counts a newline written between `#1=` and its type name,
|
|
69
|
-
// which is ordinary whitespace and legal.
|
|
70
|
-
this.lineNumber += countNewlines(this.buffer, this.position, startOffset + entityLength);
|
|
71
|
-
this.position = startOffset + entityLength;
|
|
72
|
-
yield {
|
|
73
|
-
expressId,
|
|
74
|
-
type,
|
|
75
|
-
offset: startOffset,
|
|
76
|
-
length: entityLength,
|
|
77
|
-
line: startLine,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else if (this.buffer[this.position] === 0x0A) {
|
|
82
|
-
// Newline
|
|
83
|
-
this.lineNumber++;
|
|
84
|
-
this.position++;
|
|
85
|
-
}
|
|
86
|
-
else if (opensLiteralOrComment(this.buffer, this.position, this.buffer.length)) {
|
|
87
|
-
// A commented-out record satisfies every check above, so a comment has
|
|
88
|
-
// to be skipped as a region; a literal has to be skipped so its
|
|
89
|
-
// contents cannot look like one. See step-lexing.
|
|
90
|
-
const skip = skipLexical(this.buffer, this.position, this.buffer.length);
|
|
91
|
-
this.lineNumber += skip.lines;
|
|
92
|
-
this.position = skip.next;
|
|
93
|
-
if (skip.stop)
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this.position++;
|
|
98
|
-
}
|
|
37
|
+
const scan = new BalancedEntityScan(this.buffer);
|
|
38
|
+
this.oversizedIds = 0;
|
|
39
|
+
this.malformedRecords = 0;
|
|
40
|
+
try {
|
|
41
|
+
yield* scan.run();
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
this.oversizedIds = scan.oversizedIdCount;
|
|
45
|
+
this.malformedRecords = scan.malformedRecordCount;
|
|
99
46
|
}
|
|
100
47
|
}
|
|
101
48
|
/**
|
|
@@ -103,8 +50,8 @@ export class StepTokenizer {
|
|
|
103
50
|
* ~5-10x faster for large files, yields length=0 (calculate on-demand)
|
|
104
51
|
*/
|
|
105
52
|
*scanEntitiesFast() {
|
|
106
|
-
this.
|
|
107
|
-
this.
|
|
53
|
+
this.oversizedIds = 0;
|
|
54
|
+
this.malformedRecords = 0;
|
|
108
55
|
// Pre-compute common byte codes
|
|
109
56
|
const HASH = 0x23; // '#'
|
|
110
57
|
const EQUALS = 0x3D; // '='
|
|
@@ -112,6 +59,7 @@ export class StepTokenizer {
|
|
|
112
59
|
const SEMICOLON = 0x3B; // ';'
|
|
113
60
|
const QUOTE = 0x27; // '\''
|
|
114
61
|
const NEWLINE = 0x0A; // '\n'
|
|
62
|
+
const SLASH = 0x2F; // '/'
|
|
115
63
|
const buf = this.buffer;
|
|
116
64
|
const len = buf.length;
|
|
117
65
|
let pos = 0;
|
|
@@ -119,6 +67,22 @@ export class StepTokenizer {
|
|
|
119
67
|
// Cache type name strings: IFC files have ~776 unique types repeated
|
|
120
68
|
// across 8M+ entities. Caching avoids millions of String.fromCharCode allocations.
|
|
121
69
|
const typeCache = new Map();
|
|
70
|
+
// Set on the way to the single post-loop check at the bottom of this
|
|
71
|
+
// function, not counted at each site: `stopped` for an unclosed string or
|
|
72
|
+
// comment that ran the scan to end of buffer with nothing left to find,
|
|
73
|
+
// `declOpen` while a `#id=TYPE(` header is incomplete. `declOpen` stays
|
|
74
|
+
// armed ONLY when the reason for abandoning is running out of buffer
|
|
75
|
+
// (`pos >= len`); a mismatch with buffer still left (bad byte, oversized
|
|
76
|
+
// id) clears it, because the scan resumes byte-by-byte from wherever it
|
|
77
|
+
// gave up, and a `#ref` token inside the abandoned record's own argument
|
|
78
|
+
// list reads as a fresh, equally incomplete attempt -- one that must not
|
|
79
|
+
// report "cut off" just because nothing later happens to clear it.
|
|
80
|
+
// Per-site increments used to miss whole shapes -- a leading unterminated
|
|
81
|
+
// comment before '=', or a declaration cut off before its own '(' --
|
|
82
|
+
// because each site only knew about its own exit, never the scan's final
|
|
83
|
+
// state.
|
|
84
|
+
let stopped = false;
|
|
85
|
+
let declOpen = false;
|
|
122
86
|
while (pos < len) {
|
|
123
87
|
const char = buf[pos];
|
|
124
88
|
if (char === HASH) {
|
|
@@ -141,10 +105,15 @@ export class StepTokenizer {
|
|
|
141
105
|
}
|
|
142
106
|
if (!hasDigits)
|
|
143
107
|
continue;
|
|
144
|
-
|
|
108
|
+
declOpen = true;
|
|
109
|
+
// Skip whitespace (inline). Kept byte-for-byte in sync with
|
|
110
|
+
// `isSpaceByte` in step-lexing.ts (space, tab, CR, LF, form feed,
|
|
111
|
+
// vertical tab) -- this loop, its two twins below in this method, and
|
|
112
|
+
// the worker's copy in scan-worker-source.ts are the same rule
|
|
113
|
+
// hand-duplicated for speed, not four independent decisions.
|
|
145
114
|
while (pos < len) {
|
|
146
115
|
const c = buf[pos];
|
|
147
|
-
if (c === 0x20 || c === 0x09 || c === 0x0D) {
|
|
116
|
+
if (c === 0x20 || c === 0x09 || c === 0x0D || c === 0x0C || c === 0x0B) {
|
|
148
117
|
pos++;
|
|
149
118
|
}
|
|
150
119
|
else if (c === NEWLINE) {
|
|
@@ -154,14 +123,50 @@ export class StepTokenizer {
|
|
|
154
123
|
else
|
|
155
124
|
break;
|
|
156
125
|
}
|
|
157
|
-
//
|
|
158
|
-
|
|
126
|
+
// 10303-21 allows a comment wherever whitespace is allowed, so
|
|
127
|
+
// `#1 /* was #7 */ =` is a declaration. The inline loop above stays
|
|
128
|
+
// for the common case; this runs only once a comment actually opens,
|
|
129
|
+
// and skipTrivia (step-lexing) then takes the whole run of both.
|
|
130
|
+
if (opensComment(buf, pos, len)) {
|
|
131
|
+
const t = skipTrivia(buf, pos, len);
|
|
132
|
+
line += t.lines;
|
|
133
|
+
pos = t.next;
|
|
134
|
+
if (t.stop) {
|
|
135
|
+
stopped = true;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Check for '='. A byte that is not '=' with buffer left to scan is
|
|
140
|
+
// not a truncation -- clear declOpen so a reference token inside a
|
|
141
|
+
// LATER abandoned record's argument list (see the oversized-id note
|
|
142
|
+
// below) cannot leave it stuck armed with nothing left to clear it.
|
|
143
|
+
if (pos >= len)
|
|
144
|
+
continue;
|
|
145
|
+
if (buf[pos] !== EQUALS) {
|
|
146
|
+
declOpen = false;
|
|
159
147
|
continue;
|
|
148
|
+
}
|
|
160
149
|
pos++;
|
|
150
|
+
// Storage contract, not just overflow: see express-id.ts (#3395).
|
|
151
|
+
// Tested only now that `#<digits>[ws]*=` has matched, which is the
|
|
152
|
+
// DECLARATION shape Rust's `EntityScanner` validates before it
|
|
153
|
+
// refuses. Refusing above the '=' check counted references too: the
|
|
154
|
+
// `continue` resumes inside the refused record's argument list
|
|
155
|
+
// (unlike the accepted path, which skips to the terminating ';'), so
|
|
156
|
+
// `#4294967297=IFCWALL(#4294967298,#4294967299,...)` reported three
|
|
157
|
+
// skipped records for the one record actually dropped. A count that
|
|
158
|
+
// overstates is the same class of defect as one that undercounts.
|
|
159
|
+
// Refused for being out of range, not for running out of buffer, so
|
|
160
|
+
// it does not belong to `declOpen`'s "cut off by EOF" story either.
|
|
161
|
+
if (!isIndexableExpressId(expressId)) {
|
|
162
|
+
this.oversizedIds++;
|
|
163
|
+
declOpen = false;
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
161
166
|
// Skip whitespace
|
|
162
167
|
while (pos < len) {
|
|
163
168
|
const c = buf[pos];
|
|
164
|
-
if (c === 0x20 || c === 0x09 || c === 0x0D) {
|
|
169
|
+
if (c === 0x20 || c === 0x09 || c === 0x0D || c === 0x0C || c === 0x0B) {
|
|
165
170
|
pos++;
|
|
166
171
|
}
|
|
167
172
|
else if (c === NEWLINE) {
|
|
@@ -171,10 +176,24 @@ export class StepTokenizer {
|
|
|
171
176
|
else
|
|
172
177
|
break;
|
|
173
178
|
}
|
|
174
|
-
|
|
179
|
+
if (opensComment(buf, pos, len)) {
|
|
180
|
+
const t = skipTrivia(buf, pos, len);
|
|
181
|
+
line += t.lines;
|
|
182
|
+
pos = t.next;
|
|
183
|
+
if (t.stop) {
|
|
184
|
+
stopped = true;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Read type name (inline). Must start A-Z; a bad start byte with
|
|
189
|
+
// buffer left clears declOpen for the same reason as the '=' check.
|
|
175
190
|
const typeStart = pos;
|
|
176
|
-
if (pos >= len
|
|
177
|
-
continue;
|
|
191
|
+
if (pos >= len)
|
|
192
|
+
continue;
|
|
193
|
+
if (buf[pos] < 0x41 || buf[pos] > 0x5A) {
|
|
194
|
+
declOpen = false;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
178
197
|
while (pos < len) {
|
|
179
198
|
const c = buf[pos];
|
|
180
199
|
if ((c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A) ||
|
|
@@ -218,7 +237,7 @@ export class StepTokenizer {
|
|
|
218
237
|
// Skip whitespace
|
|
219
238
|
while (pos < len) {
|
|
220
239
|
const c = buf[pos];
|
|
221
|
-
if (c === 0x20 || c === 0x09 || c === 0x0D) {
|
|
240
|
+
if (c === 0x20 || c === 0x09 || c === 0x0D || c === 0x0C || c === 0x0B) {
|
|
222
241
|
pos++;
|
|
223
242
|
}
|
|
224
243
|
else if (c === NEWLINE) {
|
|
@@ -228,11 +247,26 @@ export class StepTokenizer {
|
|
|
228
247
|
else
|
|
229
248
|
break;
|
|
230
249
|
}
|
|
231
|
-
|
|
232
|
-
|
|
250
|
+
if (opensComment(buf, pos, len)) {
|
|
251
|
+
const t = skipTrivia(buf, pos, len);
|
|
252
|
+
line += t.lines;
|
|
253
|
+
pos = t.next;
|
|
254
|
+
if (t.stop) {
|
|
255
|
+
stopped = true;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Check for '('. Same EOF-vs-mismatch split as '=' and the type name.
|
|
260
|
+
if (pos >= len)
|
|
233
261
|
continue;
|
|
262
|
+
if (buf[pos] !== LPAREN) {
|
|
263
|
+
declOpen = false;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
declOpen = false; // Header complete: '(' found.
|
|
234
267
|
// FAST: Skip to semicolon (handling strings)
|
|
235
268
|
let inString = false;
|
|
269
|
+
let foundTerminator = false;
|
|
236
270
|
while (pos < len) {
|
|
237
271
|
const c = buf[pos];
|
|
238
272
|
if (c === QUOTE) {
|
|
@@ -242,11 +276,29 @@ export class StepTokenizer {
|
|
|
242
276
|
}
|
|
243
277
|
inString = !inString;
|
|
244
278
|
}
|
|
279
|
+
else if (c === SLASH && !inString && opensComment(buf, pos, len)) {
|
|
280
|
+
// The ';' that ends a record can be preceded by a comment holding
|
|
281
|
+
// its own ';'. Take the comment whole -- which also makes the
|
|
282
|
+
// quotes and parens inside it text, the other half of the rule the
|
|
283
|
+
// literal skip above provides in the opposite direction.
|
|
284
|
+
const end = skipComment(buf, pos, len);
|
|
285
|
+
if (end < 0) {
|
|
286
|
+
// Unterminated: this record has no terminator, and neither has
|
|
287
|
+
// anything after it. Drop it and stop, which is the None Rust's
|
|
288
|
+
// find_entity_end returns on the same input.
|
|
289
|
+
pos = len;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
line += countNewlines(buf, pos, end);
|
|
293
|
+
pos = end;
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
245
296
|
else if (c === SEMICOLON && !inString) {
|
|
246
297
|
// Found end of entity
|
|
247
298
|
const entityLength = pos - startOffset + 1; // Include semicolon
|
|
248
299
|
yield { expressId, type, offset: startOffset, length: entityLength, line: startLine };
|
|
249
300
|
pos++;
|
|
301
|
+
foundTerminator = true;
|
|
250
302
|
break;
|
|
251
303
|
}
|
|
252
304
|
else if (c === NEWLINE) {
|
|
@@ -254,6 +306,14 @@ export class StepTokenizer {
|
|
|
254
306
|
}
|
|
255
307
|
pos++;
|
|
256
308
|
}
|
|
309
|
+
// Ran off the end without an unquoted ';' — usually an unescaped `'`
|
|
310
|
+
// left open, or the unterminated-comment break above; `pos` is
|
|
311
|
+
// already `len`, ending the scan here. Not resynced: with no known
|
|
312
|
+
// terminator, guessing a resume point risks fabricating entities from
|
|
313
|
+
// misaligned bytes. Recorded in `stopped`, not incremented here --
|
|
314
|
+
// see the post-loop check below.
|
|
315
|
+
if (!foundTerminator)
|
|
316
|
+
stopped = true;
|
|
257
317
|
}
|
|
258
318
|
else if (char === NEWLINE) {
|
|
259
319
|
line++;
|
|
@@ -268,120 +328,21 @@ export class StepTokenizer {
|
|
|
268
328
|
line += skip.lines;
|
|
269
329
|
pos = skip.next;
|
|
270
330
|
if (skip.stop) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
pos++;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
this.position = pos;
|
|
281
|
-
this.lineNumber = line;
|
|
282
|
-
}
|
|
283
|
-
readExpressId() {
|
|
284
|
-
let id = 0;
|
|
285
|
-
let digits = 0;
|
|
286
|
-
let pos = this.position + 1; // Skip '#'
|
|
287
|
-
while (pos < this.buffer.length) {
|
|
288
|
-
const char = this.buffer[pos];
|
|
289
|
-
if (char >= 0x30 && char <= 0x39) { // '0'-'9'
|
|
290
|
-
id = id * 10 + (char - 0x30);
|
|
291
|
-
digits++;
|
|
292
|
-
pos++;
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
break;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (digits === 0)
|
|
299
|
-
return null;
|
|
300
|
-
this.position = pos;
|
|
301
|
-
return id;
|
|
302
|
-
}
|
|
303
|
-
readTypeName() {
|
|
304
|
-
let start = this.position;
|
|
305
|
-
let end = start;
|
|
306
|
-
// Type names start with uppercase letter
|
|
307
|
-
if (this.position >= this.buffer.length || this.buffer[this.position] < 0x41 || this.buffer[this.position] > 0x5A) {
|
|
308
|
-
return null;
|
|
309
|
-
}
|
|
310
|
-
while (end < this.buffer.length) {
|
|
311
|
-
const char = this.buffer[end];
|
|
312
|
-
// Allow letters, numbers, and underscore
|
|
313
|
-
if ((char >= 0x41 && char <= 0x5A) || // A-Z
|
|
314
|
-
(char >= 0x61 && char <= 0x7A) || // a-z
|
|
315
|
-
(char >= 0x30 && char <= 0x39) || // 0-9
|
|
316
|
-
char === 0x5F // _
|
|
317
|
-
) {
|
|
318
|
-
end++;
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
break;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
if (end === start)
|
|
325
|
-
return null;
|
|
326
|
-
const typeName = safeUtf8Decode(this.buffer, start, end);
|
|
327
|
-
this.position = end;
|
|
328
|
-
return typeName;
|
|
329
|
-
}
|
|
330
|
-
skipWhitespace() {
|
|
331
|
-
while (this.position < this.buffer.length) {
|
|
332
|
-
const char = this.buffer[this.position];
|
|
333
|
-
if (char === 0x20 || char === 0x09 || char === 0x0D || char === 0x0A) { // space, tab, CR, LF
|
|
334
|
-
if (char === 0x0A)
|
|
335
|
-
this.lineNumber++;
|
|
336
|
-
this.position++;
|
|
337
|
-
}
|
|
338
|
-
else {
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
findEntityLength(startOffset) {
|
|
344
|
-
let pos = this.position;
|
|
345
|
-
let depth = 0;
|
|
346
|
-
let inString = false;
|
|
347
|
-
while (pos < this.buffer.length) {
|
|
348
|
-
const char = this.buffer[pos];
|
|
349
|
-
if (char === 0x27) { // Single quote (string delimiter)
|
|
350
|
-
if (inString) {
|
|
351
|
-
// Check for escaped quote ('') - STEP uses doubled quotes
|
|
352
|
-
if (pos + 1 < this.buffer.length && this.buffer[pos + 1] === 0x27) {
|
|
353
|
-
pos += 2; // Skip escaped quote
|
|
354
|
-
continue;
|
|
355
|
-
}
|
|
356
|
-
inString = false;
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
inString = true;
|
|
360
|
-
}
|
|
361
|
-
pos++;
|
|
362
|
-
continue;
|
|
363
|
-
}
|
|
364
|
-
if (inString) {
|
|
365
|
-
pos++;
|
|
366
|
-
continue;
|
|
367
|
-
}
|
|
368
|
-
if (char === 0x28) { // '('
|
|
369
|
-
depth++;
|
|
370
|
-
pos++;
|
|
371
|
-
}
|
|
372
|
-
else if (char === 0x29) { // ')'
|
|
373
|
-
depth--;
|
|
374
|
-
pos++;
|
|
375
|
-
if (depth === 0) {
|
|
376
|
-
// Found matching closing parenthesis
|
|
377
|
-
return pos - startOffset;
|
|
331
|
+
stopped = true;
|
|
332
|
+
break;
|
|
378
333
|
}
|
|
379
334
|
}
|
|
380
335
|
else {
|
|
381
336
|
pos++;
|
|
382
337
|
}
|
|
383
338
|
}
|
|
384
|
-
|
|
339
|
+
// ONE post-loop check, not an increment at every exit site above: the
|
|
340
|
+
// scan stopped early if it hit an explicit "no terminator" boundary
|
|
341
|
+
// (`stopped`), or the last `#id=TYPE(` header was cut short before its
|
|
342
|
+
// '(' was found (`declOpen`). Always 0 or 1 -- the scan stops at the
|
|
343
|
+
// first one, so there is nothing further to accumulate.
|
|
344
|
+
if (stopped || declOpen)
|
|
345
|
+
this.malformedRecords = 1;
|
|
385
346
|
}
|
|
386
347
|
}
|
|
387
348
|
//# sourceMappingURL=tokenizer.js.map
|
package/dist/tokenizer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAErF,MAAM,OAAO,aAAa;IAChB,MAAM,CAAa;IACnB,QAAQ,GAAW,CAAC,CAAC;IACrB,UAAU,GAAW,CAAC,CAAC;IAE/B,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,CAAC,YAAY;QACX,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1C,4CAA4C;YAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;gBAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;gBAElC,kBAAkB;gBAClB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBAED,kBAAkB;gBAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,6BAA6B;gBAC7B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW;gBAE5B,kBAAkB;gBAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,iBAAiB;gBACjB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBAED,kBAAkB;gBAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,sCAAsC;gBACtC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBAED,8DAA8D;gBAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBACxD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACrB,kEAAkE;oBAClE,mEAAmE;oBACnE,sDAAsD;oBACtD,EAAE;oBACF,sEAAsE;oBACtE,mEAAmE;oBACnE,sEAAsE;oBACtE,mEAAmE;oBACnE,0CAA0C;oBAC1C,IAAI,CAAC,UAAU,IAAI,aAAa,CAC9B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,QAAQ,EACb,WAAW,GAAG,YAAY,CAC3B,CAAC;oBACF,IAAI,CAAC,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;oBAC3C,MAAM;wBACJ,SAAS;wBACT,IAAI;wBACJ,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,YAAY;wBACpB,IAAI,EAAE,SAAS;qBAChB,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/C,UAAU;gBACV,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;iBAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjF,uEAAuE;gBACvE,gEAAgE;gBAChE,kDAAkD;gBAClD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACzE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC;gBAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC1B,IAAI,IAAI,CAAC,IAAI;oBAAE,OAAO;YACxB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,CAAC,gBAAgB;QACf,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,gCAAgC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAM,MAAM;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAI,MAAM;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAI,MAAM;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,MAAM;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAK,OAAO;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAG,OAAO;QAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,qEAAqE;QACrE,mFAAmF;QACnF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE5C,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,GAAG,CAAC;gBACxB,MAAM,SAAS,GAAG,IAAI,CAAC;gBACvB,GAAG,EAAE,CAAC,CAAC,WAAW;gBAElB,qCAAqC;gBACrC,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU;wBACtC,SAAS,GAAG,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;wBACxC,SAAS,GAAG,IAAI,CAAC;wBACjB,GAAG,EAAE,CAAC;oBACR,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,SAAS;oBAAE,SAAS;gBAEzB,2BAA2B;gBAC3B,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;yBACjD,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;;wBACrC,MAAM;gBACb,CAAC;gBAED,gBAAgB;gBAChB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;oBAAE,SAAS;gBAChD,GAAG,EAAE,CAAC;gBAEN,kBAAkB;gBAClB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;yBACjD,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;;wBACrC,MAAM;gBACb,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC;gBACtB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;oBAAE,SAAS,CAAC,iBAAiB;gBAEjF,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;wBACpD,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC3C,GAAG,EAAE,CAAC;oBACR,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,GAAG,KAAK,SAAS;oBAAE,SAAS;gBAEhC,mFAAmF;gBACnF,mFAAmF;gBACnF,iFAAiF;gBACjF,mFAAmF;gBACnF,gFAAgF;gBAChF,MAAM,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC;gBAChC,IAAI,QAAQ,GAAG,OAAO,CAAC;gBACvB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,QAAQ,GAAG,CAAC,QAAQ,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC1C,CAAC;gBACD,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC1C,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,eAAe,GAAG,KAAK,CAAC;gBAC5B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAClD,eAAe,GAAG,IAAI,CAAC;oBACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;wBACjC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;4BAC9C,eAAe,GAAG,KAAK,CAAC;4BACxB,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,qEAAqE;gBACrE,mEAAmE;gBACnE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC3C,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC5D,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAChC,CAAC;gBAED,kBAAkB;gBAClB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;yBACjD,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;;wBACrC,MAAM;gBACb,CAAC;gBAED,gBAAgB;gBAChB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;oBAAE,SAAS;gBAEhD,6CAA6C;gBAC7C,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;wBAChB,IAAI,QAAQ,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;4BACxD,GAAG,IAAI,CAAC,CAAC,CAAC,qBAAqB;4BAC/B,SAAS;wBACX,CAAC;wBACD,QAAQ,GAAG,CAAC,QAAQ,CAAC;oBACvB,CAAC;yBAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACxC,sBAAsB;wBACtB,MAAM,YAAY,GAAG,GAAG,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,oBAAoB;wBAChE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;wBACtF,GAAG,EAAE,CAAC;wBACN,MAAM;oBACR,CAAC;yBAAM,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBACzB,IAAI,EAAE,CAAC;oBACT,CAAC;oBACD,GAAG,EAAE,CAAC;gBACR,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,IAAI,EAAE,CAAC;gBACP,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,IAAI,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBAChD,mEAAmE;gBACnE,mEAAmE;gBACnE,sDAAsD;gBACtD,kEAAkE;gBAClE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;gBACnB,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC;gBAChB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACd,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;oBACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;oBACvB,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,EAAE,CAAC;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,aAAa;QACnB,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,WAAW;QAExC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU;gBAC5C,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC;gBACT,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,YAAY;QAClB,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,yCAAyC;QACzC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;YAClH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,yCAAyC;YACzC,IACE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM;gBACxC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM;gBACxC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM;gBACxC,IAAI,KAAK,IAAI,CAAC,IAAI;cAClB,CAAC;gBACD,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,qBAAqB;gBAC3F,IAAI,IAAI,KAAK,IAAI;oBAAE,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,WAAmB;QAC1C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,kCAAkC;gBACrD,IAAI,QAAQ,EAAE,CAAC;oBACb,0DAA0D;oBAC1D,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAClE,GAAG,IAAI,CAAC,CAAC,CAAC,qBAAqB;wBAC/B,SAAS;oBACX,CAAC;oBACD,QAAQ,GAAG,KAAK,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC;gBACD,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;gBACzB,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;gBAChC,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,CAAC;gBACN,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,qCAAqC;oBACrC,OAAO,GAAG,GAAG,WAAW,CAAC;gBAC3B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,EAAE,CAAC;YACR,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC,CAAC,wCAAwC;IACpD,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"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"}
|
package/dist/unit-extractor.d.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { EntityRef } from './types.js';
|
|
8
8
|
import type { IfcSourceBytes } from './source-bytes.js';
|
|
9
|
+
import { type RelatedLookup } from './owning-project.js';
|
|
10
|
+
export { resolveOwningIfcProjectId, type RelatedLookup } from './owning-project.js';
|
|
9
11
|
/**
|
|
10
12
|
* SI Prefix multipliers, keyed by the members of the `IfcSIPrefix` EXPRESS
|
|
11
13
|
* enumeration — that enumeration is the authority for which prefixes a unit
|
|
@@ -43,6 +45,12 @@ export declare const CONVERSION_BASED_UNIT_FACTORS: Record<string, number>;
|
|
|
43
45
|
*
|
|
44
46
|
* @param source - The IFC file bytes, either raw or behind {@link IfcSourceBytes}
|
|
45
47
|
* @param entityIndex - Entity index with byId and byType maps
|
|
48
|
+
* @param projectId - Optional express id of the specific `IFCPROJECT` to read
|
|
49
|
+
* units from. Most files declare exactly one, so the default (the file's
|
|
50
|
+
* first `IFCPROJECT`) is correct for the overwhelmingly common case; pass
|
|
51
|
+
* this explicitly when resolving units for an entity that may belong to a
|
|
52
|
+
* later `IFCPROJECT` in a multi-project (federated-merge, see #1332) file
|
|
53
|
+
* — see {@link resolveOwningIfcProjectId}.
|
|
46
54
|
* @returns Scale factor to apply to length values (e.g., 0.001 for millimeters)
|
|
47
55
|
*/
|
|
48
56
|
export declare function extractLengthUnitScale(source: Uint8Array | IfcSourceBytes, entityIndex: {
|
|
@@ -50,5 +58,39 @@ export declare function extractLengthUnitScale(source: Uint8Array | IfcSourceByt
|
|
|
50
58
|
get(expressId: number): EntityRef | undefined;
|
|
51
59
|
};
|
|
52
60
|
byType: Map<string, number[]>;
|
|
53
|
-
}): number;
|
|
61
|
+
}, projectId?: number): number;
|
|
62
|
+
/**
|
|
63
|
+
* Resolve the length unit scale that applies to ONE entity, correctly for a
|
|
64
|
+
* multi-`IfcProject` file (a {@link MergedExporter} `unitReconciliation: 'auto'`
|
|
65
|
+
* federated export: a model whose length unit differs from the first model's
|
|
66
|
+
* keeps its own `IfcProject`/`IfcUnitAssignment` rather than being rescaled —
|
|
67
|
+
* see that module's docs).
|
|
68
|
+
*
|
|
69
|
+
* {@link extractLengthUnitScale} (and the `dataStore.lengthUnitScale` it feeds)
|
|
70
|
+
* answers for the FIRST `IfcProject` only. That is exactly right for the
|
|
71
|
+
* overwhelmingly common single-project file, but silently wrong for a
|
|
72
|
+
* federated entity that belongs to a LATER project: e.g. a material layer's
|
|
73
|
+
* `LayerThickness` is a raw literal in ITS OWN project's unit, and scaling it
|
|
74
|
+
* by the first project's factor corrupts the value by whatever ratio
|
|
75
|
+
* separates the two units (a millimetre federated model read back with the
|
|
76
|
+
* metres factor turns a 300 mm layer into a fabricated "300 m" one).
|
|
77
|
+
*
|
|
78
|
+
* Resolves the entity's owning project via {@link resolveOwningIfcProjectId} and
|
|
79
|
+
* reads that project's units, falling back to the first project's scale when
|
|
80
|
+
* the walk can't place the entity, OR when the owning project's own
|
|
81
|
+
* `UnitsInContext` declares no `LENGTHUNIT` at all (`UnitsInContext` is
|
|
82
|
+
* OPTIONAL on `IfcContext`, so a federated model can legitimately arrive
|
|
83
|
+
* with none). {@link extractLengthUnitScale} answers an unconfirmed `1.0`
|
|
84
|
+
* for that case too - absence reading as success - which would silently
|
|
85
|
+
* rescale a millimetre-authored value owned by such a project by 1000x
|
|
86
|
+
* instead of taking the file-wide answer, the same safe-miss direction
|
|
87
|
+
* {@link extractLengthUnitScale} already documents for every other ambiguous
|
|
88
|
+
* case.
|
|
89
|
+
*/
|
|
90
|
+
export declare function resolveEntityLengthUnitScale(source: Uint8Array | IfcSourceBytes, entityIndex: {
|
|
91
|
+
byId: {
|
|
92
|
+
get(expressId: number): EntityRef | undefined;
|
|
93
|
+
};
|
|
94
|
+
byType: Map<string, number[]>;
|
|
95
|
+
}, relationships: RelatedLookup, expressId: number): number;
|
|
54
96
|
//# sourceMappingURL=unit-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unit-extractor.d.ts","sourceRoot":"","sources":["../src/unit-extractor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"unit-extractor.d.ts","sourceRoot":"","sources":["../src/unit-extractor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EAAE,yBAAyB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBxD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgBhE,CAAC;AAyBF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE;IAAE,IAAI,EAAE;QAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,EACvG,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAUR;AAuMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE;IAAE,IAAI,EAAE;QAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,EACvG,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,GAChB,MAAM,CASR"}
|