Postkarten-Layout: Text links, Absender+Empfänger rechts, Briefmarkenfeld frei
All checks were successful
Build & Deploy / deploy (push) Successful in 13s

Neues render_format-kind 'postkarte'. generatePostcardSVG setzt den Text auf die
linke Kartenhälfte, Absender (klein, oben) und Empfänger (Anschriftzone unten) auf
die rechte Hälfte; oben rechts bleibt das Briefmarkenfeld frei. Ein SVG je Karte
(ein Plotter-Durchlauf), geschrieben als letter_NNN.svg.

- page-layout: kind je Format mitführen + getFormatKind().
- svg-generator: generatePostcardSVG (Body/Absender/Empfänger über Marker
  [[pk_abs]]/[[pk_adr]] getrennt, damit alle Teile scriptalisiert werden).
- order-/preview-/directus-controller: type 'postcard' dispatchen, Marker in der
  Scriptalisierung erhalten, Postkarten-Dokument aus render_format-kind bauen.
- directus-service: kind aus render_formats mitladen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-09-11 13:58:06 +02:00
parent bf3352d82c
commit 8030d3d0ec
6 changed files with 164 additions and 4 deletions

View File

@@ -3,7 +3,7 @@ const fsSync = require('fs');
const path = require('path');
const config = require('../../config');
const { scriptalizeBatch } = require('../../services/scriptalizer-service');
const { generateLetterSVG, generateEnvelopeSVG, generateLetterPages } = require('../../lib/svg-generator');
const { generateLetterSVG, generateEnvelopeSVG, generatePostcardSVG, generateLetterPages } = require('../../lib/svg-generator');
const { replacePlaceholders, generateAllCSVs } = require('../../services/placeholder-service');
const { TAB_MARKER } = require('../../lib/svg-font-engine');
@@ -220,7 +220,7 @@ async function runGeneration({ orderNumber, letters, metadata }) {
for (const letter of fontLetters) {
const raw = letter.processedText;
const parts = raw.split(/(\t|\[\[signatur\d+\]\]|\[\[seitenumbruch\]\]|[&|])/gi);
const parts = raw.split(/(\t|\[\[signatur\d+\]\]|\[\[seitenumbruch\]\]|\[\[pk_abs\]\]|\[\[pk_adr\]\]|[&|])/gi);
const segments = [], markers = [];
for (let i = 0; i < parts.length; i++) {
if (i % 2 === 0) segments.push(parts[i]);
@@ -272,6 +272,7 @@ async function runGeneration({ orderNumber, letters, metadata }) {
const letter = processedLetters[i];
const absoluteIndex = letter.index !== undefined ? letter.index : i;
const isEnv = letter.type === 'envelope';
const isPostcard = letter.type === 'postcard';
const pad = String(absoluteIndex).padStart(3, '0');
// Mehrseitiger Brief → N Seiten-Dateien letter_NNN_pM.svg (Seite 1..N).
@@ -332,6 +333,11 @@ async function runGeneration({ orderNumber, letters, metadata }) {
scriptalizedText, letter.format, letter.envelopeType,
{ font: letter.font, realisticHandwriting: letter.realisticHandwriting ?? false, fontScale: letter.fontScale, sender: metadata.envelopeSender || '', senderScale: metadata.envelopeSenderScale || 1 }
);
} else if (isPostcard) {
svgResult = generatePostcardSVG(
scriptalizedText, letter.format,
{ font: letter.font, realisticHandwriting: letter.realisticHandwriting ?? false, fontScale: letter.fontScale, senderScale: metadata.envelopeSenderScale || 1 }
);
} else {
svgResult = generateLetterSVG(
scriptalizedText, letter.format,