@cyanheads/pubmed-mcp-server 2.10.7 → 2.10.9
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/AGENTS.md +9 -5
- package/CLAUDE.md +9 -5
- package/README.md +4 -3
- package/dist/mcp-server/tools/definitions/_text.d.ts +23 -1
- package/dist/mcp-server/tools/definitions/_text.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/_text.js +25 -1
- package/dist/mcp-server/tools/definitions/_text.js.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts +18 -0
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js +501 -51
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.js +7 -11
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.js.map +1 -1
- package/dist/services/europe-pmc/europe-pmc-service.d.ts +3 -3
- package/dist/services/europe-pmc/europe-pmc-service.d.ts.map +1 -1
- package/dist/services/europe-pmc/europe-pmc-service.js +8 -16
- package/dist/services/europe-pmc/europe-pmc-service.js.map +1 -1
- package/dist/services/ncbi/ncbi-service.d.ts +5 -0
- package/dist/services/ncbi/ncbi-service.d.ts.map +1 -1
- package/dist/services/ncbi/ncbi-service.js +33 -10
- package/dist/services/ncbi/ncbi-service.js.map +1 -1
- package/dist/services/ncbi/parsing/ordered-xml-parser-options.d.ts +44 -0
- package/dist/services/ncbi/parsing/ordered-xml-parser-options.d.ts.map +1 -0
- package/dist/services/ncbi/parsing/ordered-xml-parser-options.js +41 -0
- package/dist/services/ncbi/parsing/ordered-xml-parser-options.js.map +1 -0
- package/dist/services/ncbi/parsing/pmc-article-parser.d.ts +47 -7
- package/dist/services/ncbi/parsing/pmc-article-parser.d.ts.map +1 -1
- package/dist/services/ncbi/parsing/pmc-article-parser.js +382 -43
- package/dist/services/ncbi/parsing/pmc-article-parser.js.map +1 -1
- package/dist/services/ncbi/parsing/pmc-xml-helpers.d.ts +26 -0
- package/dist/services/ncbi/parsing/pmc-xml-helpers.d.ts.map +1 -1
- package/dist/services/ncbi/parsing/pmc-xml-helpers.js +49 -3
- package/dist/services/ncbi/parsing/pmc-xml-helpers.js.map +1 -1
- package/dist/services/ncbi/response-handler.d.ts +3 -9
- package/dist/services/ncbi/response-handler.d.ts.map +1 -1
- package/dist/services/ncbi/response-handler.js +6 -29
- package/dist/services/ncbi/response-handler.js.map +1 -1
- package/dist/services/ncbi/types.d.ts +45 -2
- package/dist/services/ncbi/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/server.json +3 -3
|
@@ -7,7 +7,42 @@
|
|
|
7
7
|
* inline children and drops body sections for markup-heavy articles.
|
|
8
8
|
* @module src/services/ncbi/parsing/pmc-article-parser
|
|
9
9
|
*/
|
|
10
|
-
import { attrOf, childrenOf, findAll, findOne, tagNameOf, textContent, } from './pmc-xml-helpers.js';
|
|
10
|
+
import { attrOf, childrenOf, findAll, findAllDescendants, findOne, isTextNode, rawTextContent, tagNameOf, textContent, textContentExcluding, textOf, } from './pmc-xml-helpers.js';
|
|
11
|
+
/**
|
|
12
|
+
* Block content extracted into its own field and therefore excluded from the
|
|
13
|
+
* prose a paragraph contributes. A `<table-wrap>` nested inside a `<p>` would
|
|
14
|
+
* otherwise be flattened into the surrounding sentence, concatenating adjacent
|
|
15
|
+
* cell values into numbers that never existed. (#111)
|
|
16
|
+
*/
|
|
17
|
+
const LIFTED_BLOCK_TAGS = new Set(['table-wrap']);
|
|
18
|
+
/** Prose of one `<p>`, with lifted block content left out. */
|
|
19
|
+
function paragraphText(paragraph) {
|
|
20
|
+
return textContentExcluding(paragraph, LIFTED_BLOCK_TAGS);
|
|
21
|
+
}
|
|
22
|
+
/** True when a lifted block sits anywhere in this subtree. */
|
|
23
|
+
function containsLiftedBlock(node) {
|
|
24
|
+
return childrenOf(node).some((child) => LIFTED_BLOCK_TAGS.has(tagNameOf(child) ?? '') || containsLiftedBlock(child));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* True when a `<sec>` carried block content that was extracted into its own
|
|
28
|
+
* field — a `<table-wrap>` sitting beside its paragraphs, or nested inside one.
|
|
29
|
+
*
|
|
30
|
+
* This is what separates a section emptied by the lift from one that never had
|
|
31
|
+
* readable prose. The first is a real heading a reader needs in order to place
|
|
32
|
+
* the table that names it; the second is a structural wrapper — a `<sec>` around
|
|
33
|
+
* a `<ref-list>`, say — which would arrive as a stray empty "References" entry
|
|
34
|
+
* if every empty section survived. Only this section's own children are
|
|
35
|
+
* considered: a `<table-wrap>` deeper down belongs to the nested `<sec>` that
|
|
36
|
+
* holds it, and that section survives on its own account. (#111, #116)
|
|
37
|
+
*/
|
|
38
|
+
function hasLiftedBlockContent(sec) {
|
|
39
|
+
return childrenOf(sec).some((child) => {
|
|
40
|
+
const tag = tagNameOf(child) ?? '';
|
|
41
|
+
if (LIFTED_BLOCK_TAGS.has(tag))
|
|
42
|
+
return true;
|
|
43
|
+
return tag === 'p' && containsLiftedBlock(child);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
11
46
|
// ─── Article IDs ────────────────────────────────────────────────────────────
|
|
12
47
|
function extractArticleId(articleMeta, pubIdType) {
|
|
13
48
|
if (!articleMeta)
|
|
@@ -173,7 +208,7 @@ export function extractBodySections(body) {
|
|
|
173
208
|
for (const child of childrenOf(body)) {
|
|
174
209
|
const tag = tagNameOf(child);
|
|
175
210
|
if (tag === 'p') {
|
|
176
|
-
const text =
|
|
211
|
+
const text = paragraphText(child);
|
|
177
212
|
if (text)
|
|
178
213
|
pendingParagraphs.push(text);
|
|
179
214
|
}
|
|
@@ -190,13 +225,16 @@ export function extractBodySections(body) {
|
|
|
190
225
|
function extractSection(sec) {
|
|
191
226
|
const title = textContent(findOne(sec, 'title')) || undefined;
|
|
192
227
|
const label = textContent(findOne(sec, 'label')) || undefined;
|
|
193
|
-
const
|
|
194
|
-
const textParts = paragraphs.map((p) => textContent(p)).filter(Boolean);
|
|
228
|
+
const textParts = findAll(sec, 'p').map(paragraphText).filter(Boolean);
|
|
195
229
|
const subsections = findAll(sec, 'sec')
|
|
196
230
|
.map(extractSection)
|
|
197
231
|
.filter((s) => s !== null);
|
|
198
232
|
const text = textParts.join('\n\n');
|
|
199
|
-
|
|
233
|
+
// A section left empty *because* its block content was lifted into `tables[]`
|
|
234
|
+
// survives as a heading-only entry: the heading is what places the table for a
|
|
235
|
+
// reader, and dropping it also erased the section from a `sections` filter's
|
|
236
|
+
// reach. A section that never carried prose still drops. (#111)
|
|
237
|
+
if (!text && subsections.length === 0 && !hasLiftedBlockContent(sec))
|
|
200
238
|
return null;
|
|
201
239
|
return {
|
|
202
240
|
...(title && { title }),
|
|
@@ -205,6 +243,179 @@ function extractSection(sec) {
|
|
|
205
243
|
...(subsections.length > 0 && { subsections }),
|
|
206
244
|
};
|
|
207
245
|
}
|
|
246
|
+
// ─── Tables ─────────────────────────────────────────────────────────────────
|
|
247
|
+
/**
|
|
248
|
+
* Extract every `<table-wrap>` under `root` in document order — pass the
|
|
249
|
+
* `<article>` node.
|
|
250
|
+
*
|
|
251
|
+
* The walk covers the whole article rather than `<body>` alone: about a quarter
|
|
252
|
+
* of real tables sit in `<floats-group>`, `<back>/<sec>`, `<table-wrap-group>`
|
|
253
|
+
* or `<app-group>/<app>`, so a body-scoped extractor drops them. Each table
|
|
254
|
+
* names the innermost enclosing `<sec>` wherever that sits — a back-matter or
|
|
255
|
+
* appendix section counts, and naming it is the reader's only positional cue
|
|
256
|
+
* there. Only a table inside no `<sec>` at all, such as a `<floats-group>`
|
|
257
|
+
* deposit, carries no section name.
|
|
258
|
+
*
|
|
259
|
+
* Only XHTML `<tr>`/`<td>`/`<th>` bodies are read. **Decision, not an
|
|
260
|
+
* oversight:** across a 283-table survey of open-access records, 276 were XHTML,
|
|
261
|
+
* 7 were graphic-only deposits and 0 used the CALS `<tgroup>` model. Graphic-only
|
|
262
|
+
* and CALS bodies therefore take the unextractable path — returned with their
|
|
263
|
+
* label and caption and a reason — rather than adding a second table model no
|
|
264
|
+
* observed record needs. Revisit only if CALS shows up in the wild. (#111)
|
|
265
|
+
*/
|
|
266
|
+
export function extractPmcTables(root) {
|
|
267
|
+
if (!root)
|
|
268
|
+
return [];
|
|
269
|
+
const tables = [];
|
|
270
|
+
collectTables(root, undefined, tables);
|
|
271
|
+
return tables;
|
|
272
|
+
}
|
|
273
|
+
function collectTables(node, sectionTitle, out) {
|
|
274
|
+
for (const child of childrenOf(node)) {
|
|
275
|
+
const tag = tagNameOf(child);
|
|
276
|
+
if (!tag)
|
|
277
|
+
continue;
|
|
278
|
+
if (tag === 'table-wrap') {
|
|
279
|
+
out.push(parseTableWrap(child, sectionTitle));
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
// An untitled <sec> keeps its parent's title rather than dropping the
|
|
283
|
+
// reader's only positional cue.
|
|
284
|
+
const nested = tag === 'sec' ? textContent(findOne(child, 'title')) || sectionTitle : sectionTitle;
|
|
285
|
+
collectTables(child, nested, out);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function parseTableWrap(tableWrap, sectionTitle) {
|
|
289
|
+
const id = attrOf(tableWrap, 'id');
|
|
290
|
+
const label = textContent(findOne(tableWrap, 'label')) || undefined;
|
|
291
|
+
const caption = textContent(findOne(tableWrap, 'caption')) || undefined;
|
|
292
|
+
const footnotes = textContent(findOne(tableWrap, 'table-wrap-foot')) || undefined;
|
|
293
|
+
// Some deposits offer both renderings inside <alternatives>; prefer the markup.
|
|
294
|
+
const table = findOne(tableWrap, 'table') ?? findOne(findOne(tableWrap, 'alternatives'), 'table');
|
|
295
|
+
const { rows, headerRowCount } = table
|
|
296
|
+
? extractTableRows(table)
|
|
297
|
+
: { rows: [], headerRowCount: 0 };
|
|
298
|
+
return {
|
|
299
|
+
...(id && { id }),
|
|
300
|
+
...(label && { label }),
|
|
301
|
+
...(caption && { caption }),
|
|
302
|
+
...(sectionTitle && { sectionTitle }),
|
|
303
|
+
headerRowCount,
|
|
304
|
+
rows,
|
|
305
|
+
...(footnotes && { footnotes }),
|
|
306
|
+
...(rows.length === 0 && {
|
|
307
|
+
unextractableReason: classifyUnextractable(tableWrap, table),
|
|
308
|
+
}),
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
function classifyUnextractable(tableWrap, table) {
|
|
312
|
+
if (findOne(tableWrap, 'tgroup') || findOne(table, 'tgroup'))
|
|
313
|
+
return 'cals-tgroup';
|
|
314
|
+
if (findOne(tableWrap, 'graphic') || findOne(findOne(tableWrap, 'alternatives'), 'graphic')) {
|
|
315
|
+
return 'graphic-only';
|
|
316
|
+
}
|
|
317
|
+
return 'no-rows';
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Widest grid a single table row may occupy, and the ceiling every declared
|
|
321
|
+
* span is clamped to. Real deposits are far narrower — the widest row observed
|
|
322
|
+
* across a live sample was 15 columns — so this bounds a malformed or hostile
|
|
323
|
+
* span rather than limiting any genuine table: `colspan="99999999"` costs a
|
|
324
|
+
* bounded row instead of an unbounded allocation, and a `rowspan` that large
|
|
325
|
+
* carries a bounded number of rows down. How many rows a table has is set by its
|
|
326
|
+
* source `<tr>` elements and needs no cap of its own. (#111)
|
|
327
|
+
*/
|
|
328
|
+
export const MAX_TABLE_COLUMNS = 512;
|
|
329
|
+
/** A `colspan`/`rowspan` value, clamped to a sane grid. Anything unparseable is 1. */
|
|
330
|
+
function spanOf(cell, name) {
|
|
331
|
+
const declared = Number.parseInt(attrOf(cell, name) ?? '', 10);
|
|
332
|
+
if (!Number.isFinite(declared) || declared < 1)
|
|
333
|
+
return 1;
|
|
334
|
+
return Math.min(declared, MAX_TABLE_COLUMNS);
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Read an XHTML `<table>` into rows of cell text, expanding `colspan` and
|
|
338
|
+
* `rowspan` so every entry in a row is one grid column.
|
|
339
|
+
*
|
|
340
|
+
* A cell covering N columns occupies N entries and one covering M rows occupies
|
|
341
|
+
* its column in the M rows below it, repeating its text across the cells it
|
|
342
|
+
* genuinely covers. Repeating is the honest flattening: the value belongs to
|
|
343
|
+
* each of those positions, and a reader scanning a column finds it there. The
|
|
344
|
+
* alternative — keeping the source cell count — leaves the column a value
|
|
345
|
+
* belongs to unrecoverable downstream, so a renderer padding rows from the left
|
|
346
|
+
* puts values under the wrong headers. (#111)
|
|
347
|
+
*
|
|
348
|
+
* Header rows are those in `<thead>` plus any leading row made entirely of
|
|
349
|
+
* `<th>` in a table that declares no `<thead>`.
|
|
350
|
+
*/
|
|
351
|
+
function extractTableRows(table) {
|
|
352
|
+
const parsed = [];
|
|
353
|
+
/** Live `rowspan` obligations, indexed by grid column. */
|
|
354
|
+
const carried = [];
|
|
355
|
+
/** Consume the carried cells sitting at and after `col`, contiguously. */
|
|
356
|
+
const drainCarried = (row, col) => {
|
|
357
|
+
let at = col;
|
|
358
|
+
while (at < MAX_TABLE_COLUMNS) {
|
|
359
|
+
const carry = carried[at];
|
|
360
|
+
if (!carry)
|
|
361
|
+
return at;
|
|
362
|
+
row[at] = carry.value;
|
|
363
|
+
carry.remaining -= 1;
|
|
364
|
+
if (carry.remaining <= 0)
|
|
365
|
+
carried[at] = undefined;
|
|
366
|
+
at += 1;
|
|
367
|
+
}
|
|
368
|
+
return at;
|
|
369
|
+
};
|
|
370
|
+
const pushRow = (tr, inHead) => {
|
|
371
|
+
const row = [];
|
|
372
|
+
let col = 0;
|
|
373
|
+
let sourceCells = 0;
|
|
374
|
+
let allHeaderCells = true;
|
|
375
|
+
for (const cell of childrenOf(tr)) {
|
|
376
|
+
const tag = tagNameOf(cell);
|
|
377
|
+
if (tag !== 'td' && tag !== 'th')
|
|
378
|
+
continue;
|
|
379
|
+
if (tag === 'td')
|
|
380
|
+
allHeaderCells = false;
|
|
381
|
+
sourceCells += 1;
|
|
382
|
+
col = drainCarried(row, col);
|
|
383
|
+
const value = textContent(cell);
|
|
384
|
+
const rowspan = spanOf(cell, 'rowspan');
|
|
385
|
+
const width = Math.min(spanOf(cell, 'colspan'), MAX_TABLE_COLUMNS - col);
|
|
386
|
+
for (let i = 0; i < width; i++) {
|
|
387
|
+
row[col] = value;
|
|
388
|
+
if (rowspan > 1)
|
|
389
|
+
carried[col] = { remaining: rowspan - 1, value };
|
|
390
|
+
col += 1;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// Carried cells past the last source cell still hold their columns. Walk out
|
|
394
|
+
// to the rightmost live obligation so they land where they belong; the gaps
|
|
395
|
+
// in between are columns this row genuinely left empty.
|
|
396
|
+
const rightmost = carried.reduce((last, carry, i) => (carry ? i : last), -1);
|
|
397
|
+
while (col <= rightmost)
|
|
398
|
+
col = carried[col] ? drainCarried(row, col) : col + 1;
|
|
399
|
+
if (sourceCells === 0)
|
|
400
|
+
return;
|
|
401
|
+
for (let i = 0; i < row.length; i++)
|
|
402
|
+
row[i] ??= '';
|
|
403
|
+
parsed.push({ cells: row, header: inHead || allHeaderCells });
|
|
404
|
+
};
|
|
405
|
+
for (const child of childrenOf(table)) {
|
|
406
|
+
const tag = tagNameOf(child);
|
|
407
|
+
if (tag === 'tr')
|
|
408
|
+
pushRow(child, false);
|
|
409
|
+
else if (tag === 'thead' || tag === 'tbody' || tag === 'tfoot') {
|
|
410
|
+
for (const tr of findAll(child, 'tr'))
|
|
411
|
+
pushRow(tr, tag === 'thead');
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
let headerRowCount = 0;
|
|
415
|
+
while (parsed[headerRowCount]?.header)
|
|
416
|
+
headerRowCount++;
|
|
417
|
+
return { headerRowCount, rows: parsed.map((row) => row.cells) };
|
|
418
|
+
}
|
|
208
419
|
// ─── References ─────────────────────────────────────────────────────────────
|
|
209
420
|
/**
|
|
210
421
|
* `pub-id-type` → human label, so the trailing identifiers in a rendered
|
|
@@ -264,46 +475,173 @@ function renderElementCitation(node) {
|
|
|
264
475
|
return parts.join(' ');
|
|
265
476
|
}
|
|
266
477
|
/**
|
|
267
|
-
*
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
478
|
+
* Author-name wrappers a `<mixed-citation>` can carry as a direct child. Their
|
|
479
|
+
* parts routinely sit adjacent with zero characters between them, so the
|
|
480
|
+
* sibling-element spacing rule has to reach inside them rather than stopping at
|
|
481
|
+
* the wrapper. Scoped to these three deliberately: recursing into arbitrary
|
|
482
|
+
* elements would change how inline markup inside `<article-title>` and friends
|
|
483
|
+
* renders. (#124)
|
|
272
484
|
*/
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
485
|
+
const NAME_WRAPPER_TAGS = new Set(['name', 'string-name', 'person-group']);
|
|
486
|
+
/**
|
|
487
|
+
* Serialize a `<name>` / `<string-name>` / `<person-group>` subtree, applying
|
|
488
|
+
* the same rule `renderMixedCitation` applies to its own children: a single
|
|
489
|
+
* space between two adjacent elements that carry nothing between them, and
|
|
490
|
+
* source text emitted verbatim. `<person-group>` separates its names with real
|
|
491
|
+
* `, ` text nodes and `<string-name>` usually separates surname from given
|
|
492
|
+
* names with a newline, so a fixed separator would double punctuation the
|
|
493
|
+
* source already has — spacing only the zero-gap transitions leaves those
|
|
494
|
+
* records byte-identical. Returns raw text; the caller collapses whitespace
|
|
495
|
+
* once over the finished citation.
|
|
496
|
+
*/
|
|
497
|
+
function renderNameWrapper(node) {
|
|
498
|
+
let rendered = '';
|
|
499
|
+
let prevWasElement = false;
|
|
500
|
+
for (const child of childrenOf(node)) {
|
|
501
|
+
if (isTextNode(child)) {
|
|
502
|
+
const raw = textOf(child);
|
|
503
|
+
if (raw) {
|
|
504
|
+
rendered += raw;
|
|
505
|
+
prevWasElement = false;
|
|
506
|
+
}
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
const tag = tagNameOf(child) ?? '';
|
|
510
|
+
const part = NAME_WRAPPER_TAGS.has(tag) ? renderNameWrapper(child) : rawTextContent(child);
|
|
511
|
+
if (!part)
|
|
512
|
+
continue;
|
|
513
|
+
if (prevWasElement)
|
|
514
|
+
rendered += ' ';
|
|
515
|
+
rendered += part;
|
|
516
|
+
prevWasElement = true;
|
|
517
|
+
}
|
|
518
|
+
return rendered;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* True when the citation text emitted so far already ends with a literal prefix
|
|
522
|
+
* naming this `pub-id-type` (`doi:`, `PMID `, `pmcid.`), so prepending the label
|
|
523
|
+
* would read `doi:DOI 10.1111/…`. (#115)
|
|
524
|
+
*/
|
|
525
|
+
function hasLiteralIdPrefix(rendered, pubIdType) {
|
|
526
|
+
const tail = rendered.trimEnd().replace(/[:.]$/, '').trimEnd();
|
|
527
|
+
return tail.toLowerCase().endsWith(pubIdType.toLowerCase());
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Render a `<mixed-citation>` as a readable string.
|
|
531
|
+
*
|
|
532
|
+
* Mixed citations carry their punctuation in the text nodes between elements,
|
|
533
|
+
* so a flat `textContent()` reads correctly almost everywhere. Three adjacencies
|
|
534
|
+
* defeat it, all with zero characters between the elements: consecutive typed
|
|
535
|
+
* `<pub-id>`s fuse into one unreadable token (#115), an inline title runs
|
|
536
|
+
* straight into the volume that follows it (#123), and a `<surname>` glues onto
|
|
537
|
+
* the `<given-names>` beside it inside an author-name wrapper (#124). Walk the
|
|
538
|
+
* direct children so those cases can be repaired without touching `textContent`,
|
|
539
|
+
* which abstracts, titles, and body paragraphs share and where zero-gap
|
|
540
|
+
* adjacency is often intentional.
|
|
541
|
+
*
|
|
542
|
+
* Typed `<pub-id>`s are labeled (unless literal prefix text already names the
|
|
543
|
+
* type), and a single space separates two adjacent elements that carry nothing
|
|
544
|
+
* between them. A label is text this renderer inserts rather than source
|
|
545
|
+
* content, so it is separated from whatever precedes it as well — publisher
|
|
546
|
+
* styles routinely close the prose on punctuation (`… (2020).`, `…021]`) and a
|
|
547
|
+
* label butted against that reads as one token. Source transitions that already
|
|
548
|
+
* carry punctuation or whitespace are emitted unchanged; the trailing whitespace
|
|
549
|
+
* collapse keeps a whitespace-only gap at one space.
|
|
550
|
+
*/
|
|
551
|
+
function renderMixedCitation(node) {
|
|
552
|
+
let rendered = '';
|
|
553
|
+
let prevWasElement = false;
|
|
554
|
+
for (const child of childrenOf(node)) {
|
|
555
|
+
if (isTextNode(child)) {
|
|
556
|
+
const raw = textOf(child);
|
|
557
|
+
if (raw) {
|
|
558
|
+
rendered += raw;
|
|
559
|
+
prevWasElement = false;
|
|
560
|
+
}
|
|
561
|
+
continue;
|
|
562
|
+
}
|
|
563
|
+
const tag = tagNameOf(child) ?? '';
|
|
564
|
+
let part;
|
|
565
|
+
let labeled = false;
|
|
566
|
+
if (tag === 'pub-id') {
|
|
567
|
+
const value = textContent(child);
|
|
568
|
+
if (!value)
|
|
569
|
+
continue;
|
|
570
|
+
const type = attrOf(child, 'pub-id-type') ?? '';
|
|
571
|
+
const label = PUB_ID_LABELS[type];
|
|
572
|
+
if (label && !hasLiteralIdPrefix(rendered, type)) {
|
|
573
|
+
labeled = true;
|
|
574
|
+
part = `${label} ${value}`;
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
part = value;
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
else if (NAME_WRAPPER_TAGS.has(tag)) {
|
|
581
|
+
part = renderNameWrapper(child);
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
part = rawTextContent(child);
|
|
585
|
+
}
|
|
586
|
+
if (prevWasElement || labeled)
|
|
587
|
+
rendered += ' ';
|
|
588
|
+
rendered += part;
|
|
589
|
+
prevWasElement = true;
|
|
590
|
+
}
|
|
591
|
+
return rendered.replace(/\s+/g, ' ').trim();
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* Extract references from anywhere under `root` — pass the `<article>` node to
|
|
595
|
+
* cover a whole document, or a `<back>` node to scope the search to it.
|
|
596
|
+
*
|
|
597
|
+
* `<ref-list>` placement is not uniform: roughly 60% of Europe PMC deposits nest
|
|
598
|
+
* it under `body/sec/sec` and the rest put it directly under `<back>`, so a
|
|
599
|
+
* search scoped to a direct `<back>` child misses the majority. Every
|
|
600
|
+
* `<ref-list>` descendant is collected in document order instead, and a `<ref>`
|
|
601
|
+
* id already seen is skipped so a document exposing the same list under both
|
|
602
|
+
* containers still yields each reference once. (#116)
|
|
603
|
+
*
|
|
604
|
+
* Prefers `<mixed-citation>` over `<element-citation>`, descending into
|
|
605
|
+
* `<citation-alternatives>` when a ref carries both forms there rather than as
|
|
606
|
+
* direct children of `<ref>`. Both forms are rendered child-by-child so adjacent
|
|
607
|
+
* elements stay separable (see `renderMixedCitation` and
|
|
608
|
+
* `renderElementCitation`).
|
|
609
|
+
*/
|
|
610
|
+
export function extractReferences(root) {
|
|
611
|
+
if (!root)
|
|
278
612
|
return [];
|
|
279
613
|
const results = [];
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
citation =
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
614
|
+
const seenIds = new Set();
|
|
615
|
+
for (const refList of findAllDescendants(root, 'ref-list')) {
|
|
616
|
+
for (const ref of findAll(refList, 'ref')) {
|
|
617
|
+
const id = attrOf(ref, 'id');
|
|
618
|
+
if (id && seenIds.has(id))
|
|
619
|
+
continue;
|
|
620
|
+
// JATS wraps the two citation forms in <citation-alternatives> (the NLM
|
|
621
|
+
// construct carrying both a structured <element-citation> and a readable
|
|
622
|
+
// <mixed-citation>). findOne matches direct children only, so resolve that
|
|
623
|
+
// container first; refs with a direct citation node fall through to `ref`.
|
|
624
|
+
const container = findOne(ref, 'citation-alternatives') ?? ref;
|
|
625
|
+
const mixedCitation = findOne(container, 'mixed-citation');
|
|
626
|
+
const elementCitation = findOne(container, 'element-citation');
|
|
627
|
+
let citation = '';
|
|
628
|
+
if (mixedCitation) {
|
|
629
|
+
citation = renderMixedCitation(mixedCitation);
|
|
630
|
+
}
|
|
631
|
+
else if (elementCitation) {
|
|
632
|
+
citation = renderElementCitation(elementCitation);
|
|
633
|
+
}
|
|
634
|
+
if (!citation)
|
|
635
|
+
continue;
|
|
636
|
+
if (id)
|
|
637
|
+
seenIds.add(id);
|
|
638
|
+
const label = textContent(findOne(ref, 'label')) || undefined;
|
|
639
|
+
results.push({
|
|
640
|
+
...(id && { id }),
|
|
641
|
+
...(label && { label }),
|
|
642
|
+
citation,
|
|
643
|
+
});
|
|
297
644
|
}
|
|
298
|
-
if (!citation)
|
|
299
|
-
continue;
|
|
300
|
-
const id = attrOf(ref, 'id');
|
|
301
|
-
const label = textContent(findOne(ref, 'label')) || undefined;
|
|
302
|
-
results.push({
|
|
303
|
-
...(id && { id }),
|
|
304
|
-
...(label && { label }),
|
|
305
|
-
citation,
|
|
306
|
-
});
|
|
307
645
|
}
|
|
308
646
|
return results;
|
|
309
647
|
}
|
|
@@ -319,7 +657,6 @@ export function parsePmcArticle(articleNode) {
|
|
|
319
657
|
const articleMeta = findOne(front, 'article-meta');
|
|
320
658
|
const journalMeta = findOne(front, 'journal-meta');
|
|
321
659
|
const body = findOne(articleNode, 'body');
|
|
322
|
-
const back = findOne(articleNode, 'back');
|
|
323
660
|
const pmcId = extractArticleId(articleMeta, 'pmcid') ?? extractArticleId(articleMeta, 'pmc-uid') ?? '';
|
|
324
661
|
const pmid = extractArticleId(articleMeta, 'pmid');
|
|
325
662
|
const doi = extractArticleId(articleMeta, 'doi');
|
|
@@ -332,7 +669,8 @@ export function parsePmcArticle(articleNode) {
|
|
|
332
669
|
const abstract = extractAbstract(articleMeta);
|
|
333
670
|
const keywords = extractKeywords(articleMeta);
|
|
334
671
|
const sections = extractBodySections(body);
|
|
335
|
-
const references = extractReferences(
|
|
672
|
+
const references = extractReferences(articleNode);
|
|
673
|
+
const tables = extractPmcTables(articleNode);
|
|
336
674
|
const normalizedPmcId = !pmcId ? '' : pmcId.startsWith('PMC') ? pmcId : `PMC${pmcId}`;
|
|
337
675
|
const articleType = attrOf(articleNode, 'article-type');
|
|
338
676
|
return {
|
|
@@ -348,6 +686,7 @@ export function parsePmcArticle(articleNode) {
|
|
|
348
686
|
...(keywords.length > 0 && { keywords }),
|
|
349
687
|
sections,
|
|
350
688
|
...(references.length > 0 && { references }),
|
|
689
|
+
...(tables.length > 0 && { tables }),
|
|
351
690
|
...(articleType && { articleType }),
|
|
352
691
|
pmcUrl: `https://www.ncbi.nlm.nih.gov/pmc/articles/${normalizedPmcId}/`,
|
|
353
692
|
...(pmid && { pubmedUrl: `https://pubmed.ncbi.nlm.nih.gov/${pmid}/` }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pmc-article-parser.js","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/pmc-article-parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pmc-article-parser.js","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/pmc-article-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,14 @@ export declare function attrOf(node: JatsNode, name: string): string | undefined
|
|
|
30
30
|
export declare function isTextNode(node: JatsNode): boolean;
|
|
31
31
|
/** Stringified text value of a text node. */
|
|
32
32
|
export declare function textOf(node: JatsNode): string;
|
|
33
|
+
/**
|
|
34
|
+
* Extract all text from a node or sibling list in document order with the
|
|
35
|
+
* source spacing intact — no whitespace collapsing, no trimming. Use it when
|
|
36
|
+
* the caller assembles several fragments itself and needs to collapse once over
|
|
37
|
+
* the joined result; {@link textContent} is the normalizing form for everything
|
|
38
|
+
* else.
|
|
39
|
+
*/
|
|
40
|
+
export declare function rawTextContent(input: JatsNode | JatsNodeList | undefined): string;
|
|
33
41
|
/**
|
|
34
42
|
* Extract all text from a node or sibling list in document order, collapsing
|
|
35
43
|
* runs of whitespace to a single space and trimming the result. Use this for
|
|
@@ -37,8 +45,26 @@ export declare function textOf(node: JatsNode): string;
|
|
|
37
45
|
* children must read back in the order they appear in the source.
|
|
38
46
|
*/
|
|
39
47
|
export declare function textContent(input: JatsNode | JatsNodeList | undefined): string;
|
|
48
|
+
/**
|
|
49
|
+
* {@link textContent}, with the subtree of any element named in `excludedTags`
|
|
50
|
+
* left out. Block content a publisher nests inside a `<p>` — a `<table-wrap>` in
|
|
51
|
+
* particular — would otherwise be flattened into the paragraph, running every
|
|
52
|
+
* cell together into values that never existed. Such content is extracted
|
|
53
|
+
* separately and must not appear in the prose twice.
|
|
54
|
+
*/
|
|
55
|
+
export declare function textContentExcluding(input: JatsNode | JatsNodeList | undefined, excludedTags: ReadonlySet<string>): string;
|
|
40
56
|
/** First direct child with the given tag name. */
|
|
41
57
|
export declare function findOne(input: JatsNode | JatsNodeList | undefined, tagName: string): JatsNode | undefined;
|
|
42
58
|
/** All direct children with the given tag name. */
|
|
43
59
|
export declare function findAll(input: JatsNode | JatsNodeList | undefined, tagName: string): JatsNode[];
|
|
60
|
+
/**
|
|
61
|
+
* Every descendant element with the given tag name, in document order.
|
|
62
|
+
* {@link findAll} matches direct children only, which is right for reading a
|
|
63
|
+
* known JATS shape; this is for containers publishers place at varying depths
|
|
64
|
+
* (a `<ref-list>` under `<back>` in one deposit and under `body/sec/sec` in the
|
|
65
|
+
* next). The walk keeps descending through a match, so a container nested
|
|
66
|
+
* inside another of the same tag is reported too. Each node is visited once, so
|
|
67
|
+
* the result never repeats a node.
|
|
68
|
+
*/
|
|
69
|
+
export declare function findAllDescendants(input: JatsNode | JatsNodeList | undefined, tagName: string): JatsNode[];
|
|
44
70
|
//# sourceMappingURL=pmc-xml-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pmc-xml-helpers.d.ts","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/pmc-xml-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;AAKtC,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAK5D;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAKvD;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIvE;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAElD;AAED,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAG7C;
|
|
1
|
+
{"version":3,"file":"pmc-xml-helpers.d.ts","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/pmc-xml-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,EAAE,CAAC;AAKtC,uFAAuF;AACvF,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAK5D;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,YAAY,CAKvD;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIvE;AAED,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAElD;AAED,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAG7C;AAoBD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,GAAG,MAAM,CAG9E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,EAC1C,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,GAChC,MAAM,CAGR;AAED,kDAAkD;AAClD,wBAAgB,OAAO,CACrB,KAAK,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,EAC1C,OAAO,EAAE,MAAM,GACd,QAAQ,GAAG,SAAS,CAItB;AAED,mDAAmD;AACnD,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE,CAI/F;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,QAAQ,GAAG,YAAY,GAAG,SAAS,EAC1C,OAAO,EAAE,MAAM,GACd,QAAQ,EAAE,CAWZ"}
|