@cavelang/canonical 0.31.1 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/dist/src/canonicalize.js +3 -3
- package/dist/src/canonicalize.js.map +1 -1
- package/dist/src/emit.d.ts.map +1 -1
- package/dist/src/emit.js +101 -18
- package/dist/src/emit.js.map +1 -1
- package/package.json +3 -3
- package/src/canonicalize.ts +3 -3
- package/src/emit.ts +141 -16
package/README.md
CHANGED
|
@@ -57,6 +57,10 @@ preserves direction and makes reverse reads return the preferred opposite name.
|
|
|
57
57
|
- full claim → canonicalized as usual (inverse resolution applies).
|
|
58
58
|
- **Grouped claims** (§8.4): indented full triples stay independent and
|
|
59
59
|
link to their parent with the `QUALIFIES` edge role (§13.2's role list).
|
|
60
|
+
- **Recursive prefix shorthand** (§8.5): incomplete headers prefix all
|
|
61
|
+
indented descendants and never materialize claims. Completed leaves retain
|
|
62
|
+
the nearest materialized parent edge, and their stored `raw` text is the
|
|
63
|
+
expanded self-contained claim.
|
|
60
64
|
- **Declarations**: `A REVERSE B`, `OLD RENAMED-TO NEW`, and `X IS verb`
|
|
61
65
|
claims update the registry after the line itself is canonicalized.
|
|
62
66
|
|
|
@@ -70,6 +74,20 @@ preserves direction and makes reverse reads return the preferred opposite name.
|
|
|
70
74
|
- `WHEN NOT x`, never `UNLESS` (§8.2);
|
|
71
75
|
- §3.2 anatomy order: payload, `+/- delta`, `(Nσ)`, contexts, tags,
|
|
72
76
|
`@ N%` (omitted at 100%), `!`, `; comment`.
|
|
77
|
+
- recursive factoring of adjacent sibling claims through shared incomplete
|
|
78
|
+
prefixes, stopping before a header would itself parse as a complete claim.
|
|
79
|
+
|
|
80
|
+
For example, two canonical rows emit tersely without changing their keys:
|
|
81
|
+
|
|
82
|
+
```cave
|
|
83
|
+
foo HAS
|
|
84
|
+
a: A
|
|
85
|
+
b: B
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The same factoring applies inside qualifier/grouping trees. Transaction
|
|
89
|
+
annotations remain directly above each materialized leaf, so annotated export
|
|
90
|
+
and sync preserve row identity.
|
|
73
91
|
|
|
74
92
|
Emission of a complete canonicalization result is stable:
|
|
75
93
|
`emit ∘ canonicalize ∘ emit ≡ emit`, and claim keys survive the round trip
|
|
@@ -101,6 +119,9 @@ parseable.
|
|
|
101
119
|
operator input and CAVE-Q `WHERE value <op> ...` filters are unchanged.
|
|
102
120
|
- **Three-way negation XOR** for qualifier conditions: inner `NOT`,
|
|
103
121
|
qualifier-level `NOT`, and `UNLESS` each flip the condition's negation.
|
|
122
|
+
- **Comments do not fan out from headers**: a prefix header comment is
|
|
123
|
+
documentary only. Persisted comments stay on leaf claims, preventing one
|
|
124
|
+
comment from silently becoming metadata on several rows.
|
|
104
125
|
|
|
105
126
|
## Tests
|
|
106
127
|
|
package/dist/src/canonicalize.js
CHANGED
|
@@ -178,7 +178,7 @@ export const canonicalize = (document, registry = Registry.empty) => {
|
|
|
178
178
|
document.lines.forEach((line, lineIndex) => {
|
|
179
179
|
switch (line.kind) {
|
|
180
180
|
case 'claim': {
|
|
181
|
-
const { claim, writtenSubject } = buildClaim(line.claim, line.raw, line.line);
|
|
181
|
+
const { claim, writtenSubject } = buildClaim(line.claim, line.expanded ?? line.raw, line.line);
|
|
182
182
|
const index = append(claim, line.line, writtenSubject, lineIndex);
|
|
183
183
|
if (line.parent !== undefined) {
|
|
184
184
|
const parent = byLine.get(line.parent);
|
|
@@ -196,7 +196,7 @@ export const canonicalize = (document, registry = Registry.empty) => {
|
|
|
196
196
|
return;
|
|
197
197
|
}
|
|
198
198
|
const full = { subject: parent.writtenSubject, ...line.body };
|
|
199
|
-
const { claim, writtenSubject } = buildClaim(full, line.raw, line.line);
|
|
199
|
+
const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line);
|
|
200
200
|
append(claim, line.line, writtenSubject, lineIndex);
|
|
201
201
|
// §8.3: each continuation is an ordinary independent claim, so an
|
|
202
202
|
// in-band declaration works here exactly as on a full line (§5.4).
|
|
@@ -210,7 +210,7 @@ export const canonicalize = (document, registry = Registry.empty) => {
|
|
|
210
210
|
return;
|
|
211
211
|
}
|
|
212
212
|
const full = conditionOf(line.payload, line.qualifier === 'UNLESS');
|
|
213
|
-
const { claim, writtenSubject } = buildClaim(full, line.raw, line.line);
|
|
213
|
+
const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line);
|
|
214
214
|
const index = append(claim, line.line, writtenSubject, lineIndex);
|
|
215
215
|
edges.push({ parent: parent.index, role: roleOf[line.qualifier], child: index });
|
|
216
216
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalize.js","sourceRoot":"","sources":["../../src/canonicalize.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"canonicalize.js","sourceRoot":"","sources":["../../src/canonicalize.ts"],"names":[],"mappings":"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"}
|
package/dist/src/emit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAA0B,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAA0B,MAAM,gBAAgB,CAAA;AAE9D,OAAO,KAAK,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAyCtD,gEAAgE;AAChE,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,CAAC,CAAC,KAAG,MAW1C,CAAA;AAgBD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,KAAG,MAC3B,CAAA;AAIZ;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,KAAG,SAAS,GAAG,MAC1B,CAAA;AAEzB,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,CAAA;CAC1D,CAAA;AAuHD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,GAAI,QAAQ,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,UAAS,WAAgB,KAAG,MAoDvG,CAAA"}
|
package/dist/src/emit.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* (`QUALIFIES` edges) re-indent as full lines.
|
|
9
9
|
*/
|
|
10
10
|
import { Claim, Confidence, Tag, Value } from '@cavelang/core';
|
|
11
|
+
import { parseDocument, Token } from '@cavelang/parser';
|
|
11
12
|
const payloadText = (payload) => {
|
|
12
13
|
switch (payload.kind) {
|
|
13
14
|
case 'relation':
|
|
@@ -86,6 +87,82 @@ const txLineRe = /^\s*;@\s+(\S+)\s*$/;
|
|
|
86
87
|
* caller validates the id shape.
|
|
87
88
|
*/
|
|
88
89
|
export const txOfLine = (raw) => txLineRe.exec(raw)?.[1];
|
|
90
|
+
const tokenText = (token) => {
|
|
91
|
+
switch (token.kind) {
|
|
92
|
+
case 'text':
|
|
93
|
+
return `"${token.text}"`;
|
|
94
|
+
case 'code':
|
|
95
|
+
return `\`${token.text}\``;
|
|
96
|
+
case 'word':
|
|
97
|
+
return token.text;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const renderParts = (text) => {
|
|
101
|
+
const split = Token.splitComment(text);
|
|
102
|
+
return {
|
|
103
|
+
tokens: Token.tokenize(split.head).map(tokenText),
|
|
104
|
+
...split.comment === undefined ? {} : { comment: split.comment }
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
const commonPrefixLength = (items) => {
|
|
108
|
+
const shortest = Math.min(...items.map(item => item.tokens.length));
|
|
109
|
+
let length = 0;
|
|
110
|
+
while (length < shortest &&
|
|
111
|
+
items.every(item => item.tokens[length] === items[0].tokens[length])) {
|
|
112
|
+
length += 1;
|
|
113
|
+
}
|
|
114
|
+
return length;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* A factored header is safe only while the accumulated text is not itself a
|
|
118
|
+
* materialized claim. This is the compatibility boundary with §8's existing
|
|
119
|
+
* indentation: complete lines keep qualifier/continuation/grouping meaning;
|
|
120
|
+
* incomplete lines may be shorthand prefixes (§8.5).
|
|
121
|
+
*/
|
|
122
|
+
const isIncomplete = (tokens, topLevel) => {
|
|
123
|
+
const text = tokens.join(' ');
|
|
124
|
+
const document = parseDocument(topLevel ? text : `cave-root IS claim\n ${text}`);
|
|
125
|
+
return document.lines[document.lines.length - 1].kind === 'invalid';
|
|
126
|
+
};
|
|
127
|
+
const emitForest = (forest, depth, topLevel, inherited, lines) => {
|
|
128
|
+
let at = 0;
|
|
129
|
+
while (at < forest.length) {
|
|
130
|
+
const firstToken = forest[at].tokens[0];
|
|
131
|
+
let end = at + 1;
|
|
132
|
+
while (end < forest.length && forest[end].tokens[0] === firstToken) {
|
|
133
|
+
end += 1;
|
|
134
|
+
}
|
|
135
|
+
const run = forest.slice(at, end);
|
|
136
|
+
if (run.length > 1) {
|
|
137
|
+
const common = commonPrefixLength(run);
|
|
138
|
+
const shortest = Math.min(...run.map(item => item.tokens.length));
|
|
139
|
+
const maximum = Math.min(common, shortest - 1);
|
|
140
|
+
let safe = 0;
|
|
141
|
+
for (let length = 1; length <= maximum; length += 1) {
|
|
142
|
+
const candidate = [...inherited, ...run[0].tokens.slice(0, length)];
|
|
143
|
+
if (!isIncomplete(candidate, topLevel)) {
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
safe = length;
|
|
147
|
+
}
|
|
148
|
+
if (safe > 0) {
|
|
149
|
+
const prefix = run[0].tokens.slice(0, safe);
|
|
150
|
+
lines.push(`${' '.repeat(depth)}${prefix.join(' ')}`);
|
|
151
|
+
emitForest(run.map(item => ({ node: item.node, tokens: item.tokens.slice(safe) })), depth + 1, topLevel, [...inherited, ...prefix], lines);
|
|
152
|
+
at = end;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const item = forest[at];
|
|
157
|
+
const indent = ' '.repeat(depth);
|
|
158
|
+
if (item.node.annotation !== undefined) {
|
|
159
|
+
lines.push(`${indent}${item.node.annotation}`);
|
|
160
|
+
}
|
|
161
|
+
lines.push(`${indent}${item.tokens.join(' ')}${item.node.comment === undefined ? '' : ` ; ${item.node.comment}`}`);
|
|
162
|
+
emitForest(item.node.children.map(node => ({ node, tokens: node.tokens })), depth + 1, false, [], lines);
|
|
163
|
+
at += 1;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
89
166
|
/**
|
|
90
167
|
* Emits a whole canonicalization result as canonical CAVE text: top-level
|
|
91
168
|
* claims in claim order, children indented two spaces per level.
|
|
@@ -113,39 +190,45 @@ export const emit = (result, options = {}) => {
|
|
|
113
190
|
existing.push(edge);
|
|
114
191
|
}
|
|
115
192
|
}
|
|
116
|
-
const lines = [];
|
|
117
193
|
const expanded = new Set();
|
|
118
|
-
const
|
|
194
|
+
const nodeAt = (index, role) => {
|
|
119
195
|
const { claim } = result.claims[index];
|
|
120
|
-
const
|
|
196
|
+
const text = role === undefined || role === 'QUALIFIES' ?
|
|
197
|
+
emitClaim(claim) :
|
|
198
|
+
`${role} ${conditionText(claim)}`;
|
|
199
|
+
const parts = renderParts(text);
|
|
121
200
|
const annotation = options.annotate?.(index);
|
|
122
|
-
if (annotation !== undefined) {
|
|
123
|
-
lines.push(`${indent}${annotation}`);
|
|
124
|
-
}
|
|
125
|
-
if (role === undefined || role === 'QUALIFIES') {
|
|
126
|
-
lines.push(`${indent}${emitClaim(claim)}`);
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
lines.push(`${indent}${role} ${conditionText(claim)}`);
|
|
130
|
-
}
|
|
131
201
|
if (expanded.has(index)) {
|
|
132
|
-
return
|
|
202
|
+
return {
|
|
203
|
+
index,
|
|
204
|
+
tokens: parts.tokens,
|
|
205
|
+
...parts.comment === undefined ? {} : { comment: parts.comment },
|
|
206
|
+
...annotation === undefined ? {} : { annotation },
|
|
207
|
+
children: []
|
|
208
|
+
};
|
|
133
209
|
}
|
|
134
210
|
expanded.add(index);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
211
|
+
return {
|
|
212
|
+
index,
|
|
213
|
+
tokens: parts.tokens,
|
|
214
|
+
...parts.comment === undefined ? {} : { comment: parts.comment },
|
|
215
|
+
...annotation === undefined ? {} : { annotation },
|
|
216
|
+
children: (childEdges.get(index) ?? []).map(edge => nodeAt(edge.child, edge.role))
|
|
217
|
+
};
|
|
138
218
|
};
|
|
219
|
+
const forest = [];
|
|
139
220
|
result.claims.forEach((_, index) => {
|
|
140
221
|
if (!isChild.has(index)) {
|
|
141
|
-
|
|
222
|
+
forest.push(nodeAt(index, undefined));
|
|
142
223
|
}
|
|
143
224
|
});
|
|
144
225
|
result.claims.forEach((_, index) => {
|
|
145
226
|
if (!expanded.has(index)) {
|
|
146
|
-
|
|
227
|
+
forest.push(nodeAt(index, undefined));
|
|
147
228
|
}
|
|
148
229
|
});
|
|
230
|
+
const lines = [];
|
|
231
|
+
emitForest(forest.map(node => ({ node, tokens: node.tokens })), 0, true, [], lines);
|
|
149
232
|
return lines.length === 0 ? '' : `${lines.join('\n')}\n`;
|
|
150
233
|
};
|
|
151
234
|
//# sourceMappingURL=emit.js.map
|
package/dist/src/emit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/emit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cavelang/canonical",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "CAVE canonicalization — verb lifecycle and inverse registry, continuation expansion, canonical emitter.",
|
|
6
6
|
"keywords": [
|
|
@@ -43,8 +43,8 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@cavelang/core": "0.
|
|
47
|
-
"@cavelang/parser": "0.
|
|
46
|
+
"@cavelang/core": "0.32.0",
|
|
47
|
+
"@cavelang/parser": "0.32.0"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsc -b",
|
package/src/canonicalize.ts
CHANGED
|
@@ -221,7 +221,7 @@ export const canonicalize = (document: Ast.Document, registry: Registry.t = Regi
|
|
|
221
221
|
document.lines.forEach((line, lineIndex) => {
|
|
222
222
|
switch (line.kind) {
|
|
223
223
|
case 'claim': {
|
|
224
|
-
const { claim, writtenSubject } = buildClaim(line.claim, line.raw, line.line)
|
|
224
|
+
const { claim, writtenSubject } = buildClaim(line.claim, line.expanded ?? line.raw, line.line)
|
|
225
225
|
const index = append(claim, line.line, writtenSubject, lineIndex)
|
|
226
226
|
if (line.parent !== undefined) {
|
|
227
227
|
const parent = byLine.get(line.parent)
|
|
@@ -239,7 +239,7 @@ export const canonicalize = (document: Ast.Document, registry: Registry.t = Regi
|
|
|
239
239
|
return
|
|
240
240
|
}
|
|
241
241
|
const full: Ast.Full = { subject: parent.writtenSubject, ...line.body }
|
|
242
|
-
const { claim, writtenSubject } = buildClaim(full, line.raw, line.line)
|
|
242
|
+
const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line)
|
|
243
243
|
append(claim, line.line, writtenSubject, lineIndex)
|
|
244
244
|
// §8.3: each continuation is an ordinary independent claim, so an
|
|
245
245
|
// in-band declaration works here exactly as on a full line (§5.4).
|
|
@@ -253,7 +253,7 @@ export const canonicalize = (document: Ast.Document, registry: Registry.t = Regi
|
|
|
253
253
|
return
|
|
254
254
|
}
|
|
255
255
|
const full = conditionOf(line.payload, line.qualifier === 'UNLESS')
|
|
256
|
-
const { claim, writtenSubject } = buildClaim(full, line.raw, line.line)
|
|
256
|
+
const { claim, writtenSubject } = buildClaim(full, line.expanded ?? line.raw, line.line)
|
|
257
257
|
const index = append(claim, line.line, writtenSubject, lineIndex)
|
|
258
258
|
edges.push({ parent: parent.index, role: roleOf[line.qualifier], child: index })
|
|
259
259
|
return
|
package/src/emit.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { Claim, Confidence, Tag, Value } from '@cavelang/core'
|
|
12
|
+
import { parseDocument, Token } from '@cavelang/parser'
|
|
12
13
|
import type * as Canonicalize from './canonicalize.ts'
|
|
13
14
|
|
|
14
15
|
const payloadText = (payload: Claim.Payload): undefined | string => {
|
|
@@ -108,6 +109,123 @@ export type EmitOptions = {
|
|
|
108
109
|
readonly annotate?: (index: number) => undefined | string
|
|
109
110
|
}
|
|
110
111
|
|
|
112
|
+
type RenderNode = {
|
|
113
|
+
readonly index: number
|
|
114
|
+
readonly tokens: readonly string[]
|
|
115
|
+
readonly comment?: string
|
|
116
|
+
readonly annotation?: string
|
|
117
|
+
readonly children: readonly RenderNode[]
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
type RenderItem = {
|
|
121
|
+
readonly node: RenderNode
|
|
122
|
+
readonly tokens: readonly string[]
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const tokenText = (token: Token.t): string => {
|
|
126
|
+
switch (token.kind) {
|
|
127
|
+
case 'text':
|
|
128
|
+
return `"${token.text}"`
|
|
129
|
+
case 'code':
|
|
130
|
+
return `\`${token.text}\``
|
|
131
|
+
case 'word':
|
|
132
|
+
return token.text
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const renderParts = (text: string): { tokens: readonly string[], comment?: string } => {
|
|
137
|
+
const split = Token.splitComment(text)
|
|
138
|
+
return {
|
|
139
|
+
tokens: Token.tokenize(split.head).map(tokenText),
|
|
140
|
+
...split.comment === undefined ? {} : { comment: split.comment }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const commonPrefixLength = (items: readonly RenderItem[]): number => {
|
|
145
|
+
const shortest = Math.min(...items.map(item => item.tokens.length))
|
|
146
|
+
let length = 0
|
|
147
|
+
while (
|
|
148
|
+
length < shortest &&
|
|
149
|
+
items.every(item => item.tokens[length] === items[0]!.tokens[length])
|
|
150
|
+
) {
|
|
151
|
+
length += 1
|
|
152
|
+
}
|
|
153
|
+
return length
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* A factored header is safe only while the accumulated text is not itself a
|
|
158
|
+
* materialized claim. This is the compatibility boundary with §8's existing
|
|
159
|
+
* indentation: complete lines keep qualifier/continuation/grouping meaning;
|
|
160
|
+
* incomplete lines may be shorthand prefixes (§8.5).
|
|
161
|
+
*/
|
|
162
|
+
const isIncomplete = (tokens: readonly string[], topLevel: boolean): boolean => {
|
|
163
|
+
const text = tokens.join(' ')
|
|
164
|
+
const document = parseDocument(topLevel ? text : `cave-root IS claim\n ${text}`)
|
|
165
|
+
return document.lines[document.lines.length - 1]!.kind === 'invalid'
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const emitForest = (
|
|
169
|
+
forest: readonly RenderItem[],
|
|
170
|
+
depth: number,
|
|
171
|
+
topLevel: boolean,
|
|
172
|
+
inherited: readonly string[],
|
|
173
|
+
lines: string[]
|
|
174
|
+
): void => {
|
|
175
|
+
let at = 0
|
|
176
|
+
while (at < forest.length) {
|
|
177
|
+
const firstToken = forest[at]!.tokens[0]
|
|
178
|
+
let end = at + 1
|
|
179
|
+
while (end < forest.length && forest[end]!.tokens[0] === firstToken) {
|
|
180
|
+
end += 1
|
|
181
|
+
}
|
|
182
|
+
const run = forest.slice(at, end)
|
|
183
|
+
if (run.length > 1) {
|
|
184
|
+
const common = commonPrefixLength(run)
|
|
185
|
+
const shortest = Math.min(...run.map(item => item.tokens.length))
|
|
186
|
+
const maximum = Math.min(common, shortest - 1)
|
|
187
|
+
let safe = 0
|
|
188
|
+
for (let length = 1; length <= maximum; length += 1) {
|
|
189
|
+
const candidate = [...inherited, ...run[0]!.tokens.slice(0, length)]
|
|
190
|
+
if (!isIncomplete(candidate, topLevel)) {
|
|
191
|
+
break
|
|
192
|
+
}
|
|
193
|
+
safe = length
|
|
194
|
+
}
|
|
195
|
+
if (safe > 0) {
|
|
196
|
+
const prefix = run[0]!.tokens.slice(0, safe)
|
|
197
|
+
lines.push(`${' '.repeat(depth)}${prefix.join(' ')}`)
|
|
198
|
+
emitForest(
|
|
199
|
+
run.map(item => ({ node: item.node, tokens: item.tokens.slice(safe) })),
|
|
200
|
+
depth + 1,
|
|
201
|
+
topLevel,
|
|
202
|
+
[...inherited, ...prefix],
|
|
203
|
+
lines
|
|
204
|
+
)
|
|
205
|
+
at = end
|
|
206
|
+
continue
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const item = forest[at]!
|
|
211
|
+
const indent = ' '.repeat(depth)
|
|
212
|
+
if (item.node.annotation !== undefined) {
|
|
213
|
+
lines.push(`${indent}${item.node.annotation}`)
|
|
214
|
+
}
|
|
215
|
+
lines.push(
|
|
216
|
+
`${indent}${item.tokens.join(' ')}${item.node.comment === undefined ? '' : ` ; ${item.node.comment}`}`
|
|
217
|
+
)
|
|
218
|
+
emitForest(
|
|
219
|
+
item.node.children.map(node => ({ node, tokens: node.tokens })),
|
|
220
|
+
depth + 1,
|
|
221
|
+
false,
|
|
222
|
+
[],
|
|
223
|
+
lines
|
|
224
|
+
)
|
|
225
|
+
at += 1
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
111
229
|
/**
|
|
112
230
|
* Emits a whole canonicalization result as canonical CAVE text: top-level
|
|
113
231
|
* claims in claim order, children indented two spaces per level.
|
|
@@ -134,37 +252,44 @@ export const emit = (result: Pick<Canonicalize.Result, 'claims' | 'edges'>, opti
|
|
|
134
252
|
existing.push(edge)
|
|
135
253
|
}
|
|
136
254
|
}
|
|
137
|
-
const lines: string[] = []
|
|
138
255
|
const expanded = new Set<number>()
|
|
139
|
-
const
|
|
256
|
+
const nodeAt = (index: number, role: undefined | Canonicalize.EdgeRole): RenderNode => {
|
|
140
257
|
const { claim } = result.claims[index]!
|
|
141
|
-
const
|
|
258
|
+
const text = role === undefined || role === 'QUALIFIES' ?
|
|
259
|
+
emitClaim(claim) :
|
|
260
|
+
`${role} ${conditionText(claim)}`
|
|
261
|
+
const parts = renderParts(text)
|
|
142
262
|
const annotation = options.annotate?.(index)
|
|
143
|
-
if (annotation !== undefined) {
|
|
144
|
-
lines.push(`${indent}${annotation}`)
|
|
145
|
-
}
|
|
146
|
-
if (role === undefined || role === 'QUALIFIES') {
|
|
147
|
-
lines.push(`${indent}${emitClaim(claim)}`)
|
|
148
|
-
} else {
|
|
149
|
-
lines.push(`${indent}${role} ${conditionText(claim)}`)
|
|
150
|
-
}
|
|
151
263
|
if (expanded.has(index)) {
|
|
152
|
-
return
|
|
264
|
+
return {
|
|
265
|
+
index,
|
|
266
|
+
tokens: parts.tokens,
|
|
267
|
+
...parts.comment === undefined ? {} : { comment: parts.comment },
|
|
268
|
+
...annotation === undefined ? {} : { annotation },
|
|
269
|
+
children: []
|
|
270
|
+
}
|
|
153
271
|
}
|
|
154
272
|
expanded.add(index)
|
|
155
|
-
|
|
156
|
-
|
|
273
|
+
return {
|
|
274
|
+
index,
|
|
275
|
+
tokens: parts.tokens,
|
|
276
|
+
...parts.comment === undefined ? {} : { comment: parts.comment },
|
|
277
|
+
...annotation === undefined ? {} : { annotation },
|
|
278
|
+
children: (childEdges.get(index) ?? []).map(edge => nodeAt(edge.child, edge.role))
|
|
157
279
|
}
|
|
158
280
|
}
|
|
281
|
+
const forest: RenderNode[] = []
|
|
159
282
|
result.claims.forEach((_, index) => {
|
|
160
283
|
if (!isChild.has(index)) {
|
|
161
|
-
|
|
284
|
+
forest.push(nodeAt(index, undefined))
|
|
162
285
|
}
|
|
163
286
|
})
|
|
164
287
|
result.claims.forEach((_, index) => {
|
|
165
288
|
if (!expanded.has(index)) {
|
|
166
|
-
|
|
289
|
+
forest.push(nodeAt(index, undefined))
|
|
167
290
|
}
|
|
168
291
|
})
|
|
292
|
+
const lines: string[] = []
|
|
293
|
+
emitForest(forest.map(node => ({ node, tokens: node.tokens })), 0, true, [], lines)
|
|
169
294
|
return lines.length === 0 ? '' : `${lines.join('\n')}\n`
|
|
170
295
|
}
|