Feature der Woche: Textauszeichnung in Daten
Im Beitrag Feature der Woche: Schriftarten einbinden bin ich schon auf die Textauszeichnung (Fett, Kursiv, …) eingegangen, möchte das aber an dieser Stelle wiederholen, weil es immer wieder Fragen aufwirft.
Um einen Text zum Beispiel kursiv zu setzen, klammert man den Text (Value
) mit I
ein:
<I><Value>Das ist kursiv</Value></I>
das funktioniert natürlich auch mit Werten aus den Daten:
<I><Value select="@attribut"/></I>
Wichtig ist, dass in der aktuellen Schriftfamilie auch der entsprechende Schnitt definiert wurde:
<DefineFontfamily name="myfont" fontsize="9" leading="11">
<Regular fontface="MinionRegular"/>
<Italic fontface="MinionIt"/>
</DefineFontfamily>
In der voreingestellten Helvetica (besser: ein freier Helvetica-Klon) ist das natürlich schon definiert. Die Auszeichnungen B
(Fettdruck) und I
können übrigens geschachtelt werden, so dass der Schnitt BoldItalic
benutzt wird:
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<LoadFontfile name="MinionRegular" filename="MinionPro-Regular.otf" />
<LoadFontfile name="MinionBold" filename="MinionPro-Bold.otf" />
<LoadFontfile name="MinionBoldIt" filename="MinionPro-BoldIt.otf" />
<LoadFontfile name="MinionIt" filename="MinionPro-It.otf" />
<DefineFontfamily name="myfont" fontsize="9" leading="11">
<Regular fontface="MinionRegular"/>
<Bold fontface="MinionBold"/>
<BoldItalic fontface="MinionBoldIt"/>
<Italic fontface="MinionIt"/>
</DefineFontfamily>
<Record element="data">
<PlaceObject>
<Textblock fontface="myfont">
<Paragraph>
<Value>Mit </Value>
<B><Value>Blindheit</Value></B>
<Value> per </Value>
<I><Value>Definition</Value>
<Value> </Value>
<B><Value>geschlagen,</Value></B>
</I>
<Value> dennoch nicht unsichtbar.</Value>
</Paragraph>
</Textblock>
</PlaceObject>
</Record>
</Layout>
Ebenso können Texte unterstrichen werden:
<U><Value>Unterstrichen</Value></U>
Das erfordert keine spezielle Definition der Schriftfamilie.
Formatierungen in den Daten
Oftmals sind die Daten vorformatiert, z.B. mit speziellen HTML-Tags versehen (diese müssen aber korrekt geschachtelt sein). Dann sieht die Datendatei möglicherweise so aus:
<data>Mit <b>Blindheit</b> per <i>Definition <b>geschlagen,</b></i>
dennoch nicht unsichtbar.</data>
Die Tags können auch groß geschrieben werden: <B>
anstatt <b>
. Auch das
kann mit dem Publisher verarbeitet werden:
<PlaceObject>
<Textblock>
<Paragraph>
<Value select="."/>
</Paragraph>
</Textblock>
</PlaceObject>
Das Ergebnis ist dasselbe wie oben.
Nicht wohlgeformtes HTML in den Daten
Nicht wohlgeformtes HTML kann natürlich nicht direkt in den Daten enthalten sein, weil die Daten immer wohlgeformt sein müssen (XML). Diese können z.B. als CDATA-Abschnitt kodiert werden:
<data><![CDATA[Mit <b>Blindheit</b> per <i>Definition
<b>geschlagen,</i><br> dennoch nicht unsichtbar.]]></data>
In diesem Fall fehlt der schließende B-Tag hinter dem geschlagen und in XML
müsste das <br>
ebenfalls geschlossen werden. Der speedata Publisher ist
aber recht tolerant und kann mit der Funktion sd:decode-html()
diesen Teil
vernünftig verarbeiten:
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<Record element="data">
<PlaceObject>
<Textblock>
<Paragraph>
<Value select="sd:decode-html(string(.))"/>
</Paragraph>
</Textblock>
</PlaceObject>
</Record>
</Layout>