diff --git a/rhino/text_editor.py b/rhino/text_editor.py index 395e3bc..d94712d 100644 --- a/rhino/text_editor.py +++ b/rhino/text_editor.py @@ -403,6 +403,16 @@ def _runs_to_rtf(runs, default_font, base_size_m=0.20): else: codes.append("\\nosupersub") body_parts.append("{{{} {}}}".format("".join(codes), _escape_no_par(seg))) + def _flush_pars(n): + # 1 \\par = einfacher Zeilenumbruch. N>1 \\par hintereinander + # wuerde Rhino zu einem einzigen Umbruch collapsen — fuer + # jede zusaetzliche Leerzeile schieben wir einen Space-Group + # dazwischen, damit der leere Paragraph Inhalt hat. + if n <= 0: return + body_parts.append("\\par ") + for _ in range(n - 1): + body_parts.append("{ }\\par ") + first_emitted = False for run in runs: raw = run.get("text") or "" @@ -411,19 +421,13 @@ def _runs_to_rtf(runs, default_font, base_size_m=0.20): if i > 0: pending_pars += 1 if seg: - # Pending \\par vor dem naechsten Inhalt — aber nur wenn - # schon mal Inhalt da war (sonst fuehrender \\par bringt - # Leerzeile am Anfang) if first_emitted: - for _ in range(pending_pars): - body_parts.append("\\par ") + _flush_pars(pending_pars) pending_pars = 0 _emit_group(run, seg) first_emitted = True - # Trailing \\par auch noch emittieren (= Leerzeilen am Ende) - if first_emitted: - for _ in range(pending_pars): - body_parts.append("\\par ") + if first_emitted and pending_pars > 0: + _flush_pars(pending_pars) # ──────────────────────────────────────────────────────────────── # PASS 2: RTF-Header mit JETZT vollstaendigen Tables + Body