Skip to content

Artikel: Infoboxen als Kasten, Bilder in passender Größe - #278

Merged
JumpLink merged 3 commits into
mainfrom
reader-infobox-and-srcset
Sep 24, 2026
Merged

JumpLink merged 3 commits into
mainfrom
reader-infobox-and-srcset

Conversation

@JumpLink

@JumpLink JumpLink commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

Worum es geht: Zwei Stellen, an denen ein Artikel in der App schlechter aussah oder langsamer lud als auf correctiv.org.

Was sich ändert:

  1. Infoboxen sind jetzt als Kasten erkennbar. Auf der Website sind sie grau hinterlegt, in der App liefen sie bisher als gewöhnliche Absätze mit. Jetzt stehen sie in einem hinterlegten Kasten mit Rahmen, in hellem und dunklem Erscheinungsbild.
  2. Bilder werden in passender Größe geladen. Die Website bietet jedes Bild in mehreren Größen an. Die App hat diese Auswahl bisher weggeworfen und immer die größte Datei geladen (beim Russischen Haus 2560 Pixel breit). Jetzt wählt das Gerät selbst, auf einem Telefon zum Beispiel die Fassung mit 1160 Pixeln.

Nach der Sicherheitsprüfung: Ein Kasten bleibt nur dann ein Kasten, wenn er ganz oben im Artikeltext steht, nicht verschachtelt in einer Liste oder einem Zitat. Sonst konnte ein präparierter Text den Browser dazu bringen, den Kasten anders zu schließen als unser Filter, und der Rest des Artikels stand außerhalb der Lesedarstellung. Ein verschachtelter Kasten verliert nur seine Hinterlegung, der Text bleibt. Außerdem entfallen die Leerzeilen am Anfang der Absätze in den Infoboxen.

Beides betrifft auch die Artikel, die offline in der App mitgeliefert werden; die sind neu erzeugt. Artikel, die schon auf einem Gerät zwischengespeichert sind, werden einmal neu geladen, damit sie die Kästen und Bildgrößen auch bekommen.

Infobox, hell und dunkel (Einstellung „System“, Gerät hell bzw. dunkel):

Infobox hell und dunkel

Bild aus mehreren Größen, hell und dunkel: geladen wurde 594531575-1160x1160.jpg statt 594531575-scaled.jpg (2560 px).

Bild hell und dunkel

Closes #276

Technische Details
  • blocks.ts: neue Aktion box. cvui/infobox (Marker wp-block-cvui-infobox) wird zu <div class="infobox"> mit seinem Inhalt, in beiden Interpretern (String und DOM). Das Panel wird wie bisher ausgepackt, der Knopf „Mehr anzeigen“ fällt wie bisher weg.
  • body-allowlist.ts: ein div bleibt nur, wenn es eine Klasse aus READER_BOX_CLASSES trägt, und dann nur mit dieser einen Klasse. Jedes andere div wird wie bisher ausgepackt.
  • srcset und sizes an img: srcset wird Kandidat für Kandidat so gelesen wie im HTML-Standard (Adresse bis zum nächsten Leerraum, Kommas darin gehören zur Adresse, ein Komma am Ende beendet den Kandidaten). Jede Adresse geht durch dieselbe Prüfung wie src (nur http/https, relativ gegen correctiv.org aufgelöst und absolut ausgeschrieben), der Deskriptor muss eine Breite oder Dichte sein. Ein Kandidat, der durchfällt, fällt weg; bleibt keiner, fällt das Attribut weg. Geschrieben wird aus den Teilen neu, nie der Wert, wie er kam. sizes bleibt nur mit Zeichen einer Längenliste. <source> bleibt draußen wie bisher.
  • reader-gate.test.ts: Tabelle um srcset, sizes und div.infobox erweitert, die Eigenschaftsprüfung prüft jede Adresse in srcset. Neue Korpus-Einträge: javascript:, data:text/html (auch base64), vbscript:, Tab im Schema, offene Anführungszeichen, Kommas in Adressen, falsche Deskriptoren, feindliches sizes, div.infobox mit Stil und Handler. Alle vier Wege (Cache, REST, beide Extraktoren).
  • Nachtrag nach dem Review: div.infobox nur auf oberster Ebene des Texts, li nur direkt in ul/ol. Grund: htmlparser2 kennt die impliziten End-Tags des HTML-Standards kaum, <ul><li><div class="infobox"><li> schloss im Browser Kasten und damit div.reader-body. reader-gate.test.ts parst jetzt jedes Korpus-Dokument mit parse5 (neue devDependency von app-core, lag schon im Baum) und prüft, dass auf .reader-body direkt der Footer folgt und jeder Kasten direkt darin steht. Neue Fälle: srcset mit Adresse, die nach dem Trimmen auf Komma endet, span.infobox, img src="mailto:". <br> am Rand eines <p> fällt weg.
  • reader-html.ts: .infobox mit --var-color-surface als Fläche und --var-color-stroke als Rand, beides semantisch und damit im Dunkelmodus mitgehend.
  • CACHE_NS auf articles-3: ein vor dieser Änderung gespeicherter, gescrapter Artikel hat weder Kasten noch srcset.
  • Offline-Bündel mit npm run offline-articles neu erzeugt, offline-bundle.test.ts grün.
  • Geprüft: npm run check grün; Web-Export (build:web, serve-clean.mjs) in Chrome, Einstellung „System“ gegen helles und dunkles Gerät, currentSrc der Bilder abgelesen. Nicht geprüft: Android und iOS nativ.

🤖 Generated with Claude Code

cvui/infobox gets a box rule in articles/blocks.ts that keeps its contents in a
div with the class infobox, the one class the gate keeps on a div; the reader
stylesheet fills and edges it with semantic tokens. The gate keeps srcset and
sizes on img: every srcset candidate is parsed the way the HTML standard reads
it, its address held to the rule src gets and written out absolute, its
descriptor to a width or a density, and a failing candidate is dropped rather
than the attribute passed through. Offline bundle regenerated, article cache
namespace raised to articles-3.

Closes #276
… the gate did

A security review of #278 found that htmlparser2 and a browser read an infobox
inside a list item differently: an inner li closes the outer one and the box
with it, and the box's end tag then closes the reader's own wrapper. The gate
now keeps a box only at the top of the body and an li only straight inside a
list. reader-gate.test.ts parses every corpus body's reader document with
parse5 and asserts the wrapper is followed by the footer. A break at either
edge of a paragraph is dropped, which the site's infoboxes open with. Offline
bundle regenerated.
@JumpLink
JumpLink merged commit cd0d6db into main Sep 24, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Artikel: Infoboxen hervorheben und Bilder in passender Größe laden

1 participant