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>
45 lines
2.1 KiB
HTML
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 %}
|