03 Jun 2007 

Die eigene Website lebendig zu halten, ist eine große Attraktion und Herausforderung für meine Datenbank-Kunden. Wäre es nicht praktisch, wenn sie die Newsfeeds (RSS-feeds) und den Inhalt (content) aus ihrer das Geschäft integrierenden 4D-Datenbank aktualisieren könnten. Technisch ist das kein Problem, es ist sowieso nur Text. Doch sind Tags wie <strong> und <em> zumindest anachronistisch und nicht für jedermensch attraktiv. Schauen wir, ob 4D Write ein gutes Frontend abgibt.

image4D Write und HTML

Versuchen wir es mit einem einfachen Text wie diesem:
jede Zeile ein Absatz, zwei verschiedene Schriften und Schriftgrößen und eine Liste. Das sollte zum Testen reichen. Jetzt will ich diesen Text als HTML haben.

Unter anderem sichert WR SAVE DOCUMENT (wr_Area; document; "HTML") ein 4D Write-Dokument als "HTML". Damit sollte sich dieser 4D Write-Text in HTML* wandeln lassen. Vom Ergebnis wird man weniger begeistert sein, wie das linke Bild verdeutlicht.

image

Links ist das HTML erzeugt aus 4D Write und teils eingeklappt, um zu verdeutlichen, was nicht stimmt. Es sieht aus wie HTML, ist aber keines. Da ist einiges faul mit diesem Text in HTML-Syntax. Soll der Browser nicht im Quirks-Mode bleiben, kann man dieses HTML nicht benutzen. Aber, wie das meistens auf 4D zutrifft, gibt es mindestens einen Workaround, dessen Ergebnis rechts zu sehen ist.

Der Tiger hilft aus

In diesem Fall geht der Workaround so: zuerst das Dokument mit WR SAVE DOCUMENT (wr_Area; document; "RTF ") als RTF rauszuschreiben und dann diese Anweisung per LAUNCH EXTERNAL PROCESS("textutil -convert html path_to_RTF-Document") als OSX-Befehl auszuführen. Das Ergebnis ist das auf der rechten Seite dargestellte HTML. Die benannten Stilformate kann auch dieses nicht herzaubern, aber es entspricht dem HTML-Standard.

imageDer Workaround benutzt textutil, seit Tiger (MacOSX.4) Teil des Betriebssystems. Ich weise textutil an, es möge -convert in html und zwar das Dokument zu finden in diesem Path. Superdeutsch!
Das Ergebnis ist ein Dokument gleichen Namens mit der neuen Endung ".html" im gleichen Ordner wie das Original.

Für meinen Bedarf brauche ich den Textkörper, um ihn in mein Seitengerüst einzubauen. Deshalb schneide ich <style>...</style> und den Inhalt zwischen den Tags <body>...</body> aus und setze ihn in den Textkörper ein, fertig.

Umgekehrt funktioniert dieser Workaround genau so zufriedenstellend. Ich verwende wieder textutil und konvertiere nun HTML in RTF. Das RTF kann 4D Write sehr schön anzeigen und ich umgehe die Krücke HTML 3.2, die vor kurzem erst reaktiviert wurde.

Was genau stimmt denn nicht?

4D Write kann Sichern als … HTML4 und als HTML3.2. Das Sichern als HTML4-Ergebnis hat mich mehr als verwundert!

Erst mal zum Positiven! So soll es sein: CSS ist Teil der <head>-Section. Das war das Positive!
Hier nun, was nicht stimmt:

  • erklär' mir jemand, warum der Body eine "ul", eine unsortierte Liste ist (keine class, keine id)? Immerhin wird die Liste, wie es sich gehört, geschlossen mit </ul> unmittelbar vor </body>.
  • warum wird vor jeden Absatz ein Listen-Eintrag gesetzt "li"?
  • erklären kann ich es mir gar nicht. Vielleicht fungiert "li" als Linealersatz, wie das in 4D Write auch gemacht wird.
  • hier fehlt das schließende </li> oder zumindest diese Form eines Abschlußes " />"
  • nun folgt "p" (üblicherweise Kurzform für Paragraph = Absatz). Hier stimmt der Schluß wieder </p>; aber "p" wird verwendet als ein Container für
  • den eigentlichen Absatz-Inhalt. Der Absatz ist ein <font>-Tag mit class-Attribut. Ja, <font> wird geschlossen </font>. Ich will gar nicht wissen, wie das getaggt wird, wenn im Absatz eine zweite Schrift verwendet wurde.
  • "li", "p" und "font" haben class-Attribute. So soll das sein und das ist gut so.
  • Aber ich verstehe nicht
  • warum die class so benannt wurden: "l1" .. "ln", "p1" .. "pn", "f1" .. "fn" für list1..n, paragraph1..n und font1..n
  • nein, leider entsprechen diese Nummern nicht der wr stylesheet number, die ich als Funktionsergebnis aus WR Create stylesheet erhalte. Die Klassen sind in der Reihenfolge der Verwendung im 4D Write-Dokument numeriert. Ja, im Filmabspann macht man das manchesmal auch!
  • ich hätte erwartet, es würden die Stilformatnamen verwendet. Bekam ich nicht hin. Was habe ich verpaßt?
  • weniger überrascht bin ich, daß "font-family" keine Schrift-Familien bzw. -Kaskaden auflistet. Woher sollte 4D Write das wissen? Schreibe ich das CSS selber hänge ich zumindest ein "serif" oder "sans serif" als kleinsten gemeinsamen Nenner an … aber sogar FrameMaker kann keine kaskadierenden Stile.
  • Bilder haben ein leeres alt-Attribut. Wahrscheinlich besser als die bedeutungslosen internen Bildnamen als alt-Attribut zu verwenden.
  • verwundert bin ich wiederum über "charset=windows-1252", das ist Western European Characters. Wird das irgendwann in naher Zukunft irgendein Standard im Web, wichtiger als "ISO-8859-1"?
  • vollkommen vermisse ich <div> oder die Überschriften <h1 .. h6>.

* ich weiß, optional HTML 3.2 als "HTM3". Decken wir ein Tuch darüber.

siehe auch: → 4D Write und HTML-emails

4D themes: fresh from the workbench

imagecurrently available in englisch:
NEW: Macros in V12.4
Mission Control and V12

Better machine-translated than non comprende! - Tidy up when done - New kinds of buttons - My own Preferences - DBZ-Calendar component - module-manager and code-blocks - As simple as possible: fulltext-field - V12 and QUERY BY SQL - Updating the User-Interface into today - Rotate Barcodes by 90° - UUID: that special kind of empty - Dynamic Labels - Printing Subforms in V12 - systemtables - structure info - Integrating Addressbook and 4D - SVG and 4D HTML-Tag - Automatic Comments of the Methodeditor - fighting to get ics-files into Outlook - hierarchical lists as datacontainer - UI-changes in V12 - HTML-email and 4D Write - Simple & Lazy - David Dancy … extracting the information that's encoded in a 4D structure file - SVG and 4D - David Adams about Mockup and Wireframing - retrieving MAC-addresses - sampler listbox-templates - Listboxes with footers - Simulating Sub-Pages on Multi-Page Forms - MySQL dump - Dreaming of a rich-text-editor in 4D - iPhone and 4D - email-communication - 4D Write and HTML - Which Web-Editor - Integration of 4D and Web - Cursor-movement in Listboxes - Integrating an Excel-workflow into 4D - Database Photography - Parcels and Ownerinformation atop satellite maps

Components

  • DBZ - Listboxnavigator
  • DBZ - SystemTables
  • DBZ - Calendar