von Patrick Gundlach |

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>

Auszeichnungen im 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>
In der Serie »Feature der Woche« beschreibe ich jeden Montag mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.