@cyanheads/pubmed-mcp-server 2.10.8 → 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.
Files changed (35) hide show
  1. package/AGENTS.md +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +4 -3
  4. package/dist/mcp-server/tools/definitions/_text.d.ts +23 -1
  5. package/dist/mcp-server/tools/definitions/_text.d.ts.map +1 -1
  6. package/dist/mcp-server/tools/definitions/_text.js +25 -1
  7. package/dist/mcp-server/tools/definitions/_text.js.map +1 -1
  8. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts +18 -0
  9. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts.map +1 -1
  10. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js +409 -31
  11. package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.js.map +1 -1
  12. package/dist/services/europe-pmc/europe-pmc-service.d.ts +3 -3
  13. package/dist/services/europe-pmc/europe-pmc-service.d.ts.map +1 -1
  14. package/dist/services/europe-pmc/europe-pmc-service.js +8 -16
  15. package/dist/services/europe-pmc/europe-pmc-service.js.map +1 -1
  16. package/dist/services/ncbi/parsing/ordered-xml-parser-options.d.ts +44 -0
  17. package/dist/services/ncbi/parsing/ordered-xml-parser-options.d.ts.map +1 -0
  18. package/dist/services/ncbi/parsing/ordered-xml-parser-options.js +41 -0
  19. package/dist/services/ncbi/parsing/ordered-xml-parser-options.js.map +1 -0
  20. package/dist/services/ncbi/parsing/pmc-article-parser.d.ts +47 -7
  21. package/dist/services/ncbi/parsing/pmc-article-parser.d.ts.map +1 -1
  22. package/dist/services/ncbi/parsing/pmc-article-parser.js +322 -48
  23. package/dist/services/ncbi/parsing/pmc-article-parser.js.map +1 -1
  24. package/dist/services/ncbi/parsing/pmc-xml-helpers.d.ts +18 -0
  25. package/dist/services/ncbi/parsing/pmc-xml-helpers.d.ts.map +1 -1
  26. package/dist/services/ncbi/parsing/pmc-xml-helpers.js +39 -3
  27. package/dist/services/ncbi/parsing/pmc-xml-helpers.js.map +1 -1
  28. package/dist/services/ncbi/response-handler.d.ts +3 -9
  29. package/dist/services/ncbi/response-handler.d.ts.map +1 -1
  30. package/dist/services/ncbi/response-handler.js +6 -29
  31. package/dist/services/ncbi/response-handler.js.map +1 -1
  32. package/dist/services/ncbi/types.d.ts +39 -0
  33. package/dist/services/ncbi/types.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/server.json +3 -3
@@ -7,7 +7,7 @@
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 type { ParsedPmcArticle, ParsedPmcAuthor, ParsedPmcReference, ParsedPmcSection } from '../types.js';
10
+ import type { ParsedPmcArticle, ParsedPmcAuthor, ParsedPmcReference, ParsedPmcSection, ParsedPmcTable } from '../types.js';
11
11
  import { type JatsNode } from './pmc-xml-helpers.js';
12
12
  /** Extract authors from a single `<contrib-group>` node. Non-author contributors are skipped. */
13
13
  export declare function extractJatsAuthors(contribGroup: JatsNode | undefined): ParsedPmcAuthor[];
@@ -19,13 +19,53 @@ export declare function extractJatsAuthors(contribGroup: JatsNode | undefined):
19
19
  */
20
20
  export declare function extractBodySections(body: JatsNode | undefined): ParsedPmcSection[];
21
21
  /**
22
- * Extract references from a `<back>` node. Prefers `<mixed-citation>` over
23
- * `<element-citation>`, descending into `<citation-alternatives>` when a ref
24
- * carries both forms there rather than as direct children of `<ref>`. Both
25
- * forms are rendered child-by-child so adjacent elements stay separable (see
26
- * `renderMixedCitation` and `renderElementCitation`).
22
+ * Extract every `<table-wrap>` under `root` in document order — pass the
23
+ * `<article>` node.
24
+ *
25
+ * The walk covers the whole article rather than `<body>` alone: about a quarter
26
+ * of real tables sit in `<floats-group>`, `<back>/<sec>`, `<table-wrap-group>`
27
+ * or `<app-group>/<app>`, so a body-scoped extractor drops them. Each table
28
+ * names the innermost enclosing `<sec>` wherever that sits — a back-matter or
29
+ * appendix section counts, and naming it is the reader's only positional cue
30
+ * there. Only a table inside no `<sec>` at all, such as a `<floats-group>`
31
+ * deposit, carries no section name.
32
+ *
33
+ * Only XHTML `<tr>`/`<td>`/`<th>` bodies are read. **Decision, not an
34
+ * oversight:** across a 283-table survey of open-access records, 276 were XHTML,
35
+ * 7 were graphic-only deposits and 0 used the CALS `<tgroup>` model. Graphic-only
36
+ * and CALS bodies therefore take the unextractable path — returned with their
37
+ * label and caption and a reason — rather than adding a second table model no
38
+ * observed record needs. Revisit only if CALS shows up in the wild. (#111)
27
39
  */
28
- export declare function extractReferences(back: JatsNode | undefined): ParsedPmcReference[];
40
+ export declare function extractPmcTables(root: JatsNode | undefined): ParsedPmcTable[];
41
+ /**
42
+ * Widest grid a single table row may occupy, and the ceiling every declared
43
+ * span is clamped to. Real deposits are far narrower — the widest row observed
44
+ * across a live sample was 15 columns — so this bounds a malformed or hostile
45
+ * span rather than limiting any genuine table: `colspan="99999999"` costs a
46
+ * bounded row instead of an unbounded allocation, and a `rowspan` that large
47
+ * carries a bounded number of rows down. How many rows a table has is set by its
48
+ * source `<tr>` elements and needs no cap of its own. (#111)
49
+ */
50
+ export declare const MAX_TABLE_COLUMNS = 512;
51
+ /**
52
+ * Extract references from anywhere under `root` — pass the `<article>` node to
53
+ * cover a whole document, or a `<back>` node to scope the search to it.
54
+ *
55
+ * `<ref-list>` placement is not uniform: roughly 60% of Europe PMC deposits nest
56
+ * it under `body/sec/sec` and the rest put it directly under `<back>`, so a
57
+ * search scoped to a direct `<back>` child misses the majority. Every
58
+ * `<ref-list>` descendant is collected in document order instead, and a `<ref>`
59
+ * id already seen is skipped so a document exposing the same list under both
60
+ * containers still yields each reference once. (#116)
61
+ *
62
+ * Prefers `<mixed-citation>` over `<element-citation>`, descending into
63
+ * `<citation-alternatives>` when a ref carries both forms there rather than as
64
+ * direct children of `<ref>`. Both forms are rendered child-by-child so adjacent
65
+ * elements stay separable (see `renderMixedCitation` and
66
+ * `renderElementCitation`).
67
+ */
68
+ export declare function extractReferences(root: JatsNode | undefined): ParsedPmcReference[];
29
69
  /**
30
70
  * Parse a single JATS `<article>` node (from PMC EFetch via the ordered parser)
31
71
  * into a structured `ParsedPmcArticle`. The input node is the element wrapper
@@ -1 +1 @@
1
- {"version":3,"file":"pmc-article-parser.d.ts","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/pmc-article-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAML,KAAK,QAAQ,EAKd,MAAM,sBAAsB,CAAC;AAmB9B,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,eAAe,EAAE,CA2BxF;AA2HD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAgB,EAAE,CA2BlF;AAsJD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,EAAE,CAiClF;AAID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,QAAQ,GAAG,gBAAgB,CA4CvE"}
1
+ {"version":3,"file":"pmc-article-parser.d.ts","sourceRoot":"","sources":["../../../../src/services/ncbi/parsing/pmc-article-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAOL,KAAK,QAAQ,EAMd,MAAM,sBAAsB,CAAC;AA2D9B,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,eAAe,EAAE,CA2BxF;AA2HD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,gBAAgB,EAAE,CA2BlF;AA6BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,cAAc,EAAE,CAK7E;AA2DD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAkRrC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,kBAAkB,EAAE,CAsClF;AAID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,QAAQ,GAAG,gBAAgB,CA6CvE"}
@@ -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, isTextNode, rawTextContent, tagNameOf, textContent, textOf, } 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 = textContent(child);
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 paragraphs = findAll(sec, 'p');
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
- if (!text && subsections.length === 0)
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
@@ -263,6 +474,49 @@ function renderElementCitation(node) {
263
474
  }
264
475
  return parts.join(' ');
265
476
  }
477
+ /**
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)
484
+ */
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
+ }
266
520
  /**
267
521
  * True when the citation text emitted so far already ends with a literal prefix
268
522
  * naming this `pub-id-type` (`doi:`, `PMID `, `pmcid.`), so prepending the label
@@ -276,13 +530,14 @@ function hasLiteralIdPrefix(rendered, pubIdType) {
276
530
  * Render a `<mixed-citation>` as a readable string.
277
531
  *
278
532
  * Mixed citations carry their punctuation in the text nodes between elements,
279
- * so a flat `textContent()` reads correctly almost everywhere. Two adjacencies
280
- * defeat it, both with zero characters between the elements: consecutive typed
281
- * `<pub-id>`s fuse into one unreadable token (#115), and an inline title runs
282
- * straight into the volume that follows it (#123). Walk the direct children so
283
- * those two cases can be repaired without touching `textContent`, which
284
- * abstracts, titles, and body paragraphs share and where zero-gap adjacency is
285
- * often intentional.
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.
286
541
  *
287
542
  * Typed `<pub-id>`s are labeled (unless literal prefix text already names the
288
543
  * type), and a single space separates two adjacent elements that carry nothing
@@ -305,9 +560,10 @@ function renderMixedCitation(node) {
305
560
  }
306
561
  continue;
307
562
  }
563
+ const tag = tagNameOf(child) ?? '';
308
564
  let part;
309
565
  let labeled = false;
310
- if (tagNameOf(child) === 'pub-id') {
566
+ if (tag === 'pub-id') {
311
567
  const value = textContent(child);
312
568
  if (!value)
313
569
  continue;
@@ -321,6 +577,9 @@ function renderMixedCitation(node) {
321
577
  part = value;
322
578
  }
323
579
  }
580
+ else if (NAME_WRAPPER_TAGS.has(tag)) {
581
+ part = renderNameWrapper(child);
582
+ }
324
583
  else {
325
584
  part = rawTextContent(child);
326
585
  }
@@ -332,43 +591,57 @@ function renderMixedCitation(node) {
332
591
  return rendered.replace(/\s+/g, ' ').trim();
333
592
  }
334
593
  /**
335
- * Extract references from a `<back>` node. Prefers `<mixed-citation>` over
336
- * `<element-citation>`, descending into `<citation-alternatives>` when a ref
337
- * carries both forms there rather than as direct children of `<ref>`. Both
338
- * forms are rendered child-by-child so adjacent elements stay separable (see
339
- * `renderMixedCitation` and `renderElementCitation`).
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`).
340
609
  */
341
- export function extractReferences(back) {
342
- if (!back)
343
- return [];
344
- const refList = findOne(back, 'ref-list');
345
- if (!refList)
610
+ export function extractReferences(root) {
611
+ if (!root)
346
612
  return [];
347
613
  const results = [];
348
- for (const ref of findAll(refList, 'ref')) {
349
- // JATS wraps the two citation forms in <citation-alternatives> (the NLM
350
- // construct carrying both a structured <element-citation> and a readable
351
- // <mixed-citation>). findOne matches direct children only, so resolve that
352
- // container first; refs with a direct citation node fall through to `ref`.
353
- const container = findOne(ref, 'citation-alternatives') ?? ref;
354
- const mixedCitation = findOne(container, 'mixed-citation');
355
- const elementCitation = findOne(container, 'element-citation');
356
- let citation = '';
357
- if (mixedCitation) {
358
- citation = renderMixedCitation(mixedCitation);
359
- }
360
- else if (elementCitation) {
361
- citation = renderElementCitation(elementCitation);
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
+ });
362
644
  }
363
- if (!citation)
364
- continue;
365
- const id = attrOf(ref, 'id');
366
- const label = textContent(findOne(ref, 'label')) || undefined;
367
- results.push({
368
- ...(id && { id }),
369
- ...(label && { label }),
370
- citation,
371
- });
372
645
  }
373
646
  return results;
374
647
  }
@@ -384,7 +657,6 @@ export function parsePmcArticle(articleNode) {
384
657
  const articleMeta = findOne(front, 'article-meta');
385
658
  const journalMeta = findOne(front, 'journal-meta');
386
659
  const body = findOne(articleNode, 'body');
387
- const back = findOne(articleNode, 'back');
388
660
  const pmcId = extractArticleId(articleMeta, 'pmcid') ?? extractArticleId(articleMeta, 'pmc-uid') ?? '';
389
661
  const pmid = extractArticleId(articleMeta, 'pmid');
390
662
  const doi = extractArticleId(articleMeta, 'doi');
@@ -397,7 +669,8 @@ export function parsePmcArticle(articleNode) {
397
669
  const abstract = extractAbstract(articleMeta);
398
670
  const keywords = extractKeywords(articleMeta);
399
671
  const sections = extractBodySections(body);
400
- const references = extractReferences(back);
672
+ const references = extractReferences(articleNode);
673
+ const tables = extractPmcTables(articleNode);
401
674
  const normalizedPmcId = !pmcId ? '' : pmcId.startsWith('PMC') ? pmcId : `PMC${pmcId}`;
402
675
  const articleType = attrOf(articleNode, 'article-type');
403
676
  return {
@@ -413,6 +686,7 @@ export function parsePmcArticle(articleNode) {
413
686
  ...(keywords.length > 0 && { keywords }),
414
687
  sections,
415
688
  ...(references.length > 0 && { references }),
689
+ ...(tables.length > 0 && { tables }),
416
690
  ...(articleType && { articleType }),
417
691
  pmcUrl: `https://www.ncbi.nlm.nih.gov/pmc/articles/${normalizedPmcId}/`,
418
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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"}
@@ -45,8 +45,26 @@ export declare function rawTextContent(input: JatsNode | JatsNodeList | undefine
45
45
  * children must read back in the order they appear in the source.
46
46
  */
47
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;
48
56
  /** First direct child with the given tag name. */
49
57
  export declare function findOne(input: JatsNode | JatsNodeList | undefined, tagName: string): JatsNode | undefined;
50
58
  /** All direct children with the given tag name. */
51
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[];
52
70
  //# sourceMappingURL=pmc-xml-helpers.d.ts.map