frontend: Notationstext per ?sourceUrl= von einer URL laden

Der Editor kann den Text aus einer externen Textdatei beziehen:
  …/index.html?sourceUrl=https://example.org/plan.txt

- Das Geladene wird als eigenes Dokument (D22) geführt, dessen Name die URL
  ist; die id leitet sich aus der URL ab, derselbe Link aktualisiert also
  dieses Dokument, statt bei jedem Aufruf ein neues anzulegen. Eigene
  Dokumente bleiben unberührt. Die volle URL steht zusätzlich im Tooltip
  (der Name wird in der Titelzeile elidiert).
- Ist der Parameter gesetzt, wird bei jedem Laden neu geholt — die URL ist
  die Quelle der Wahrheit.
- Nur http(s) (relative Angaben werden aufgelöst), credentials:'omit';
  file:/data:/javascript: werden abgewiesen. Fremder Text ist ungefährlich:
  Labels werden escaped, der Parser erkennt als Link nur https?:// (SPEC §1).
- Fehler (CORS, 404, Netz) landen als zeilenlose Warnung `sourceLoad` im
  Warnbereich und nennen CORS ausdrücklich als wahrscheinliche Ursache; der
  bisherige Stand bleibt stehen. i18n in allen 9 Sprachen.
- Nebenbei: checkForUpdates() baut die Cache-Buster-URL nun über
  URL/searchParams — mit vorhandenem Query-String hätte '?t=' ein zweites
  '?' erzeugt.

Verifiziert headless (jsdom gegen den gebauten Bundle: Erfolg, CORS-Fehler,
404, ohne Parameter, verbotenes Schema) und im Browser gegen
raw.githubusercontent.com. Dokumentiert als D23 + SPEC §9 + frontend/CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-07-25 11:23:40 +02:00
co-authored by Claude Opus 4.8
parent 64e4e60b53
commit 1557a7ab0d
5 changed files with 152 additions and 5 deletions
+5 -1
View File
@@ -8,7 +8,9 @@
Bekannte Typen:
- mixedGate { line, label } — Geschwister mit gemischtem Gate (SPEC §3)
- unknownStatus { line, code } — unbekanntes Statuszeichen (Phase 2) */
- unknownStatus { line, code } — unbekanntes Statuszeichen (Phase 2)
- sourceLoad { url, error } — ?sourceUrl= nicht ladbar (D23); ohne
Zeilennummer, erscheint dadurch zuoberst */
import { esc } from './render.js';
@@ -20,6 +22,8 @@ export function formatWarning(w, t){
return t('mixedWarn', {line: w.line, label: esc(w.label)});
case 'unknownStatus':
return t('unknownStatusWarn', {line: w.line, code: esc(w.code)});
case 'sourceLoad':
return t('sourceLoadWarn', {url: esc(w.url), error: esc(w.error)});
default:
return `${esc(String(w.type))} (${w.line ?? '?'})`;
}