enhancement
major
minor
major
minor
minor
#29683
TL-Script: htmlText(html) cannot carry images, so an HTML text with <img> referencing files cannot become a structured text
Problem
htmlText(html) turns an HTML string into the value of a structured-text attribute (tl.core:Html), but has no way to give it images. A text importing HTML with <img src="file">, where the file is a BinaryData at hand (in the TL Development app: an attachment of the ticket the Trac description belongs to), cannot produce a structured text whose images render. The images of a StructuredText are a separate part (StructuredText#getImages()), and the React rich-text editor serves images from there.
The TL Development app therefore carries its own function structuredText(html, images) (StructuredTextFunctions). It embeds exactly the binaries that an <img src> names, keyed by file name. That is generic, but it belongs in the engine next to htmlText.
Außerdem speichern die Editoren Bildverweise unterschiedlich: der klassische Editor, die Anzeige und der Export verwenden <img src="ref:name">, der React-Rich-Text-Editor dagegen den blanken Namen <img src="name">. Ein im einen Editor erstellter Text zeigt im anderen keine Bilder.
Expected
htmlText(html, images: …), where images is a list of BinaryData or a map from name to BinaryData. The result is a structured text whose <img src="name"> resolve to those images; unreferenced binaries are dropped.
Lösung
TL-Script htmlText(html, images) (HtmlFunctions.text) erhält den optionalen Parameter images:
- Liste (oder einzelnes BinaryData): jedes Bild wird unter seinem Dateinamen (BinaryData#getName()) abgelegt.
- Map/Dictionary Name → BinaryData: der Schlüssel ist der Name, den ein <img src> verwendet.
- leer / nicht angegeben: Text ohne Bilder, der Quelltext wird unverändert übernommen (bisheriges Verhalten).
- Jeder andere Wert führt zu einer Fehlermeldung.
Ein <img src="name">, das ein angegebenes Bild benennt, wird als Bildverweis <img src="ref:name"> gespeichert; Bilder, die der Quelltext nicht nennt, werden verworfen. Der HTML-Quelltext wird als HTML-Fragment gelesen, beliebiges HTML (z.B. <br>, nicht geschlossene <li>) bleibt erhalten.
htmlText($html, images: $attachments)
htmlText($html, images: {"logo.png": $file})
Einheitliches Bildformat im React-Editor: ReactWysiwygControl löst ref:name zu Download-URLs auf und speichert Bilder wieder als ref:name. Texte, die der React-Editor bisher mit blankem Namen gespeichert hat, werden weiterhin angezeigt und beim nächsten Speichern auf ref:name umgestellt. Nur die Download-URLs des Editors selbst werden beim Speichern zurückgewandelt, fremde URLs bleiben unverändert.
Test
- test.com.top_logic.layout.wysiwyg.ui.TestHtmlFunctions, TestHtmlFunctionsScript
- test.com.top_logic.layout.react.wysiwyg.TestImageReferences
- tl-demo-react: Attribute → Objekt bearbeiten → Feld html: Bild hochladen, speichern, erneut öffnen.