@shuji-bonji/pdf-spec-mcp 0.3.2 → 0.4.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.
- package/README.ja.md +11 -4
- package/README.md +11 -4
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +32 -1
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +69 -5
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +70 -9
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -42
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +18 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +59 -0
- package/dist/server.js.map +1 -0
- package/dist/services/compare-service.d.ts +1 -1
- package/dist/services/compare-service.d.ts.map +1 -1
- package/dist/services/compare-service.js +2 -2
- package/dist/services/compare-service.js.map +1 -1
- package/dist/services/content-extractor.d.ts +65 -0
- package/dist/services/content-extractor.d.ts.map +1 -1
- package/dist/services/content-extractor.js +142 -10
- package/dist/services/content-extractor.js.map +1 -1
- package/dist/services/outline-resolver.d.ts +1 -1
- package/dist/services/outline-resolver.d.ts.map +1 -1
- package/dist/services/pdf-loader.d.ts +12 -2
- package/dist/services/pdf-loader.d.ts.map +1 -1
- package/dist/services/pdf-loader.js +21 -13
- package/dist/services/pdf-loader.js.map +1 -1
- package/dist/services/pdf-registry.d.ts.map +1 -1
- package/dist/services/pdf-registry.js +16 -8
- package/dist/services/pdf-registry.js.map +1 -1
- package/dist/services/pdf-service.d.ts +13 -1
- package/dist/services/pdf-service.d.ts.map +1 -1
- package/dist/services/pdf-service.js +79 -72
- package/dist/services/pdf-service.js.map +1 -1
- package/dist/services/requirement-extractor.d.ts +1 -1
- package/dist/services/requirement-extractor.d.ts.map +1 -1
- package/dist/services/requirement-extractor.js +40 -4
- package/dist/services/requirement-extractor.js.map +1 -1
- package/dist/services/search-index.d.ts +8 -1
- package/dist/services/search-index.d.ts.map +1 -1
- package/dist/services/search-index.js +48 -18
- package/dist/services/search-index.js.map +1 -1
- package/dist/services/table-collector.d.ts +19 -0
- package/dist/services/table-collector.d.ts.map +1 -0
- package/dist/services/table-collector.js +106 -0
- package/dist/services/table-collector.js.map +1 -0
- package/dist/tools/definitions.d.ts +26 -3
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +47 -114
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers.d.ts +18 -9
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/tools/handlers.js +57 -38
- package/dist/tools/handlers.js.map +1 -1
- package/dist/types/index.d.ts +28 -33
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +4 -0
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/stdout-guard.d.ts +24 -0
- package/dist/utils/stdout-guard.d.ts.map +1 -0
- package/dist/utils/stdout-guard.js +27 -0
- package/dist/utils/stdout-guard.js.map +1 -0
- package/dist/utils/validation.d.ts +96 -14
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +152 -94
- package/dist/utils/validation.js.map +1 -1
- package/package.json +14 -11
- package/dist/container.d.ts +0 -25
- package/dist/container.d.ts.map +0 -1
- package/dist/container.js +0 -25
- package/dist/container.js.map +0 -1
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* All public functions accept an optional `specId` parameter.
|
|
6
6
|
* When omitted, the default spec (iso32000-2) is used via resolveSpecId().
|
|
7
7
|
*/
|
|
8
|
-
import type { SectionIndex, SectionResult, SearchHit, RequirementsResult, ISORequirementLevel, DefinitionsResult, TablesResult, OutlineEntry } from '../types/index.js';
|
|
9
8
|
import type { PDFDocumentProxy } from 'pdfjs-dist/types/src/display/api.js';
|
|
9
|
+
import type { DefinitionsResult, ISORequirementLevel, OutlineEntry, RequirementsResult, SearchHit, SectionIndex, SectionResult, TablesResult } from '../types/index.js';
|
|
10
10
|
/**
|
|
11
11
|
* Service class for PDF specification operations.
|
|
12
12
|
* Encapsulates all state management and caching logic.
|
|
@@ -49,6 +49,18 @@ declare class PDFSpecService {
|
|
|
49
49
|
* Get section content by section identifier
|
|
50
50
|
*/
|
|
51
51
|
getSectionContent(sectionId: string, specId?: string): Promise<SectionResult>;
|
|
52
|
+
/**
|
|
53
|
+
* This section's tail, stranded on the next section's first page.
|
|
54
|
+
*
|
|
55
|
+
* See extractOrphanedStrip for what the strip is and why adopting it cannot
|
|
56
|
+
* double-count. The condition here is the structural half: a seam exists only when the
|
|
57
|
+
* next section begins on the page right after this one's last.
|
|
58
|
+
*
|
|
59
|
+
* When two sections share a page (`endPage === page`, since endPage is
|
|
60
|
+
* `max(page, next.page - 1)`), `endPage + 1` is a page the *next* section owns outright,
|
|
61
|
+
* not a seam — reading it here would steal that section's content.
|
|
62
|
+
*/
|
|
63
|
+
private adoptOrphanedStrip;
|
|
52
64
|
/**
|
|
53
65
|
* Search the specification
|
|
54
66
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-service.d.ts","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"pdf-service.d.ts","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,17 +6,18 @@
|
|
|
6
6
|
* When omitted, the default spec (iso32000-2) is used via resolveSpecId().
|
|
7
7
|
*/
|
|
8
8
|
import { CACHE_CONFIG, CONCURRENCY } from '../config.js';
|
|
9
|
-
import {
|
|
10
|
-
import { ContentError } from '../errors.js';
|
|
9
|
+
import { ContentError, NEXT_ACTIONS } from '../errors.js';
|
|
11
10
|
import { LRUCache } from '../utils/cache.js';
|
|
11
|
+
import { mapConcurrent } from '../utils/concurrency.js';
|
|
12
12
|
import { logger } from '../utils/logger.js';
|
|
13
|
-
import {
|
|
13
|
+
import { extractOrphanedStrip, extractSectionContent } from './content-extractor.js';
|
|
14
|
+
import { extractAllDefinitions } from './definition-extractor.js';
|
|
14
15
|
import { buildSectionIndex, findSection } from './outline-resolver.js';
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
16
|
+
import { getOutlineWithPages, loadDocument, reloadDocument } from './pdf-loader.js';
|
|
17
|
+
import { enrichSpecInfo, getSpecPath, resolveSpecId } from './pdf-registry.js';
|
|
17
18
|
import { extractRequirementsFromContent } from './requirement-extractor.js';
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
19
|
+
import { buildSearchIndex, searchTextIndex } from './search-index.js';
|
|
20
|
+
import { collectStructTreeTables } from './table-collector.js';
|
|
20
21
|
// ========================================
|
|
21
22
|
// PDFSpecService Class
|
|
22
23
|
// ========================================
|
|
@@ -62,10 +63,13 @@ class PDFSpecService {
|
|
|
62
63
|
*/
|
|
63
64
|
async getSectionIndex(specId) {
|
|
64
65
|
const id = this.registry.resolveSpecId(specId);
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
// Hold the memoised promise in a local: one lookup, and no non-null assertion.
|
|
67
|
+
let index = this.sectionIndexMap.get(id);
|
|
68
|
+
if (!index) {
|
|
69
|
+
index = this.initSectionIndex(id);
|
|
70
|
+
this.sectionIndexMap.set(id, index);
|
|
67
71
|
}
|
|
68
|
-
return
|
|
72
|
+
return index;
|
|
69
73
|
}
|
|
70
74
|
/**
|
|
71
75
|
* Initialize section index for a spec
|
|
@@ -98,7 +102,10 @@ class PDFSpecService {
|
|
|
98
102
|
const msg = suggestions.length > 0
|
|
99
103
|
? `Section "${sectionId}" not found. Did you mean: ${suggestions.join(', ')}?`
|
|
100
104
|
: `Section "${sectionId}" not found. Use get_structure to see available sections.`;
|
|
101
|
-
throw new ContentError(msg
|
|
105
|
+
throw new ContentError(msg, {
|
|
106
|
+
next_actions: [NEXT_ACTIONS.getStructure()],
|
|
107
|
+
retryable: true,
|
|
108
|
+
});
|
|
102
109
|
}
|
|
103
110
|
// Check content cache (keyed with specId prefix)
|
|
104
111
|
const cacheKey = `${id}:${section.sectionNumber}:${section.page}-${section.endPage}`;
|
|
@@ -113,7 +120,10 @@ class PDFSpecService {
|
|
|
113
120
|
}
|
|
114
121
|
const pdfPath = this.registry.getSpecPath(id);
|
|
115
122
|
const doc = await this.loader.loadDocument(pdfPath);
|
|
116
|
-
const content =
|
|
123
|
+
const content = [
|
|
124
|
+
...(await extractSectionContent(doc, section.page, section.endPage, section.sectionNumber)),
|
|
125
|
+
...(await this.adoptOrphanedStrip(doc, index, section)),
|
|
126
|
+
];
|
|
117
127
|
this.sectionContentCache.set(cacheKey, content);
|
|
118
128
|
return {
|
|
119
129
|
sectionNumber: section.sectionNumber,
|
|
@@ -122,6 +132,24 @@ class PDFSpecService {
|
|
|
122
132
|
content,
|
|
123
133
|
};
|
|
124
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* This section's tail, stranded on the next section's first page.
|
|
137
|
+
*
|
|
138
|
+
* See extractOrphanedStrip for what the strip is and why adopting it cannot
|
|
139
|
+
* double-count. The condition here is the structural half: a seam exists only when the
|
|
140
|
+
* next section begins on the page right after this one's last.
|
|
141
|
+
*
|
|
142
|
+
* When two sections share a page (`endPage === page`, since endPage is
|
|
143
|
+
* `max(page, next.page - 1)`), `endPage + 1` is a page the *next* section owns outright,
|
|
144
|
+
* not a seam — reading it here would steal that section's content.
|
|
145
|
+
*/
|
|
146
|
+
async adoptOrphanedStrip(doc, index, section) {
|
|
147
|
+
const position = index.flatOrder.indexOf(section);
|
|
148
|
+
const next = position === -1 ? undefined : index.flatOrder[position + 1];
|
|
149
|
+
if (!next || next.page !== section.endPage + 1)
|
|
150
|
+
return [];
|
|
151
|
+
return extractOrphanedStrip(doc, next.page, next.sectionNumber);
|
|
152
|
+
}
|
|
125
153
|
// ========================================
|
|
126
154
|
// Search (public)
|
|
127
155
|
// ========================================
|
|
@@ -131,15 +159,17 @@ class PDFSpecService {
|
|
|
131
159
|
async searchSpec(query, maxResults, specId) {
|
|
132
160
|
const id = this.registry.resolveSpecId(specId);
|
|
133
161
|
const index = await this.getSectionIndex(id);
|
|
134
|
-
|
|
162
|
+
let searchIndexPromise = this.searchIndexMap.get(id);
|
|
163
|
+
if (!searchIndexPromise) {
|
|
135
164
|
const pdfPath = this.registry.getSpecPath(id);
|
|
136
165
|
// Force-reload to reset pdfjs-dist PagesMapper singleton state.
|
|
137
166
|
// Without this, getPage() fails for pages beyond the LAST-loaded document's numPages.
|
|
138
167
|
const doc = await this.loader.reloadDocument(pdfPath);
|
|
139
168
|
logger.info('PDFService', `[${id}] Building search index (this may take a few seconds)...`);
|
|
140
|
-
|
|
169
|
+
searchIndexPromise = buildSearchIndex(doc, index);
|
|
170
|
+
this.searchIndexMap.set(id, searchIndexPromise);
|
|
141
171
|
}
|
|
142
|
-
const searchIdx = await
|
|
172
|
+
const searchIdx = await searchIndexPromise;
|
|
143
173
|
return searchTextIndex(searchIdx, query, maxResults, index);
|
|
144
174
|
}
|
|
145
175
|
// ========================================
|
|
@@ -156,9 +186,9 @@ class PDFSpecService {
|
|
|
156
186
|
if (section) {
|
|
157
187
|
// Fast path: extract from specific section + subsections
|
|
158
188
|
const index = await this.getSectionIndex(id);
|
|
159
|
-
const matchingSections = index.flatOrder.filter((s) => s.sectionNumber === section || s.sectionNumber.startsWith(section
|
|
189
|
+
const matchingSections = index.flatOrder.filter((s) => s.sectionNumber === section || s.sectionNumber.startsWith(`${section}.`));
|
|
160
190
|
if (matchingSections.length === 0) {
|
|
161
|
-
throw new ContentError(`Section "${section}" not found. Use get_structure to see available sections
|
|
191
|
+
throw new ContentError(`Section "${section}" not found. Use get_structure to see available sections.`, { next_actions: [NEXT_ACTIONS.getStructure()], retryable: true });
|
|
162
192
|
}
|
|
163
193
|
// Only extract from leaf sections to avoid duplicates
|
|
164
194
|
const matchingNumbers = new Set(matchingSections.map((s) => s.sectionNumber));
|
|
@@ -172,11 +202,13 @@ class PDFSpecService {
|
|
|
172
202
|
}
|
|
173
203
|
else {
|
|
174
204
|
// Full scan: build or reuse cached index
|
|
175
|
-
|
|
205
|
+
let requirementsPromise = this.requirementsIndexMap.get(id);
|
|
206
|
+
if (!requirementsPromise) {
|
|
176
207
|
logger.info('PDFService', `[${id}] Building requirements index (this may take a while)...`);
|
|
177
|
-
|
|
208
|
+
requirementsPromise = this.buildRequirementsIndex(id);
|
|
209
|
+
this.requirementsIndexMap.set(id, requirementsPromise);
|
|
178
210
|
}
|
|
179
|
-
allRequirements = await
|
|
211
|
+
allRequirements = await requirementsPromise;
|
|
180
212
|
}
|
|
181
213
|
// Apply level filter
|
|
182
214
|
const filtered = level ? allRequirements.filter((r) => r.level === level) : allRequirements;
|
|
@@ -224,13 +256,24 @@ class PDFSpecService {
|
|
|
224
256
|
// Guard: definition extraction requires compatible Section 3 structure
|
|
225
257
|
if (!PDFSpecService.DEFINITIONS_SUPPORTED_SPECS.has(id)) {
|
|
226
258
|
throw new ContentError(`get_definitions is only supported for ISO 32000-2 and PDF 1.7. ` +
|
|
227
|
-
`For "${id}", use get_section with section "3" instead
|
|
259
|
+
`For "${id}", use get_section with section "3" instead.`, {
|
|
260
|
+
hint: 'Other specs do not share the Section 3 "Terms and definitions" structure this parses.',
|
|
261
|
+
next_actions: [
|
|
262
|
+
{
|
|
263
|
+
action: 'call_get_section',
|
|
264
|
+
reason: `Call get_section with section "3" on "${id}" to read its terms verbatim.`,
|
|
265
|
+
},
|
|
266
|
+
],
|
|
267
|
+
retryable: true,
|
|
268
|
+
});
|
|
228
269
|
}
|
|
229
|
-
|
|
270
|
+
let definitionsPromise = this.definitionsMap.get(id);
|
|
271
|
+
if (!definitionsPromise) {
|
|
230
272
|
logger.info('PDFService', `[${id}] Extracting definitions from Section 3...`);
|
|
231
|
-
|
|
273
|
+
definitionsPromise = extractAllDefinitions((sectionId) => this.getSectionContent(sectionId, id));
|
|
274
|
+
this.definitionsMap.set(id, definitionsPromise);
|
|
232
275
|
}
|
|
233
|
-
let definitions = await
|
|
276
|
+
let definitions = await definitionsPromise;
|
|
234
277
|
if (term) {
|
|
235
278
|
const searchTerm = term.toLowerCase();
|
|
236
279
|
definitions = definitions.filter((d) => d.term.toLowerCase().includes(searchTerm) ||
|
|
@@ -252,7 +295,9 @@ class PDFSpecService {
|
|
|
252
295
|
async getTables(sectionId, tableIndex, specId) {
|
|
253
296
|
const id = this.registry.resolveSpecId(specId);
|
|
254
297
|
const result = await this.getSectionContent(sectionId, id);
|
|
255
|
-
//
|
|
298
|
+
// Rows that spill onto the next section's first page arrive with the section's content
|
|
299
|
+
// (getSectionContent adopts the orphaned strip), so the continuation rule below merges
|
|
300
|
+
// them like any other. Nothing table-specific is needed here.
|
|
256
301
|
let tables = collectStructTreeTables(result.content);
|
|
257
302
|
// Fallback: text-based table detection if StructTree has no tables
|
|
258
303
|
if (tables.length === 0) {
|
|
@@ -260,7 +305,15 @@ class PDFSpecService {
|
|
|
260
305
|
}
|
|
261
306
|
if (tableIndex !== undefined) {
|
|
262
307
|
if (tableIndex >= tables.length) {
|
|
263
|
-
throw new ContentError(`table_index ${tableIndex} out of range. Section "${sectionId}" has ${tables.length} table(s)
|
|
308
|
+
throw new ContentError(`table_index ${tableIndex} out of range. Section "${sectionId}" has ${tables.length} table(s).`, {
|
|
309
|
+
next_actions: [
|
|
310
|
+
{
|
|
311
|
+
action: 'omit_table_index',
|
|
312
|
+
reason: `Call get_tables without table_index to see all ${tables.length} table(s) in this section.`,
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
retryable: true,
|
|
316
|
+
});
|
|
264
317
|
}
|
|
265
318
|
return {
|
|
266
319
|
section: result.sectionNumber,
|
|
@@ -280,52 +333,6 @@ class PDFSpecService {
|
|
|
280
333
|
// ========================================
|
|
281
334
|
// Module-level helper functions (stateless)
|
|
282
335
|
// ========================================
|
|
283
|
-
/**
|
|
284
|
-
* Collect tables from StructTree-extracted content (type: 'table').
|
|
285
|
-
*/
|
|
286
|
-
function collectStructTreeTables(content) {
|
|
287
|
-
const tables = [];
|
|
288
|
-
for (let i = 0; i < content.length; i++) {
|
|
289
|
-
const element = content[i];
|
|
290
|
-
if (element.type !== 'table')
|
|
291
|
-
continue;
|
|
292
|
-
// Check for caption in preceding paragraph
|
|
293
|
-
let caption = null;
|
|
294
|
-
if (i > 0) {
|
|
295
|
-
const prev = content[i - 1];
|
|
296
|
-
if (prev.type === 'paragraph' && /^Table\s+\d+/.test(prev.text)) {
|
|
297
|
-
caption = prev.text;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
// Merge with previous table if this is a continuation (same headers, no caption)
|
|
301
|
-
if (!caption &&
|
|
302
|
-
tables.length > 0 &&
|
|
303
|
-
element.headers.length > 0 &&
|
|
304
|
-
arraysEqual(tables[tables.length - 1].headers, element.headers)) {
|
|
305
|
-
tables[tables.length - 1].rows.push(...element.rows);
|
|
306
|
-
continue;
|
|
307
|
-
}
|
|
308
|
-
tables.push({
|
|
309
|
-
index: tables.length,
|
|
310
|
-
caption,
|
|
311
|
-
headers: element.headers,
|
|
312
|
-
rows: element.rows,
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
return tables;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Check if two string arrays are equal
|
|
319
|
-
*/
|
|
320
|
-
function arraysEqual(a, b) {
|
|
321
|
-
if (a.length !== b.length)
|
|
322
|
-
return false;
|
|
323
|
-
for (let i = 0; i < a.length; i++) {
|
|
324
|
-
if (a[i] !== b[i])
|
|
325
|
-
return false;
|
|
326
|
-
}
|
|
327
|
-
return true;
|
|
328
|
-
}
|
|
329
336
|
/**
|
|
330
337
|
* Text-based fallback: detect tables from paragraph patterns.
|
|
331
338
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-service.js","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pdf-service.js","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ import type { ContentElement, Requirement } from '../types/index.js';
|
|
|
12
12
|
export declare function extractSentence(text: string, position: number): string;
|
|
13
13
|
/**
|
|
14
14
|
* Extract all normative requirements from ContentElement[].
|
|
15
|
-
* Scans paragraphs, list items, and
|
|
15
|
+
* Scans paragraphs, list items, notes, and table cells for ISO keywords.
|
|
16
16
|
*/
|
|
17
17
|
export declare function extractRequirementsFromContent(content: ContentElement[], sectionNumber: string, sectionTitle: string): Requirement[];
|
|
18
18
|
//# sourceMappingURL=requirement-extractor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-extractor.d.ts","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"requirement-extractor.d.ts","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAuB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsB1F;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2CtE;AA0CD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,cAAc,EAAE,EACzB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,WAAW,EAAE,CAuBf"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Extracts normative requirements (shall/should/may) from ContentElement arrays.
|
|
4
4
|
* Operates at the semantic level on already-extracted content.
|
|
5
5
|
*/
|
|
6
|
+
import { collectStructTreeTables } from './table-collector.js';
|
|
6
7
|
/**
|
|
7
8
|
* ISO requirement keywords ordered longest-first for greedy regex matching.
|
|
8
9
|
*/
|
|
@@ -68,12 +69,12 @@ export function extractSentence(text, position) {
|
|
|
68
69
|
/**
|
|
69
70
|
* Extract requirements from a single text string.
|
|
70
71
|
*/
|
|
71
|
-
function extractFromText(text, sectionNumber, sectionTitle, idCounter) {
|
|
72
|
+
function extractFromText(text, sectionNumber, sectionTitle, idCounter, context) {
|
|
72
73
|
const requirements = [];
|
|
73
74
|
const regex = createISORequirementRegex();
|
|
74
75
|
const seen = new Set(); // deduplicate by sentence text
|
|
75
|
-
|
|
76
|
-
|
|
76
|
+
// regex is global (see createISORequirementRegex), so matchAll walks every hit.
|
|
77
|
+
for (const match of text.matchAll(regex)) {
|
|
77
78
|
const level = match[1].toLowerCase();
|
|
78
79
|
const sentence = extractSentence(text, match.index);
|
|
79
80
|
// Deduplicate: same sentence may be matched multiple times
|
|
@@ -87,13 +88,14 @@ function extractFromText(text, sectionNumber, sectionTitle, idCounter) {
|
|
|
87
88
|
text: sentence,
|
|
88
89
|
section: sectionNumber,
|
|
89
90
|
sectionTitle,
|
|
91
|
+
...context,
|
|
90
92
|
});
|
|
91
93
|
}
|
|
92
94
|
return requirements;
|
|
93
95
|
}
|
|
94
96
|
/**
|
|
95
97
|
* Extract all normative requirements from ContentElement[].
|
|
96
|
-
* Scans paragraphs, list items, and
|
|
98
|
+
* Scans paragraphs, list items, notes, and table cells for ISO keywords.
|
|
97
99
|
*/
|
|
98
100
|
export function extractRequirementsFromContent(content, sectionNumber, sectionTitle) {
|
|
99
101
|
const requirements = [];
|
|
@@ -113,6 +115,40 @@ export function extractRequirementsFromContent(content, sectionNumber, sectionTi
|
|
|
113
115
|
break;
|
|
114
116
|
}
|
|
115
117
|
}
|
|
118
|
+
requirements.push(...extractFromTables(content, sectionNumber, sectionTitle, idCounter));
|
|
119
|
+
return requirements;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Requirements stated inside tables.
|
|
123
|
+
*
|
|
124
|
+
* ISO puts a great deal of normative text in table cells — "(Required) The type of
|
|
125
|
+
* annotation ... shall be Highlight, Underline, ..." — and scanning only prose misses all
|
|
126
|
+
* of it: 1540 cells across 333 sections of ISO 32000-2, roughly 3000 keyword occurrences.
|
|
127
|
+
*
|
|
128
|
+
* Tables are re-assembled with collectStructTreeTables rather than read element by element,
|
|
129
|
+
* so that a caption is attributed the same way get_tables attributes it, and a table split
|
|
130
|
+
* across pages yields one set of requirements rather than several headless fragments.
|
|
131
|
+
*
|
|
132
|
+
* Only StructTree tables are considered. Text-detected tables (detectTablesFromText) are
|
|
133
|
+
* made of `paragraph` elements that the prose loop above already scanned; taking those too
|
|
134
|
+
* would count every sentence twice.
|
|
135
|
+
*/
|
|
136
|
+
function extractFromTables(content, sectionNumber, sectionTitle, idCounter) {
|
|
137
|
+
const requirements = [];
|
|
138
|
+
for (const table of collectStructTreeTables(content)) {
|
|
139
|
+
for (const row of table.rows) {
|
|
140
|
+
// Row label ("Subtype", "Length", the bit number ...). Without it a lifted sentence
|
|
141
|
+
// cannot be traced back to what it constrains.
|
|
142
|
+
const key = row[0];
|
|
143
|
+
for (const cell of row) {
|
|
144
|
+
requirements.push(...extractFromText(cell, sectionNumber, sectionTitle, idCounter, {
|
|
145
|
+
source: 'table',
|
|
146
|
+
...(table.caption ? { table: table.caption } : {}),
|
|
147
|
+
...(key ? { key } : {}),
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
116
152
|
return requirements;
|
|
117
153
|
}
|
|
118
154
|
//# sourceMappingURL=requirement-extractor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-extractor.js","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"requirement-extractor.js","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,18 @@
|
|
|
2
2
|
* Search Index
|
|
3
3
|
* Full-text search over PDF specification pages
|
|
4
4
|
*/
|
|
5
|
-
import type { SectionIndex, TextIndex
|
|
5
|
+
import type { SearchHit, SectionIndex, TextIndex } from '../types/index.js';
|
|
6
6
|
import type { PDFDocumentProxy } from './pdf-loader.js';
|
|
7
7
|
/**
|
|
8
8
|
* Build full-text search index from all PDF pages.
|
|
9
9
|
* Uses chunked parallel processing for improved performance.
|
|
10
|
+
*
|
|
11
|
+
* A page where sections start is indexed as one entry per section segment, cut at the
|
|
12
|
+
* section headings by extractPageSegments (S-8). Handing the whole page to a single
|
|
13
|
+
* section misattributed the strip above the first heading — the tail of the previous
|
|
14
|
+
* section — to the next one, so search pointed at sections where the term cannot be
|
|
15
|
+
* found by get_section / get_tables. Pages where no section starts stay on the fast
|
|
16
|
+
* raw-text path: they belong entirely to the section flowing through them.
|
|
10
17
|
*/
|
|
11
18
|
export declare function buildSearchIndex(doc: PDFDocumentProxy, sectionIndex: SectionIndex): Promise<TextIndex>;
|
|
12
19
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-index.d.ts","sourceRoot":"","sources":["../../src/services/search-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"search-index.d.ts","sourceRoot":"","sources":["../../src/services/search-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAY,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAItF,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,iBAAiB,CAAC;AAElE;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,SAAS,CAAC,CA2DpB;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,SAAS,EAAE,CA2Eb"}
|
|
@@ -5,29 +5,59 @@
|
|
|
5
5
|
import { CONCURRENCY } from '../config.js';
|
|
6
6
|
import { mapConcurrent } from '../utils/concurrency.js';
|
|
7
7
|
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { extractPageSegments } from './content-extractor.js';
|
|
8
9
|
/**
|
|
9
10
|
* Build full-text search index from all PDF pages.
|
|
10
11
|
* Uses chunked parallel processing for improved performance.
|
|
12
|
+
*
|
|
13
|
+
* A page where sections start is indexed as one entry per section segment, cut at the
|
|
14
|
+
* section headings by extractPageSegments (S-8). Handing the whole page to a single
|
|
15
|
+
* section misattributed the strip above the first heading — the tail of the previous
|
|
16
|
+
* section — to the next one, so search pointed at sections where the term cannot be
|
|
17
|
+
* found by get_section / get_tables. Pages where no section starts stay on the fast
|
|
18
|
+
* raw-text path: they belong entirely to the section flowing through them.
|
|
11
19
|
*/
|
|
12
20
|
export async function buildSearchIndex(doc, sectionIndex) {
|
|
13
21
|
const start = Date.now();
|
|
14
22
|
const totalPages = doc.numPages;
|
|
15
23
|
logger.info('SearchIndex', `Building search index for ${totalPages} pages (concurrency: ${CONCURRENCY.searchIndex})...`);
|
|
24
|
+
// Sections starting on each page, in document order (flatOrder is document-ordered).
|
|
25
|
+
const startsByPage = new Map();
|
|
26
|
+
for (const info of sectionIndex.flatOrder) {
|
|
27
|
+
const arr = startsByPage.get(info.page);
|
|
28
|
+
if (arr) {
|
|
29
|
+
arr.push(info.sectionNumber);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
startsByPage.set(info.page, [info.sectionNumber]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
16
35
|
const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1);
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.
|
|
24
|
-
|
|
25
|
-
|
|
36
|
+
const pagesNested = await mapConcurrent(pageNumbers, async (pageNum) => {
|
|
37
|
+
const startingSections = startsByPage.get(pageNum);
|
|
38
|
+
if (!startingSections) {
|
|
39
|
+
// No section starts here — the page belongs to the section flowing through it.
|
|
40
|
+
const page = await doc.getPage(pageNum);
|
|
41
|
+
const textContent = await page.getTextContent();
|
|
42
|
+
const text = textContent.items
|
|
43
|
+
.filter((item) => 'str' in item)
|
|
44
|
+
.map((item) => item.str)
|
|
45
|
+
.join(' ');
|
|
46
|
+
const section = findSectionForPage(sectionIndex, pageNum);
|
|
47
|
+
return [{ page: pageNum, section: section?.sectionNumber || '', text }];
|
|
48
|
+
}
|
|
49
|
+
// Sections start on this page — cut it at their headings. A null owner is the
|
|
50
|
+
// strip above the first heading: it belongs to the section flowing in from the
|
|
51
|
+
// previous page.
|
|
52
|
+
const flowingIn = findSectionForPage(sectionIndex, pageNum - 1);
|
|
53
|
+
const segments = await extractPageSegments(doc, pageNum, startingSections);
|
|
54
|
+
return segments.map((seg) => ({
|
|
26
55
|
page: pageNum,
|
|
27
|
-
section: section?.sectionNumber
|
|
28
|
-
text,
|
|
29
|
-
};
|
|
56
|
+
section: seg.section ?? flowingIn?.sectionNumber ?? '',
|
|
57
|
+
text: seg.text,
|
|
58
|
+
}));
|
|
30
59
|
}, CONCURRENCY.searchIndex);
|
|
60
|
+
const pages = pagesNested.flat();
|
|
31
61
|
const buildTime = Date.now() - start;
|
|
32
62
|
logger.info('SearchIndex', `Search index built in ${buildTime}ms (${totalPages} pages)`);
|
|
33
63
|
return { pages, buildTime };
|
|
@@ -56,10 +86,10 @@ export function searchTextIndex(index, query, maxResults, sectionIndex) {
|
|
|
56
86
|
let score = 0;
|
|
57
87
|
if (idx !== -1) {
|
|
58
88
|
// Count exact phrase occurrences
|
|
59
|
-
let searchIdx =
|
|
60
|
-
while (
|
|
89
|
+
let searchIdx = normalizedText.indexOf(normalizedQuery);
|
|
90
|
+
while (searchIdx !== -1) {
|
|
61
91
|
score += 3; // exact phrase match scores higher than AND
|
|
62
|
-
searchIdx
|
|
92
|
+
searchIdx = normalizedText.indexOf(normalizedQuery, searchIdx + normalizedQuery.length);
|
|
63
93
|
}
|
|
64
94
|
}
|
|
65
95
|
else if (queryWords.length > 1) {
|
|
@@ -69,10 +99,10 @@ export function searchTextIndex(index, query, maxResults, sectionIndex) {
|
|
|
69
99
|
continue;
|
|
70
100
|
// Score = sum of individual word occurrences
|
|
71
101
|
for (const word of queryWords) {
|
|
72
|
-
let searchIdx =
|
|
73
|
-
while (
|
|
102
|
+
let searchIdx = normalizedText.indexOf(word);
|
|
103
|
+
while (searchIdx !== -1) {
|
|
74
104
|
score++;
|
|
75
|
-
searchIdx
|
|
105
|
+
searchIdx = normalizedText.indexOf(word, searchIdx + word.length);
|
|
76
106
|
}
|
|
77
107
|
}
|
|
78
108
|
// Find best snippet position (first occurrence of any query word)
|