"Befehle in Strings unterteilen" klingt falsch. Lassen wir CSS außer Acht, kannst du XHTML mit einem XML-Parser in einen DOM verwandeln. Aus
Code: Alles auswählen
<body>
<h1>Überschrift</h1>
<p>Absatz mit <strong>etwas Fettschrift</strong>.</p>
</body>
wird dann
Code: Alles auswählen
Body(
H1(Text("Überschrift")),
P(Text("Absatz mit "), Strong(Text("etwas Fettschrift")), Text(".")))
Mein Ziel ist, dass jedes Objekt seine eigene Größe bestimmen kann und weiß, wie seine Kinder angeordnet werden müssen. HTML kennt zwei Arten von Elementen: Block-Elemente und Inline-Elemente. Erstere werden bei vorgegebener Breite einfach untereinander dargestellt und sind so hoch, wie sie eben sein müssen. Letztere sind in Block-Elementen enthalten und passen sich in ihrer Höhe an die Zeilenhöhe an, sind so breit wie sie es eben sein müssen und brechen außerdem in der durch das Block-Element vorgegebenen Breite um. H1 und P sind Block-Elemente, Text und Strong Inline-Elemente und Body ein Container für Block-Elemente.
Damit ich den Umbruch abbilden kann, definiere ich noch Line-Elemente. Angenommen, die vorgegebene Breite wäre so, dass das "etwas", nicht aber das "Fettschrift" in die erste Zeile passen würde. Dann muss der Umbruch folgende Objekte erzeugen:
Code: Alles auswählen
Lines(
Line(Text("Absatz mit "), Strong(Text("etwas"))),
Line(Strong(Text("Fettschrift")), Text(".")))
Möglicherweise wäre es einfacher, jedes Wort als Objekt zu repräsentieren und es nur noch wissen zu lassen, ob hinter ihm ein Umbruch möglich ist oder nicht. In HTML (außer bei PRE) werden ja beliebig viele Leerzeichen und Leerzeilen zu nur einem Leerzeichen zusammengefasst.
Wenn ich eine Funktion "text_width(font, text)" habe, mit der ich unter Angabe eines Fonts die Breite eines Textes in Pixeln berechnen kann, dann kann ich damit aus der ersten direkt aus dem XML abgeleiteten Form die zweite Zeilenform berechnen.
Danach kann ich einen relativ einfachen Layout-Algorithmus auf das Objektmodell loslassen. Ein Text-Elemente definiert seine Höhe und Breite durch die Schrift und den Text. Ein Line-Element und jedes Inline-Element, das selbst wieder Kinder hat wie z.B. Strong, ordnet seine Kinder von links nach rechts nebeneinander an und bestimmt seine Breite also als Summe aller Breiten und seine Höhe als das Maximum der vorgegebenen Höhe oder der Höhen der Kinder. Bei der Position ist noch die Grundlinie zu berücksichtigen. Block-Elemente ordnen ihre Line-Elemente nun untereinander an. Die Breite ist das Maximum aller Breiten und die Höhe die Summe aller Höhen. Und das Body-Container-Element macht das selbe für seine Kinder.
Stefan