Article

step · paper open

Declaration bf9f9533fb03 has not been accepted by anyone. · no paper read under it

What does the paper itself say, section by section?

Mechanical: re-runnable from its declared inputs.

Part of Source — What text did the readers read, and what does the paper itself say?

How it works

Parses the cached JATS into the structure a page needs: the section tree with its headings, each paragraph with its inline markup and its cross-references, each figure with its caption and the image eLife serves, each table with its rows. The abstract is split into sentences here; the body's sentences are not, because those come from the marked paper, and splitting them twice by two rules would give the site two sentences to reconcile where the claim assignments are.

Sub-articles are excluded. eLife's JATS carries the editor assessment, the referee reports and the author response inside the same document, each with a of its own, and a search that reaches into them renders the reviews as part of the paper.

Rests on

Feeds

Nothing — this is a leaf.

How it is defined

What this layer reads besides its dependencies. Each is a declared input: its content is hashed into every run, so editing one makes those runs stale.

scripts/article_json.pythe script that runs it307 lines

What it says it does

The article, as the site renders it: JATS-XML into one JSON file per paper.

`prepare` already fetches the JATS and keeps four flattened strings from it — abstract,
results, captions, methods — which is everything the three readers need and nothing a page
needs. `results_text` is one string with the section headings glued to the sentences that
follow them, so a site that wants to show the paper cannot recover where the sections were.

This keeps the structure instead: the section tree, each paragraph with its inline markup,
the figures with their captions, the tables with their rows. It calls no model and reads the
same cached XML `prepare` fetched, so it is free to re-run and its output is byte-stable —
nothing here stamps a date, which is what stops a rebuild from marking every paper stale.

    python3 scripts/article_json.py gadeke-2026-guilt-insula
    python3 scripts/article_json.py --all

What it produces

One paper, as the worked example — Artiushin, v3. Read from site/src/data/article/artiushin-2026-spider-atlas.json · 205 KB. slug artiushin-2026-spider-atlasdoi 10.7554/eLife.107732articleId 107732source https://cdn.elifesciences.org/articles/107732/elife-107732-v1.xmltitle A three-dimensional immunofluorescence atlas of the brain of the hackled-orb weaver spider, Uloborus diversusyear 2026

Nothing on this page renders document for this file yet — the link above is the artifact itself.

Across the corpus

10 stale·a paper links to its own cell, where this layer's output for it is rendered

Inputs and outputs

Reads, besides its dependencies
Produces
  • site/src/data/article/{paper}.json

One per paper — the table above links each one that exists.

Views
  • document — declared, and this artifact is not the shape this view needs

Running it

The command comes from the declaration, so this text and what actually runs cannot diverge. pipeline.py run also runs the unmet dependencies first.

python3 scripts/pipeline.py run <paper> article

Underneath, that runs python3 scripts/article_json.py {paper}.