gwoe-antragspruefer/app/templates/v2/components/redline.html
Dotty Dotter 565849bd84 feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards
v2-Frontend (#139, ECOnGOOD CD Manual Juni 2024):
- app/static/v2/: tokens.css, fonts.css, v2.css, Nunito-Sans woff2, Phosphor-Icons (21 SVGs)
- app/templates/v2/: base.html + 11 Screens + 8 Component-Macros
- AppShell mit Sidebar (Lesen/Pruefen/Daten/Admin), v2-Detail mit allen Features
  (ScoreHero, MatrixMini, QuoteCard, Redline, Fraktions-Scores)
- v2 ist jetzt Default unter / — classic unter /classic
- Login-Modal in v2-Topbar mit Tabs Anmelden/Registrieren (#129)
- Phosphor-Icons in Sidebar + Topbar mit dynamischem Theme-Toggle
- Keyboard-Shortcuts (j/k/Enter/Esc/?/path), Landtag-Suche, Antrag-Historie,
  Sort-Dropdown, Matrix-Feld-Info-Modal, Bookmarks/Comments/Voting/Share/Re-Analyze

Backend-Erweiterungen:
- main.py: ~30 neue Routes (/v2/*, /antrag/{ds}, /api/auth/{login,refresh,logout},
  /api/me/merkliste/*, /api/admin/*, /v2/admin/*, OG-Cards, etc.)
- og_card.py + og_template: Open-Graph-Bilder via Playwright (#141)
- wahlprogramm_fetch.py + wahlprogramm-links.yaml: SHA-Gate Auto-DL (#138)
- auswertungen.py: BL-Filter + get_wahlperioden Helper (#137)
- auth.py: Direct-Access-Grant + Refresh-Token-Cookie

Classic-Updates:
- Header-DRY via _header.html, Auswertungen redirected, Batch-Inline raus

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:55:57 +02:00

45 lines
2.1 KiB
HTML

{#
redline.html — Diff-Renderer für Redline-Vorschläge
Rendert die vom Backend gelieferten {del, ins}-Segmente als Mono-Block.
Keine neue Diff-Logik im Frontend — der LLM-Output muss bereits
formatierte Segmente enthalten (via v5-Prompt-Format).
Props:
original : str — Original-Textauszug aus dem Antrag (für Kontext)
vorschlag : str — Verbesserter Text; darf **fett** (ins) und
~~durchgestrichen~~ (del) als Markdown-Marker enthalten,
die zu <span class="ins"> / <span class="del"> gerendert werden.
Backend kann alternativ bereits HTML liefern.
segments : list[dict] optional — vorberechnete Segmente:
[{"type": "del"|"ins"|"ctx", "text": "..."}]
Wenn gesetzt, wird original/vorschlag ignoriert.
Verwendung:
{% from "v2/components/redline.html" import redline %}
{{ redline("§ 3 Abs. 2 auf Antrag", "§ 3 Abs. 2 **verpflichtend**") }}
{{ redline(segments=[{"type":"ctx","text":"§ 3 Abs. 2 "},{"type":"del","text":"auf Antrag"},{"type":"ins","text":"verpflichtend"}]) }}
#}
{% macro redline(original="", vorschlag="", segments=none) %}
<div class="v2-redline" role="region" aria-label="Redline-Vorschlag">
{% if segments %}
{# Segment-basiertes Rendering (bevorzugt) #}
{% for seg in segments %}
{% if seg.type == "del" %}<span class="del">{{ seg.text }}</span>
{% elif seg.type == "ins" %}<span class="ins">{{ seg.text }}</span>
{% else %}{{ seg.text }}
{% endif %}
{% endfor %}
{% else %}
{# Markdown-Marker-Rendering: **text** → ins, ~~text~~ → del #}
{# Jinja2 hat kein eingebautes Regex-Replace, daher nutzen wir einen #}
{# Inline-Namespace-Hack + einfaches Zeichen-für-Zeichen-Parsing. #}
{# Für komplexere Fälle sollten Segmente vom Backend geliefert werden. #}
{{ vorschlag | replace("**", "§INS§") | replace("~~", "§DEL§") }}
{# Hinweis: Für Phase 2 sollte der Screen das Backend auffordern, #}
{# segments direkt zu liefern. Dieser Fallback ist ein Stub. #}
{% endif %}
</div>
{% endmacro %}