gwoe-antragspruefer/app/templates/v2/components/redline.html

45 lines
2.1 KiB
HTML
Raw Permalink Normal View History

{#
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 %}