structural-codes-viewer 0.1.0-alpha.1 → 0.1.0-alpha.2

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 (135) hide show
  1. package/LICENSE +501 -0
  2. package/NOTICE +16 -0
  3. package/README.md +119 -63
  4. package/package-dist/CorpusContent.d.ts +44 -9
  5. package/package-dist/CorpusContent.js +452 -26
  6. package/package-dist/CorpusContent.js.map +1 -1
  7. package/package-dist/NormativeViewer.d.ts +23 -2
  8. package/package-dist/NormativeViewer.js +1699 -234
  9. package/package-dist/NormativeViewer.js.map +1 -1
  10. package/package-dist/ReferenceTools.d.ts +49 -0
  11. package/package-dist/ReferenceTools.js +14 -0
  12. package/package-dist/ReferenceTools.js.map +1 -0
  13. package/package-dist/annotations/AnnotationUi.d.ts +57 -0
  14. package/package-dist/annotations/AnnotationUi.js +114 -0
  15. package/package-dist/annotations/AnnotationUi.js.map +1 -0
  16. package/package-dist/annotations/annotationTargets.d.ts +39 -0
  17. package/package-dist/annotations/annotationTargets.js +94 -0
  18. package/package-dist/annotations/annotationTargets.js.map +1 -0
  19. package/package-dist/annotations/exportImport.d.ts +6 -0
  20. package/package-dist/annotations/exportImport.js +30 -0
  21. package/package-dist/annotations/exportImport.js.map +1 -0
  22. package/package-dist/annotations/index.d.ts +4 -0
  23. package/package-dist/annotations/index.js +5 -0
  24. package/package-dist/annotations/index.js.map +1 -0
  25. package/package-dist/annotations/indexedDb.d.ts +21 -0
  26. package/package-dist/annotations/indexedDb.js +210 -0
  27. package/package-dist/annotations/indexedDb.js.map +1 -0
  28. package/package-dist/annotations/schema.d.ts +8 -0
  29. package/package-dist/annotations/schema.js +102 -0
  30. package/package-dist/annotations/schema.js.map +1 -0
  31. package/package-dist/annotations/types.d.ts +52 -0
  32. package/package-dist/annotations/types.js +18 -0
  33. package/package-dist/annotations/types.js.map +1 -0
  34. package/package-dist/chatntc/canonicalization.d.ts +15 -0
  35. package/package-dist/chatntc/canonicalization.js +107 -0
  36. package/package-dist/chatntc/canonicalization.js.map +1 -0
  37. package/package-dist/chatntc/directives.d.ts +2 -0
  38. package/package-dist/chatntc/directives.js +38 -0
  39. package/package-dist/chatntc/directives.js.map +1 -0
  40. package/package-dist/chatntc/evidence.d.ts +17 -0
  41. package/package-dist/chatntc/evidence.js +116 -0
  42. package/package-dist/chatntc/evidence.js.map +1 -0
  43. package/package-dist/chatntc/index.d.ts +10 -0
  44. package/package-dist/chatntc/index.js +9 -0
  45. package/package-dist/chatntc/index.js.map +1 -0
  46. package/package-dist/chatntc/issueCategories.d.ts +2 -0
  47. package/package-dist/chatntc/issueCategories.js +11 -0
  48. package/package-dist/chatntc/issueCategories.js.map +1 -0
  49. package/package-dist/chatntc/policy.d.ts +35 -0
  50. package/package-dist/chatntc/policy.js +36 -0
  51. package/package-dist/chatntc/policy.js.map +1 -0
  52. package/package-dist/chatntc/provider.d.ts +42 -0
  53. package/package-dist/chatntc/provider.js +2 -0
  54. package/package-dist/chatntc/provider.js.map +1 -0
  55. package/package-dist/chatntc/responseContract.d.ts +52 -0
  56. package/package-dist/chatntc/responseContract.js +73 -0
  57. package/package-dist/chatntc/responseContract.js.map +1 -0
  58. package/package-dist/chatntc/retrieval.d.ts +5 -0
  59. package/package-dist/chatntc/retrieval.js +220 -0
  60. package/package-dist/chatntc/retrieval.js.map +1 -0
  61. package/package-dist/chatntc/types.d.ts +240 -0
  62. package/package-dist/chatntc/types.js +2 -0
  63. package/package-dist/chatntc/types.js.map +1 -0
  64. package/package-dist/chatntc/validation.d.ts +8 -0
  65. package/package-dist/chatntc/validation.js +299 -0
  66. package/package-dist/chatntc/validation.js.map +1 -0
  67. package/package-dist/chatntc/viewerArtifacts.d.ts +14 -0
  68. package/package-dist/chatntc/viewerArtifacts.js +168 -0
  69. package/package-dist/chatntc/viewerArtifacts.js.map +1 -0
  70. package/package-dist/chatntc-history/index.d.ts +2 -0
  71. package/package-dist/chatntc-history/index.js +3 -0
  72. package/package-dist/chatntc-history/index.js.map +1 -0
  73. package/package-dist/chatntc-history/indexedDb.d.ts +27 -0
  74. package/package-dist/chatntc-history/indexedDb.js +258 -0
  75. package/package-dist/chatntc-history/indexedDb.js.map +1 -0
  76. package/package-dist/chatntc-history/schema.d.ts +5 -0
  77. package/package-dist/chatntc-history/schema.js +102 -0
  78. package/package-dist/chatntc-history/schema.js.map +1 -0
  79. package/package-dist/chatntc-history/types.d.ts +78 -0
  80. package/package-dist/chatntc-history/types.js +23 -0
  81. package/package-dist/chatntc-history/types.js.map +1 -0
  82. package/package-dist/chatntc-ui/ChatNTCHistoryPanel.d.ts +9 -0
  83. package/package-dist/chatntc-ui/ChatNTCHistoryPanel.js +239 -0
  84. package/package-dist/chatntc-ui/ChatNTCHistoryPanel.js.map +1 -0
  85. package/package-dist/chatntc-ui/ChatNTCIcons.d.ts +10 -0
  86. package/package-dist/chatntc-ui/ChatNTCIcons.js +20 -0
  87. package/package-dist/chatntc-ui/ChatNTCIcons.js.map +1 -0
  88. package/package-dist/chatntc-ui/ChatNTCLoadingSkeleton.d.ts +1 -0
  89. package/package-dist/chatntc-ui/ChatNTCLoadingSkeleton.js +5 -0
  90. package/package-dist/chatntc-ui/ChatNTCLoadingSkeleton.js.map +1 -0
  91. package/package-dist/chatntc-ui/ChatNTCMarkdown.d.ts +14 -0
  92. package/package-dist/chatntc-ui/ChatNTCMarkdown.js +112 -0
  93. package/package-dist/chatntc-ui/ChatNTCMarkdown.js.map +1 -0
  94. package/package-dist/chatntc-ui/ChatNTCPanel.d.ts +29 -0
  95. package/package-dist/chatntc-ui/ChatNTCPanel.js +241 -0
  96. package/package-dist/chatntc-ui/ChatNTCPanel.js.map +1 -0
  97. package/package-dist/chatntc-ui/historyMessages.d.ts +5 -0
  98. package/package-dist/chatntc-ui/historyMessages.js +53 -0
  99. package/package-dist/chatntc-ui/historyMessages.js.map +1 -0
  100. package/package-dist/chatntc-ui/index.d.ts +3 -0
  101. package/package-dist/chatntc-ui/index.js +4 -0
  102. package/package-dist/chatntc-ui/index.js.map +1 -0
  103. package/package-dist/chatntc-ui/transport.d.ts +51 -0
  104. package/package-dist/chatntc-ui/transport.js +9 -0
  105. package/package-dist/chatntc-ui/transport.js.map +1 -0
  106. package/package-dist/chunkNavigation.d.ts +12 -0
  107. package/package-dist/chunkNavigation.js +44 -0
  108. package/package-dist/chunkNavigation.js.map +1 -0
  109. package/package-dist/corpusData.d.ts +176 -33
  110. package/package-dist/corpusData.js +52 -0
  111. package/package-dist/corpusData.js.map +1 -1
  112. package/package-dist/crossReferences.d.ts +46 -0
  113. package/package-dist/crossReferences.js +198 -0
  114. package/package-dist/crossReferences.js.map +1 -0
  115. package/package-dist/generate-artifacts.mjs +47 -12
  116. package/package-dist/globalScrubber.d.ts +10 -0
  117. package/package-dist/globalScrubber.js +85 -0
  118. package/package-dist/globalScrubber.js.map +1 -0
  119. package/package-dist/permalinks.d.ts +22 -0
  120. package/package-dist/permalinks.js +36 -0
  121. package/package-dist/permalinks.js.map +1 -0
  122. package/package-dist/searchClient.d.ts +22 -0
  123. package/package-dist/searchClient.js +133 -0
  124. package/package-dist/searchClient.js.map +1 -0
  125. package/package-dist/searchEngine.d.ts +68 -0
  126. package/package-dist/searchEngine.js +558 -0
  127. package/package-dist/searchEngine.js.map +1 -0
  128. package/package-dist/searchWorker.d.ts +1 -0
  129. package/package-dist/searchWorker.js +32 -0
  130. package/package-dist/searchWorker.js.map +1 -0
  131. package/package-dist/styles.css +927 -182
  132. package/package-dist/tableCaptions.d.mts +3 -0
  133. package/package-dist/tableCaptions.mjs +35 -0
  134. package/package-dist/tableCaptions.mjs.map +1 -0
  135. package/package.json +61 -15
@@ -1,15 +1,47 @@
1
1
  export type DocumentId = "ntc2018" | "circ2019";
2
2
  export type ViewerMode = "ntc" | "circ" | "combined";
3
+ export type InlineSegment = {
4
+ kind: "text";
5
+ value: string;
6
+ } | {
7
+ kind: "em";
8
+ value: string;
9
+ } | {
10
+ kind: "underline";
11
+ value: string;
12
+ } | {
13
+ kind: "em-underline";
14
+ value: string;
15
+ } | {
16
+ kind: "strong";
17
+ value: string;
18
+ } | {
19
+ kind: "strong-em";
20
+ value: string;
21
+ } | {
22
+ kind: "strong-underline";
23
+ value: string;
24
+ } | {
25
+ kind: "math";
26
+ value: string;
27
+ latex: string;
28
+ };
29
+ export interface TextParagraph {
30
+ normalized: string;
31
+ inline?: InlineSegment[];
32
+ listMarker?: "numbered" | "bullet" | "dash";
33
+ listLevel?: number;
34
+ }
3
35
  export interface Evidence {
4
36
  sourceId: string;
5
37
  pdfPage: number;
6
38
  printedPage: string | null;
7
- region: {
39
+ region?: {
8
40
  x: number;
9
41
  y: number;
10
42
  width: number;
11
43
  height: number;
12
- };
44
+ } | null;
13
45
  transformations?: Array<{
14
46
  operation: string;
15
47
  note: string;
@@ -21,72 +53,100 @@ export interface CorpusBlock {
21
53
  blockId: string;
22
54
  kind: string;
23
55
  origin: string;
56
+ listMarker?: "bullet" | "dash" | "none";
57
+ listLevel?: number;
58
+ indentLevel?: number;
24
59
  text?: {
25
60
  raw: string;
26
61
  normalized: string;
27
62
  normalizationVersion: string;
28
- inline?: Array<{
29
- kind: "text";
30
- value: string;
31
- } | {
32
- kind: "math";
33
- value: string;
34
- latex: string;
35
- }>;
63
+ inline?: InlineSegment[];
64
+ paragraphs?: TextParagraph[];
36
65
  };
37
66
  assetId?: string;
38
67
  evidence?: Evidence;
39
68
  }
40
69
  export interface FormulaAsset {
41
70
  id: string;
71
+ unitId?: string;
42
72
  officialNumber: string | null;
43
73
  pdfPage: number;
44
74
  latex: string;
45
75
  }
76
+ export interface TableCellImage {
77
+ imagePath: string;
78
+ alt: string;
79
+ sha256: string;
80
+ region: {
81
+ x: number;
82
+ y: number;
83
+ width: number;
84
+ height: number;
85
+ };
86
+ }
46
87
  export interface TableCell {
47
88
  text: string;
48
89
  latex?: string;
90
+ inline?: InlineSegment[];
91
+ image?: TableCellImage;
49
92
  colSpan?: number;
50
93
  rowSpan?: number;
94
+ strong?: boolean;
95
+ align?: "left" | "center" | "right";
96
+ noWrap?: boolean;
97
+ header?: boolean;
98
+ verticalText?: boolean;
99
+ shade?: "gray";
100
+ spacer?: boolean;
101
+ subrowIndent?: boolean;
102
+ subrowLabel?: boolean;
51
103
  }
52
104
  export interface TableAsset {
53
105
  id: string;
106
+ unitId?: string;
107
+ columnCount?: number;
108
+ columnWidths?: number[];
109
+ footerColumnCount?: number;
110
+ footerColumnWidths?: number[];
54
111
  officialNumber: string | null;
55
112
  pdfPage: number;
56
113
  caption: string | null;
114
+ hideLabel?: boolean;
115
+ captionInline?: InlineSegment[];
57
116
  headers: TableCell[][];
58
117
  rows: TableCell[][];
118
+ footerRows?: TableCell[][];
59
119
  notes: string[];
120
+ notesInline?: InlineSegment[][];
60
121
  }
61
122
  export interface FigureAsset {
62
123
  id: string;
124
+ unitId?: string;
125
+ sha256?: string;
63
126
  officialNumber: string;
64
127
  pdfPage: number;
65
- caption: string;
128
+ caption: string | null;
129
+ captionInline?: InlineSegment[];
66
130
  alt: string;
67
131
  imagePath: string;
68
132
  region?: {
69
133
  width: number;
70
134
  height: number;
71
135
  };
136
+ displayScale?: number;
72
137
  }
73
138
  export interface AssetBundle {
74
139
  formulas: Record<string, FormulaAsset>;
75
140
  tables: Record<string, TableAsset>;
76
141
  figures: Record<string, FigureAsset>;
77
142
  }
78
- export interface OpenIssue {
79
- issueId: string;
80
- type: string;
81
- severity: "blocking" | "warning" | "info";
82
- note: string;
83
- }
84
143
  export interface Relation {
85
144
  relationId: string;
86
145
  type: string;
87
146
  targetUnitId: string;
88
147
  basis: string;
89
148
  rationale: string;
149
+ evidenceBlockIds?: string[];
90
150
  review: {
91
151
  status: string;
92
152
  };
@@ -100,6 +160,7 @@ export interface CorpusUnit {
100
160
  sortKey: string;
101
161
  };
102
162
  title: string;
163
+ titleBlockId?: string;
103
164
  hierarchy: {
104
165
  parentId: string | null;
105
166
  ancestorIds: string[];
@@ -113,9 +174,8 @@ export interface CorpusUnit {
113
174
  };
114
175
  blocks: CorpusBlock[];
115
176
  relations: Relation[];
116
- workflow: {
117
- status: string;
118
- openIssues: OpenIssue[];
177
+ review: {
178
+ status: "draft" | "verified";
119
179
  };
120
180
  }
121
181
  export interface UnitSummary {
@@ -129,9 +189,7 @@ export interface UnitSummary {
129
189
  title: string;
130
190
  hierarchy: CorpusUnit["hierarchy"];
131
191
  validity: CorpusUnit["validity"];
132
- workflowStatus: string;
133
- openIssueCount: number;
134
- blockingIssueCount: number;
192
+ reviewStatus: "draft" | "verified";
135
193
  chunkPath: string;
136
194
  }
137
195
  export interface DocumentMetadata {
@@ -166,7 +224,6 @@ export interface CorpusManifest {
166
224
  explicitRelations: number;
167
225
  proposedRelations: number;
168
226
  suggestedRelationDiagnostics: number;
169
- reviewedUnits: number;
170
227
  assetUnits: number;
171
228
  formulas: number;
172
229
  tables: number;
@@ -177,6 +234,7 @@ export interface CorpusManifest {
177
234
  relationsPath: string;
178
235
  relationDiagnosticsPath: string;
179
236
  searchIndexPath: string;
237
+ crossReferenceIndexPath: string;
180
238
  chunks: Array<{
181
239
  path: string;
182
240
  document: DocumentId;
@@ -215,21 +273,106 @@ export interface RelationsIndex {
215
273
  inferredRelationsIncluded: false;
216
274
  relations: RelationEdge[];
217
275
  }
276
+ export type SearchMatchKind = "number-exact" | "asset-exact" | "title" | "number-keyword" | "phrase" | "proximity" | "text" | "partial";
277
+ export type SearchAssetKind = "formula" | "table" | "figure";
278
+ export interface SearchSegment {
279
+ blockId: string;
280
+ assetId?: string;
281
+ assetKind?: SearchAssetKind;
282
+ officialNumber?: string;
283
+ text: string;
284
+ }
285
+ export interface SearchUnit {
286
+ id: string;
287
+ document: DocumentId;
288
+ numbering: string;
289
+ title: string;
290
+ titleNormalized: string;
291
+ titleBlockId?: string;
292
+ chunkPath: string;
293
+ segments: SearchSegment[];
294
+ textLength: number;
295
+ assetTextLength: number;
296
+ }
218
297
  export interface SearchIndex {
219
- formatVersion: 2;
220
- units: Array<{
221
- id: string;
222
- document: DocumentId;
223
- numbering: string;
224
- title: string;
225
- chunkPath: string;
226
- text: string;
227
- }>;
298
+ formatVersion: 4;
299
+ normalization: string;
300
+ units: SearchUnit[];
301
+ references: Record<string, [number, number]>;
302
+ assetReferences: Record<string, Array<[number, number]>>;
303
+ postings: Record<string, string>;
304
+ }
305
+ export interface SearchResult {
306
+ id: string;
307
+ document: DocumentId;
308
+ numbering: string;
309
+ title: string;
310
+ chunkPath: string;
311
+ snippet: string;
312
+ highlights: Array<[number, number]>;
313
+ score: number;
314
+ matchKind: SearchMatchKind;
315
+ blockId?: string;
316
+ assetId?: string;
317
+ assetKind?: SearchAssetKind;
318
+ }
319
+ export interface NormativeReference {
320
+ numbering: string;
321
+ documentHint: "circ2019" | null;
322
+ }
323
+ export type CrossReferenceKind = "unit" | "formula" | "table" | "figure";
324
+ export interface CrossReferenceUnit {
325
+ id: string;
326
+ document: DocumentId;
327
+ numbering: string;
328
+ title: string;
329
+ snippet: string;
330
+ }
331
+ export interface CrossReferenceAsset {
332
+ id: string;
333
+ kind: Exclude<CrossReferenceKind, "unit">;
334
+ unitId: string;
335
+ blockId: string;
336
+ officialNumber: string;
337
+ title?: string | null;
338
+ snippet?: string | null;
339
+ }
340
+ export interface TextualBacklink {
341
+ targetType: CrossReferenceKind;
342
+ targetId: string;
343
+ sourceUnitId: string;
344
+ sourceBlockId: string;
345
+ }
346
+ export interface CrossReferenceIndex {
347
+ formatVersion: 1;
348
+ units: CrossReferenceUnit[];
349
+ assets: CrossReferenceAsset[];
350
+ backlinks: TextualBacklink[];
351
+ }
352
+ export interface DocumentLookup {
353
+ unitById: Map<string, UnitSummary>;
354
+ unitByNumbering: Map<string, UnitSummary>;
355
+ unitsByChunkPath: Map<string, UnitSummary[]>;
356
+ chunkPaths: string[];
357
+ chunkIndexByPath: Map<string, number>;
228
358
  }
229
359
  export declare function resolveDataPath(path: string, dataBaseUrl?: string): string;
360
+ export declare function createDocumentLookup(index: DocumentIndex): DocumentLookup;
361
+ export declare function parseNormativeReference(value: string): NormativeReference | null;
362
+ export declare function initialUnitForIndex(index: DocumentIndex, requestedUnitId: string | null): UnitSummary;
363
+ export declare function adjacentChunkPaths(lookup: DocumentLookup, chunkPath: string): {
364
+ previous: null;
365
+ next: null;
366
+ } | {
367
+ previous: string;
368
+ next: string;
369
+ };
370
+ /** Read-only instrumentation used by diagnostics and tests. */
371
+ export declare function cachedJsonPaths(): string[];
230
372
  export declare function documentForMode(mode: ViewerMode): DocumentId;
231
373
  export declare function loadManifest(dataBaseUrl?: string): Promise<CorpusManifest>;
232
374
  export declare function loadDocumentIndex(manifest: CorpusManifest, document: DocumentId, dataBaseUrl?: string): Promise<DocumentIndex>;
233
375
  export declare function loadChunk(path: string, dataBaseUrl?: string): Promise<CorpusChunk>;
234
376
  export declare function loadRelations(manifest: CorpusManifest, dataBaseUrl?: string): Promise<RelationsIndex>;
235
377
  export declare function loadSearchIndex(manifest: CorpusManifest, dataBaseUrl?: string): Promise<SearchIndex>;
378
+ export declare function loadCrossReferenceIndex(manifest: CorpusManifest, dataBaseUrl?: string): Promise<CrossReferenceIndex>;
@@ -16,9 +16,58 @@ async function fetchJson(path) {
16
16
  return response.json();
17
17
  });
18
18
  jsonCache.set(path, pending);
19
+ pending.catch(() => {
20
+ if (jsonCache.get(path) === pending)
21
+ jsonCache.delete(path);
22
+ });
19
23
  }
20
24
  return pending;
21
25
  }
26
+ export function createDocumentLookup(index) {
27
+ var _a;
28
+ const unitById = new Map();
29
+ const unitByNumbering = new Map();
30
+ const unitsByChunkPath = new Map();
31
+ for (const unit of index.units) {
32
+ unitById.set(unit.id, unit);
33
+ unitByNumbering.set(unit.numbering.official.replace(/^C/iu, ""), unit);
34
+ const chunkUnits = (_a = unitsByChunkPath.get(unit.chunkPath)) !== null && _a !== void 0 ? _a : [];
35
+ chunkUnits.push(unit);
36
+ unitsByChunkPath.set(unit.chunkPath, chunkUnits);
37
+ }
38
+ const chunkPaths = [...unitsByChunkPath.keys()];
39
+ return {
40
+ unitById,
41
+ unitByNumbering,
42
+ unitsByChunkPath,
43
+ chunkPaths,
44
+ chunkIndexByPath: new Map(chunkPaths.map((path, position) => [path, position])),
45
+ };
46
+ }
47
+ export function parseNormativeReference(value) {
48
+ const match = value.normalize("NFKC").trim().match(/^§?\s*(c)?\s*(\d+(?:\.\d+)*)\.?$/iu);
49
+ if (!match)
50
+ return null;
51
+ return { numbering: match[2], documentHint: match[1] ? "circ2019" : null };
52
+ }
53
+ export function initialUnitForIndex(index, requestedUnitId) {
54
+ var _a, _b, _c;
55
+ return (_c = (_b = (_a = index.units.find((unit) => unit.id === requestedUnitId)) !== null && _a !== void 0 ? _a : index.units.find((unit) => unit.hierarchy.ancestorIds.length === 0)) !== null && _b !== void 0 ? _b : index.units[0]) !== null && _c !== void 0 ? _c : null;
56
+ }
57
+ export function adjacentChunkPaths(lookup, chunkPath) {
58
+ var _a, _b;
59
+ const position = lookup.chunkIndexByPath.get(chunkPath);
60
+ if (position === undefined)
61
+ return { previous: null, next: null };
62
+ return {
63
+ previous: (_a = lookup.chunkPaths[position - 1]) !== null && _a !== void 0 ? _a : null,
64
+ next: (_b = lookup.chunkPaths[position + 1]) !== null && _b !== void 0 ? _b : null,
65
+ };
66
+ }
67
+ /** Read-only instrumentation used by diagnostics and tests. */
68
+ export function cachedJsonPaths() {
69
+ return [...jsonCache.keys()];
70
+ }
22
71
  export function documentForMode(mode) {
23
72
  return mode === "circ" ? "circ2019" : "ntc2018";
24
73
  }
@@ -37,4 +86,7 @@ export function loadRelations(manifest, dataBaseUrl = "/data/codes") {
37
86
  export function loadSearchIndex(manifest, dataBaseUrl = "/data/codes") {
38
87
  return fetchJson(resolveDataPath(manifest.searchIndexPath, dataBaseUrl));
39
88
  }
89
+ export function loadCrossReferenceIndex(manifest, dataBaseUrl = "/data/codes") {
90
+ return fetchJson(resolveDataPath(manifest.crossReferenceIndexPath, dataBaseUrl));
91
+ }
40
92
  //# sourceMappingURL=corpusData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"corpusData.js","sourceRoot":"","sources":["../shared/corpusData.ts"],"names":[],"mappings":"AA2JA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEtD,SAAS,QAAQ,CAAC,WAAmB;IACnC,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,WAAW,GAAG,aAAa;IACvE,IAAI,WAAW,KAAK,aAAa,IAAI,WAAW,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,KAAK,UAAU,SAAS,CAAI,IAAY;IACtC,IAAI,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,UAAU,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACtE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,OAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,OAAO,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,WAAW,GAAG,aAAa;IACtD,OAAO,SAAS,CAAiB,eAAe,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAC,CAAC;AAC9F,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,QAAwB,EAAE,QAAoB,EAAE,WAAW,GAAG,aAAa;IAC3G,OAAO,SAAS,CAAgB,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AACxG,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,WAAW,GAAG,aAAa;IACjE,OAAO,SAAS,CAAc,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;AACpE,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,QAAwB,EAAE,WAAW,GAAG,aAAa;IACjF,OAAO,SAAS,CAAiB,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;AACzF,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,QAAwB,EAAE,WAAW,GAAG,aAAa;IACnF,OAAO,SAAS,CAAc,eAAe,CAAC,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"corpusData.js","sourceRoot":"","sources":["../shared/corpusData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export function findCrossReferences(value: any): {
2
+ start: number;
3
+ end: number;
4
+ text: string;
5
+ kind: string;
6
+ number: any;
7
+ documentHint: string | null;
8
+ }[];
9
+ export function buildCrossReferenceIndexPayload({ units, assetCollections }: {
10
+ units: any;
11
+ assetCollections: any;
12
+ }): {
13
+ formatVersion: number;
14
+ units: any;
15
+ assets: {
16
+ title?: any;
17
+ snippet?: any;
18
+ id: any;
19
+ kind: string;
20
+ unitId: any;
21
+ blockId: any;
22
+ officialNumber: any;
23
+ }[];
24
+ backlinks: {
25
+ targetType: string;
26
+ targetId: any;
27
+ sourceUnitId: any;
28
+ sourceBlockId: any;
29
+ }[];
30
+ };
31
+ export function createCrossReferenceLookup(index: any): {
32
+ unitById: Map<any, any>;
33
+ unitByDocumentAndNumber: Map<any, any>;
34
+ assetById: Map<any, any>;
35
+ assetByDocumentKindAndNumber: Map<any, any>;
36
+ backlinksByTarget: Map<any, any>;
37
+ };
38
+ export function resolveCrossReference(lookup: any, reference: any, sourceDocument: any): {
39
+ targetType: string;
40
+ unit: any;
41
+ asset?: undefined;
42
+ } | {
43
+ targetType: any;
44
+ unit: any;
45
+ asset: any;
46
+ } | null;
@@ -0,0 +1,198 @@
1
+ const unitPattern = /(^|[^\p{L}\p{N}])(§\s*C?\.?\d+(?:\.\d+)+|C\.?\d+(?:\.\d+)+|\d+(?:\.\d+){2,})/giu;
2
+ const assetPatterns = [
3
+ { kind: "table", pattern: /\b(?:Tab\.\s*|Tab(?:ella|elle)?\s+)((?:C(?:\.)?)?\d+(?:\.\d+)*(?:\.[IVXLCDM]+[a-z]?(?:\.[a-z]+)?)?)/giu },
4
+ { kind: "table", pattern: /\b((?:C(?:\.)?)?\d+(?:\.\d+)*\.[IVXLCDM]+[a-z]?(?:\.[a-z]+)?)/giu },
5
+ { kind: "figure", pattern: /\b(?:Fig\.\s*|Fig\s+|Figura\s+)((?:C(?:\.)?)?\d+(?:\.\d+)+)/giu },
6
+ { kind: "formula", pattern: /\b(?:formula|equazione|relazione)\s+(?:n\.?\s*)?\[?((?:C(?:\.)?)?\d+(?:\.\d+)+)\]?/giu },
7
+ { kind: "formula", pattern: /\[((?:C(?:\.)?)?\d+(?:\.\d+)+)\]/giu },
8
+ ];
9
+ function normalizedNumber(value) {
10
+ return value.replace(/^C\.?/iu, "").replace(/[.\s]+$/gu, "").replace(/(^|\.)([ivxlcdm]+)(?=\.|$)/gu, (match, prefix, part) => prefix + (part.length > 1 || part === part.toUpperCase() ? part.toUpperCase() : part));
11
+ }
12
+ function documentHint(value) {
13
+ return /^C/iu.test(value.trim().replace(/^§\s*/iu, "")) ? "circ2019" : null;
14
+ }
15
+ function overlaps(left, right) {
16
+ return left.start < right.end && right.start < left.end;
17
+ }
18
+ export function findCrossReferences(value) {
19
+ const source = String(value !== null && value !== void 0 ? value : "");
20
+ const candidates = [];
21
+ const combinedTablePattern = /\b(?:Tab\.\s*|Tab(?:ella|elle)?\s+)?((?:C(?:\.)?)?\d+(?:\.\d+)*\.[IVXLCDM]+)([a-z])-\s*([a-z])\b/giu;
22
+ for (const match of source.matchAll(combinedTablePattern)) {
23
+ const suffix = match[3];
24
+ const end = match.index + match[0].length;
25
+ const start = end - suffix.length;
26
+ candidates.push({
27
+ start,
28
+ end,
29
+ text: suffix,
30
+ kind: "table",
31
+ number: `${match[1]}${suffix}`,
32
+ documentHint: documentHint(match[1]),
33
+ });
34
+ }
35
+ for (const { kind, pattern } of assetPatterns) {
36
+ pattern.lastIndex = 0;
37
+ for (const match of source.matchAll(pattern)) {
38
+ candidates.push({
39
+ start: match.index,
40
+ end: match.index + match[0].length,
41
+ text: match[0],
42
+ kind,
43
+ number: normalizedNumber(match[1]),
44
+ documentHint: documentHint(match[1]),
45
+ });
46
+ }
47
+ }
48
+ unitPattern.lastIndex = 0;
49
+ for (const match of source.matchAll(unitPattern)) {
50
+ const prefixLength = match[1].length;
51
+ const raw = match[2];
52
+ candidates.push({
53
+ start: match.index + prefixLength,
54
+ end: match.index + prefixLength + raw.length,
55
+ text: raw,
56
+ kind: "unit",
57
+ number: normalizedNumber(raw.replace(/^§\s*/iu, "")),
58
+ documentHint: documentHint(raw),
59
+ });
60
+ }
61
+ const accepted = [];
62
+ for (const candidate of candidates.sort((left, right) => left.start - right.start || (left.kind === "unit" ? 1 : -1) || right.end - left.end)) {
63
+ if (!accepted.some((current) => overlaps(current, candidate)))
64
+ accepted.push(candidate);
65
+ }
66
+ return accepted.sort((left, right) => left.start - right.start);
67
+ }
68
+ function compactText(unit, maximum = 110) {
69
+ const value = unit.blocks
70
+ .filter((block) => block.blockId !== unit.titleBlockId)
71
+ .flatMap((block) => { var _a; return ((_a = block.text) === null || _a === void 0 ? void 0 : _a.normalized) ? [block.text.normalized] : []; })
72
+ .join(" ")
73
+ .replace(/\s+/gu, " ")
74
+ .trim();
75
+ return value.length > maximum ? `${value.slice(0, maximum - 1).trimEnd()}…` : value;
76
+ }
77
+ function assetKindFor(collection) {
78
+ return collection === "formulas" ? "formula" : collection === "tables" ? "table" : "figure";
79
+ }
80
+ function preferredDocument(reference, sourceDocument) {
81
+ if (reference.documentHint)
82
+ return reference.documentHint;
83
+ return sourceDocument === "circ2019" ? "ntc2018" : sourceDocument;
84
+ }
85
+ function targetKey(targetType, targetId) {
86
+ return `${targetType}:${targetId}`;
87
+ }
88
+ export function buildCrossReferenceIndexPayload({ units, assetCollections }) {
89
+ var _a;
90
+ const unitTargets = units.map((unit) => ({
91
+ id: unit.id,
92
+ document: unit.document,
93
+ numbering: unit.numbering.official,
94
+ title: unit.title,
95
+ snippet: compactText(unit),
96
+ }));
97
+ const unitById = new Map(unitTargets.map((unit) => [unit.id, unit]));
98
+ const unitByDocumentAndNumber = new Map(unitTargets.map((unit) => [`${unit.document}:${normalizedNumber(unit.numbering)}`, unit]));
99
+ const ownerByAssetId = new Map();
100
+ for (const unit of units) {
101
+ for (const block of unit.blocks) {
102
+ if (block.assetId && !ownerByAssetId.has(block.assetId))
103
+ ownerByAssetId.set(block.assetId, { unit, blockId: block.blockId });
104
+ }
105
+ }
106
+ const assets = [];
107
+ for (const [collection, records] of Object.entries(assetCollections)) {
108
+ const kind = assetKindFor(collection);
109
+ for (const asset of records) {
110
+ if (!asset.officialNumber)
111
+ continue;
112
+ const owner = ownerByAssetId.get(asset.id);
113
+ if (!owner)
114
+ continue;
115
+ assets.push(Object.assign(Object.assign({ id: asset.id, kind, unitId: owner.unit.id, blockId: owner.blockId, officialNumber: asset.officialNumber }, (kind === "table" && asset.caption ? { title: asset.caption, snippet: asset.caption } : {})), (kind === "figure" ? { title: asset.caption, snippet: asset.alt } : {})));
116
+ }
117
+ }
118
+ const assetByDocumentKindAndNumber = new Map(assets.map((asset) => {
119
+ const owner = unitById.get(asset.unitId);
120
+ return [`${owner.document}:${asset.kind}:${normalizedNumber(asset.officialNumber)}`, asset];
121
+ }));
122
+ const backlinks = [];
123
+ const seen = new Set();
124
+ const referencedAssetIds = new Set();
125
+ for (const source of units) {
126
+ for (const block of source.blocks) {
127
+ if (!((_a = block.text) === null || _a === void 0 ? void 0 : _a.normalized) || block.blockId === source.titleBlockId)
128
+ continue;
129
+ for (const reference of findCrossReferences(block.text.normalized)) {
130
+ const preferred = preferredDocument(reference, source.document);
131
+ const documents = preferred === source.document ? [preferred] : [preferred, source.document];
132
+ let target = null;
133
+ let targetType = reference.kind;
134
+ for (const document of documents) {
135
+ target = reference.kind === "unit"
136
+ ? unitByDocumentAndNumber.get(`${document}:${reference.number}`)
137
+ : assetByDocumentKindAndNumber.get(`${document}:${reference.kind}:${reference.number}`);
138
+ if (target)
139
+ break;
140
+ }
141
+ if (!target || (targetType === "unit" && target.id === source.id))
142
+ continue;
143
+ if (targetType !== "unit") {
144
+ referencedAssetIds.add(target.id);
145
+ continue;
146
+ }
147
+ const key = `${targetKey(targetType, target.id)}:${source.id}:${block.blockId}`;
148
+ if (seen.has(key))
149
+ continue;
150
+ seen.add(key);
151
+ backlinks.push({
152
+ targetType,
153
+ targetId: target.id,
154
+ sourceUnitId: source.id,
155
+ sourceBlockId: block.blockId,
156
+ });
157
+ }
158
+ }
159
+ }
160
+ // Exact canonical resolution needs every numbered asset, even without a
161
+ // backlink. Keep descriptive preview fields only for assets referenced by
162
+ // corpus prose so the lazy viewer index remains compact.
163
+ const indexedAssets = assets.map((asset) => referencedAssetIds.has(asset.id) ? asset : ({
164
+ id: asset.id, kind: asset.kind, unitId: asset.unitId, blockId: asset.blockId, officialNumber: asset.officialNumber,
165
+ }));
166
+ return { formatVersion: 1, units: unitTargets, assets: indexedAssets, backlinks };
167
+ }
168
+ export function createCrossReferenceLookup(index) {
169
+ var _a;
170
+ const unitById = new Map(index.units.map((unit) => [unit.id, unit]));
171
+ const unitByDocumentAndNumber = new Map(index.units.map((unit) => [`${unit.document}:${normalizedNumber(unit.numbering)}`, unit]));
172
+ const assetById = new Map(index.assets.map((asset) => [asset.id, asset]));
173
+ const assetByDocumentKindAndNumber = new Map(index.assets.map((asset) => {
174
+ const unit = unitById.get(asset.unitId);
175
+ return [`${unit.document}:${asset.kind}:${normalizedNumber(asset.officialNumber)}`, asset];
176
+ }));
177
+ const backlinksByTarget = new Map();
178
+ for (const backlink of index.backlinks) {
179
+ const key = targetKey(backlink.targetType, backlink.targetId);
180
+ const group = (_a = backlinksByTarget.get(key)) !== null && _a !== void 0 ? _a : [];
181
+ group.push(backlink);
182
+ backlinksByTarget.set(key, group);
183
+ }
184
+ return { unitById, unitByDocumentAndNumber, assetById, assetByDocumentKindAndNumber, backlinksByTarget };
185
+ }
186
+ export function resolveCrossReference(lookup, reference, sourceDocument) {
187
+ const preferred = preferredDocument(reference, sourceDocument);
188
+ const documents = preferred === sourceDocument ? [preferred] : [preferred, sourceDocument];
189
+ for (const document of documents) {
190
+ const target = reference.kind === "unit"
191
+ ? lookup.unitByDocumentAndNumber.get(`${document}:${reference.number}`)
192
+ : lookup.assetByDocumentKindAndNumber.get(`${document}:${reference.kind}:${reference.number}`);
193
+ if (target)
194
+ return reference.kind === "unit" ? { targetType: "unit", unit: target } : { targetType: reference.kind, unit: lookup.unitById.get(target.unitId), asset: target };
195
+ }
196
+ return null;
197
+ }
198
+ //# sourceMappingURL=crossReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crossReferences.js","sourceRoot":"","sources":["../shared/crossReferences.js"],"names":[],"mappings":"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"}