9. Mai 2009 

for english readers

Dieser Tage in der NUG:

Has anybody shared 4D code for generating the HTML for web pages?
If not I'm considering writing some little routines to h1, h2, p etc, and labels, fields, buttons, etc for forms, where you pass the values of the HTML elements and attributes. The routines would return the text of generated HTML.

html

Ginge es nur um HTML, würde ich mir in der Art behelfen, wie in der Anfrage angekündigt und hier dargestellt: verpacken in kleinen Routinen. Alternativ mit den 4D DOM XML-Befehlen Text-Blöcke zusammenfassen. Das Verfahren deckt HTML ab, doch das reicht nicht. Außerdem ist Fremdtext-Code viel Arbeit, schwer zu debuggen und nahezu nicht mehr wartbar. Es ist nahezu unmöglich, sich vor dem

Kombinieren der 4D Sprache mit anderen Sprachen

zu drücken. Beispiele: das Terminal läßt sich über LAUNCH EXTERNAL PROCESS einbinden. Das sieht in der einfachen Anfrage "Wo ist das Dock" so aus:

terminal

Danach, wenn $err_T nichts anderes nahelegt, wird $out_T analysiert.

Oder ein AppleScript-Beispiel:

applescript

Auch hier liefert das Ergebnis Text, der zu analysieren ist.

sql

Die V11 bringt SQL mit. Das ist reiner Text. SQL-Syntax codiert im Methoden-Editor ist ein Alptraum: keine Syntax-Einfärbung, keine Syntax-Vervollständigung, keine Fehlermarkierung. Das einzige Plus: Befehle können sich über mehr als eine Zeile erstrecken und enden mit einem Semikolon.

sql_Syntax

Hier als Beispiel die Colorierung von BBEdit und Smultron. Beide erkennen die von 4D gewünschte Int32 nicht. Soweit zum S in SQL, das noch nie Standard bedeutete. Und der SQL92-Standard läßt noch viele Eigenheiten zu.

Wie komme ich aus diesem Dilemma heraus?

Dreaming of rich text in 4D

collapsedstate

Der aktuelle 4D Methoden-Editor ist der beste, den wir je hatten. Auf meiner Wunschliste sind nur wenige Punkte:

  • merken, welche Einheiten eingeklappt waren,
  • nach Option-Drag den kopierten Text weiter ausgewählt lassen,
  • Befehle über mehrere Zeilen,
  • Typeahead für deklarierte Variablen …
Für mich am Wichtigsten, wenn sich 4D merkte, welche Einheiten einer Methode beim letzten Schließen eingeklappt waren. Aber im Großen und Ganzen: zufrieden.

Es werden immer mehr Sprachen, die in 4D Verwendung finden. Das sind schon lange AppleScript und HTML und seit V11 ist SQL-Code hinzugekommen. Selber habe ich weitere Sprachen vor allem für den Export verwendet, im Besonderen solche die Karten beschreiben wie GEM, CGDef und KML und andere aus der Gruppe Tagged Text wie MIF für FrameMaker und besonders die für Quark Xpress oder Adobe InDesign.

Es macht keinen Sinn, diese Art von Textcode im Methoden-Editor von 4D zu schreiben. Stattdessen habe ich zwei Strategien untersucht

  • eine Funktion für jede Art Textobject und
  • eine Funktion für alle Textobjekte einer Sprache

Eine Funktion für jede Art Textobject

Ein Beispiel: $result := MG_DrawRect (ID;Xmin;Ymin;Xmax;Ymax). Die Funktion lieferte diesen Textblock:
POLY ID ObjectID
51.123456 10.654321
51.456123 10.123654

Ein weiteres Beispiel: $result := HTML_header (3;"Das ist meine Überschrift"). Die Funktion lieferte diesen Textblock:
<h3>Das ist meine Überschrift</h3>

Das funktioniert. Ich hatte bald so viele Methoden, wie es Textobjekte geben könnte. Für jede Methode mußte ich mir einen anderen Satz an Parametern merken. Und die Attributierung von HTML-Statemente wie class, title, id, align, width, … macht diese Arbeitsweise noch mühevoller.

Eine Funktion für alle Textobjekte einer Sprache

Inzwischen benutze ich meist eine große Methode, statt vieler einzelner. Gemeinsam ist ihnen die Verwendung dieser 3 Parameter: $1 ist die Nachricht was tun, $2 ist der Pointer auf das betroffene Objekt und $3 ist eine lange Ganzzahl gleich meiner Record-ID. Das ersetzt mir Form-Methoden, Objekt-Methoden, Prozess-Starter and Prozess-Methoden und führt den Code modulartig an einer einzigen Stelle zusammen. Das funktioniert überhaupt nicht, um Fremdcode zu einzubinden.

Weder je Textblock eine Methode noch eine Methode für alle Textblöcke sind ein gutes Verfahren, um HTML oder SQL zu erzeugen. Es muß was besseres her.

Vor einigen Jahren, mit der Version 6, veröffentlichte David Adams Bücher über 4D and HTML. Eine seiner Empfehlungen war, vorbereitete Texte zu verwenden anstatt HTML im 4D Methoden-Editor einzubauen. Da hat er recht. 4D unterstützt dieses Konzept seit V2004 noch besser. Seit 2004 kann der PROCESS HTML TAGS jederzeit aufgerufen werden – nicht wie vorher nur im Webserver-Kontext – und jede Art von tagged text, die 4D HTML tags enthalten, wird umsetzt.

So sollten wir das machen: Textcode in Textfeldern ablegen. Dazu braucht es einen leistungsfähigeren Texteditor als den für 4D Textfelder. Der ist nur zum Aufheben brauchbar, aber zum Code-Schreiben ungeeignet.

Wie wäre es mit 4D Write?

Ich habe lange versucht 4D Write als HTML-frontend einzusetzen, investierte viel Zeit und entwickelte manche Idee, um 4D Write als einen Rich Text-Editor zu verwenden. Aber das war wenig zufriedenstellend. Die größte Stolperstufe ist 4D Writes Modell der Stilformate. Inzwischen gehe ich davon aus, das 4D Write Stilformate als Macros ansieht, die eine Stilbeschreibung auf den gerade ausgewählten Text anwenden. Danach weiß es nichts mehr vom Stilformat. Das ist wahrscheinlich einer der Gründe für die schwache Leistung im HTML-Export. 4D Write ist also keine Lösung.

Träumen

Bleibt mir nur, vom einem Rich-Text-Editor in 4D zu träumen. Irgendwas in der Art von:

BBEdit oder TextWrangler SubEthaEdit oder Coda Espresso Smultron
bbedit coda espresso smultron

Textmate gehört ebenfalls in diese Liste, besitze ich aber nicht. In der Liste der unterstützen Sprachen listet Smultron sogar Active4D auf!

4D muß das Rad nicht neu erfinden. Alternativ und ähnlich effizient stellte ich mir diese Verfahren vor:

  • einer der genannten Text-Editoren in 4D einzubinden, Coda hat die SubEthaEdit-Engine lizensiert
  • oder externe codefiles innerhalb des 4D application-packages
  • vielleicht auch die WebArea (4D LiveWindow) mit einem der WYSIWYG rich text web editors

4D Themen: Berichte in Arbeit