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