{# 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 / 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) %}
{% if segments %} {# Segment-basiertes Rendering (bevorzugt) #} {% for seg in segments %} {% if seg.type == "del" %}{{ seg.text }} {% elif seg.type == "ins" %}{{ seg.text }} {% 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 %}
{% endmacro %}