<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/pool/xslt_ht.xslt" type="application/xml"?>
<xsl:stylesheet
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
  xmlns:ht = "http://www.w3.org/1999/xhtml"
  xmlns:d = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:e = "http://herbaer.de/xmlns/20120911/embed"
  xmlns:l = "http://herbaer.de/xmlns/20141210/localization"
  xmlns:ti = "http://herbaer.de/xmlns/201500703/transinfo/"
  xmlns:tm = "http://herbaer.de/xmlns/20130628/transformation_attributes"
  xmlns = "http://www.w3.org/1999/xhtml"
  exclude-result-prefixes = "d ht tm"
  version = "1.0"
>

<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>ixdesk.xslt</title>
  <subtitle>Desktop-Darstellung</subtitle>
  <date>2012-09-14</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<section xmlns="http://herbaer.de/xmlns/20051201/doc" role="stylesheet">
<para>
Diese Datei bestimmt
zusammen mit <filename>ixdesk.js</filename> und <filename>ixdesk.css</filename>
eine Darstellung der Startseite, die für einen Desktop-Computer geeignet ist.
Die Datei <filename>ixdesk.stub</filename> verknüpft die Startseite
mit dieser Transformation.
Die Darstellung zeigt auf der linken Seite einen &#x201e;Navigationsbaum&#x201d;.
Die Verweisziele, auf die die Einträge im Navigationsbaum verweisen,
werden eingebettet angezeigt.
</para>
<para>
Nach Maßgabe des Parameters
<link linkend="ixdesk.param_p_help"><parameter>p_help</parameter></link>
wird die Hilfe zur Startseite
(<filename>ixdesk_help.xhtml.<replaceable>LANG</replaceable></filename>,
deutschsprachige Hilfe <filename>ixdesk_help.xhtml.de</filename>)
in die Darstellung eingefügt.
Die Javascript-Funktionen (<filename>ixdesk_help.js</filename>) und
CSS-Regeln (<filename>ixdesk_help.css</filename>) zur Hilfe
werden direkt durch diese Transformation eingebunden.
</para>

<section>
<title>Einträge des Navigationsbaums</title>
<para>
In den Navigationsbaum werden Abschnitte (<tag class="element">div</tag>-Elemente)
der obersten Ebene (Kindelemente des <tag class="element">body</tag>-Elements)
eingetragen,
deren Attribut <tag class="attribute">class</tag> mit dem Wort
"<literal>section</literal>" beginnt.
Die "Navigations-Abschnitte" müssen eine Überschrift
(<tag class="element">h2</tag>, <tag class="element">h3</tag>,
<tag class="element">h4</tag>, <tag class="element">h5</tag>
oder <tag class="element">h6</tag>)
und ein <tag class="attribute">id</tag>-Attribut enthalten.
</para>
<para>
Auch die <tag class="element">div</tag>-Elemente in einem Navigations-Abschnitt,
deren Attribut <tag class="attribute">class</tag> mit dem Wort
"<literal>section</literal>" beginnt,
sind "Navigations-Abschnitte".
Diese verschachtelten Navigations-Abschnitte werden aus ihrem Element herausgenommen
und ihrem Eltern-Element nebengeordnet.
</para>
</section>

<para>
Das erzeugte Dokument verwendet die folgenden ID-Werte.
Diese Liste enthält auch die ID-Werte, die aus der Hilfe übernommen werden.
</para>
<variablelist>
<varlistentry>
  <term><tag class="attvalue">audio</tag></term>
  <listitem>
    <para>
      Das <tag class="element">audio</tag>-Element zur Klangwiedergabe.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">div_title</tag></term>
  <listitem>
    <para>
Die "Titelleiste" mit dem Logo-Feld, dem Titel (Überschrift)
und dem Klang-Schalter.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">div_logo</tag></term>
  <listitem>
    <para>
Das "Logo"-Feld links in der Titelleiste.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">div_head</tag></term>
  <listitem>
    <para>
Die Überschrift in der Titelleiste: ein <tag class="element">div</tag>-Element,
das das <tag class="element">h1</tag>-Element enthält.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">div_links</tag></term>
  <listitem>
    <para>
Die Verweis-Leiste innerhalb der Titelleiste über der Überschrift:
zwei verschachtelte <tag class="element">div</tag>-Elemente,
die <tag class="element">p</tag>-Elemente enthalten,
die jeweils ein <tag class="element">a</tag>-Element enthalten.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">div_sound</tag></term>
  <listitem>
    <para>
Der "Klangschalter" in der Titelleiste:
eine Schaltfläche, die die Tonwiedergabe startet und anhält.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">div_navig</tag></term>
  <listitem>
    <para>
Das Feld mit dem Navigationsbaum auf der linken Seite.
Der Navigationsbaum ist darin als verschachteltes
<tag class="element">div</tag>-Element enthalten.
Die Verschachtelung macht die CSS-Regeln einfacher.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">help_link</tag></term>
  <listitem>
    <para>
Die Schaltfläche "Mehr ..." in der Verweisliste.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">navig_tree</tag></term>
  <listitem>
    <para>
Das Wurzelelement (<tag class="element">div</tag>-Element) des Navigationsbaums.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">div_content</tag></term>
  <listitem>
    <para>
Das Feld mit dem Haupt-Inhalt.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">iframe</tag></term>
  <listitem>
    <para>
Das <tag class="element">iframe</tag>-Element zur Anzeige eingebetteter Inhalte.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">help_frame</tag></term>
  <listitem>
    <para>
Ein "Aufklapp-Fenster" mit einer kurzen Hilfe zu den Tasten-Funktionen.
    </para>
  </listitem>
</varlistentry>
<varlistentry>
  <term><tag class="attvalue">nav_<replaceable>DIVID</replaceable></tag></term>
  <listitem>
    <para>
Ein Eintrag im Navigationsbaum.
<replaceable>DIVID</replaceable> ist die ID des <tag class="element">div</tag>-Elements,
auf das der Eintrag verweist.
    </para>
  </listitem>
</varlistentry>
</variablelist>
</section>

<d:para>Präfix des Pfades von JavaScript- und CSS-Dateien</d:para>
<xsl:param name="p_styleprefix" select="'/style/'"/>

<d:para>
Hilfe-Abschnitte mit Einträgen im Navigationsbaum erzeugen?
(0 nein, 1 ja)
</d:para>
<xsl:param name="p_help" select="1"/>

<d:para>
Die ID des Abschnitts, der sichtbar ist, bevor Javascript ausgeführt wird.
Auch wenn Javascript deaktiviert ist, soll das Erscheinungsbild ansprechen.
Das ist wichtig für Vorschaubilder in Suchmaschinen.
</d:para>
<xsl:param name="p_initsectid" select="'section.look'"/>

<d:para>
Wurzelelement der Startseite
</d:para>
<xsl:variable name="g_rootelt" select="/*"/>

<d:para>
Kennung der Sprache
</d:para>
<xsl:variable name="g_lang">
  <xsl:variable name="l" select="$g_rootelt/@xml:lang"/>
  <xsl:choose>
    <xsl:when test="contains($l, '-')">
      <xsl:value-of select="substring-before ($l, '-')"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$l"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

<d:para>
Die Wurzel der einzufügenden Hilfe (<tag class="element">ht:div</tag>-Kindelemente)
</d:para>
<xsl:variable
  name = "g_help_root"
  select =
  "document(concat ($p_styleprefix, 'ixdesk_help.xhtml.', $g_lang)) /ht:html/ht:body"
/>

<d:para>Die Wurzel</d:para>
<xsl:template match="/">
  <xsl:apply-templates select="$g_rootelt"/>
</xsl:template>

<d:para>
Der HTML-Rahmen:
Der Kopf enthält die CSS-Regeln und Javascript-Funktionen zur internen Hilfe,
falls diese eingefügt wird.
</d:para>
<xsl:template match="ht:html">
  <html>
    <head>
      <xsl:apply-templates select="ht:head/ht:meta"/>
      <meta name="viewport" content="width=device-width, initial-scale=1"/>
      <xsl:apply-templates select="ht:head/ht:title"/>
      <xsl:element name="link">
        <xsl:attribute name="href">
          <xsl:value-of select="concat ($p_styleprefix, 'shortcut_icon.png')"/>
        </xsl:attribute>
        <xsl:attribute name="rel">icon</xsl:attribute>
      </xsl:element>
      <xsl:element name="link">
        <xsl:attribute name="href">
          <xsl:value-of select="concat ($p_styleprefix, 'ixdesk.css')"/>
        </xsl:attribute>
        <xsl:attribute name="rel">stylesheet</xsl:attribute>
      </xsl:element>
      <xsl:if test="$p_help &gt; 0">
        <xsl:element name="link">
          <xsl:attribute name="href">
            <xsl:value-of select="concat ($p_styleprefix, 'ixdesk_help.css')"/>
          </xsl:attribute>
          <xsl:attribute name="rel">stylesheet</xsl:attribute>
        </xsl:element>
      </xsl:if>
      <xsl:element name="script">
        <xsl:attribute name="src">
          <xsl:value-of select="concat ($p_styleprefix, 'common.js')"/>
        </xsl:attribute>
      </xsl:element>
      <xsl:element name="script">
        <xsl:attribute name="src">
          <xsl:value-of select="concat ($p_styleprefix, 'ixdesk.js')"/>
        </xsl:attribute>
      </xsl:element>
      <xsl:if test="$p_help &gt; 0">
        <xsl:element name="script">
          <xsl:attribute name="src">
            <xsl:value-of select="concat ($p_styleprefix, 'ixdesk_help.js')"/>
          </xsl:attribute>
        </xsl:element>
      </xsl:if>
      <xsl:element name="script">
        <xsl:text tm:content="normal">
var tellabout = {};
tellabout.subject = "</xsl:text>
        <l:ph id="tellabout_betreff"/>
        <xsl:text tm:content="normal">";
tellabout.i_like  = "</xsl:text>
        <l:ph id="tellabout_das_gefaellt_mir"/>
        <xsl:text tm:content="normal">";
onload = function () {
   initialize ();
   if (initialize_help) initialize_help ();
};
</xsl:text>
        <xsl:value-of select="concat ('var initial_sect_id = &quot;', $p_initsectid, '&quot;;')"
        />
      </xsl:element>
    </head>
    <xsl:apply-templates select="ht:body"/>
  </html>
</xsl:template>

<d:para>
Die Komponenten für das Layout:
die Kopfleiste,
die Navigationsleiste auf der linken Seite,
der Hauptinhaltsbereich
und das <d:tag class="element">iframe</d:tag> - Element,
das stets die gleiche Position wie der Hauptinhaltsbereich einnimmt.
</d:para>
<xsl:template match="ht:body">
    <body>
      <xsl:element name="audio">
        <xsl:attribute name="id">audio</xsl:attribute>
        <xsl:attribute name="preload">auto</xsl:attribute>
        <xsl:variable name="b" select="../ht:head/ht:meta [@name = 'backgroundsound'][1]"
        />
        <xsl:variable name="s">
          <xsl:choose>
            <xsl:when test="$b">
              <xsl:value-of select="$b/@content"/>
            </xsl:when>
            <xsl:otherwise>sound</xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <source src="{$p_styleprefix}{$s}.ogg" type="audio/ogg; codecs=vorbis"/>
      </xsl:element>
      <div id="div_title">
        <div id="div_logo">Herbär</div>
        <div id="div_head">
          <xsl:apply-templates select="ht:h1"/>
        </div>
        <xsl:apply-templates select="ht:div [@id = 'div_links']"/>
        <div id="div_sound" class="paused">
          <div>&#x266b;</div>
        </div>
      </div>
      <div id="div_navig">
        <xsl:apply-templates select="/*/@ti:machine" mode="hint"/>
        <div id="navig_tree"><!-- wg. padding -->
          <xsl:apply-templates select="ht:div [starts-with (@class, 'section')]" mode="navig"
          />
          <xsl:apply-templates select="$g_help_root/ht:div [starts-with (@class, 'section')]" mode="navig"
          />
        </div>
      </div>
      <div id="div_content">
        <div>
          <xsl:apply-templates select="*" mode="navigsect"/>
          <xsl:apply-templates select="$g_help_root/ht:div" mode="navigsect"/>
        </div>
      </div>
      <xsl:element name="iframe">
        <xsl:attribute name="id">iframe</xsl:attribute>
        <xsl:attribute name="class">hidden</xsl:attribute>
      </xsl:element>
      <div id="help_frame" class="popup popinact">
        <h3><l:ph id="tastatur_steuerung"/></h3>
        <table>
          <tbody>
            <tr>
              <td>&#x2193;</td>
              <td>
                <span class="btn" data-code="40">
                  <l:ph id="naechster_sichtbarer_navigationspunkt"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>&#x2191;</td>
              <td>
                <span class="btn" data-code="38">
                  <l:ph id="vorhergehender_sichtbarer_navigationspunkt"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>&#x2190;</td>
              <td>
                <span class="btn" data-code="37">
                  <l:ph id="vorhergehender_verweis"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>&#x2192;</td>
              <td>
                <span class="btn" data-code="39">
                  <l:ph id="naechster_verweis"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>n</td>
              <td>
              <span class="btn" data-code="78">
              <l:ph id="naechster_navigationspunkt"/>
              </span>
              </td>
            </tr>
            <tr>
              <td>u</td>
              <td>
                <span class="btn" data-code="85">
                  <l:ph id="vorhergehender_navigationspunkt"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>&#x21b2;</td><!-- Eingabe -->
              <td>
                <span class="btn" data-code="13">
                  <l:ph id="navigationspunkt_expandieren_falten"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>x</td>
              <td>
                <span class="btn" data-code="88">
                  <l:ph id="navigationsbaum_expandieren"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>f</td>
              <td>
                <span class="btn" data-code="70">
                  <l:ph id="navigationsbaum_falten"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>m</td>
              <td>
                <span class="btn" data-code="77">
                  <l:ph id="uri_zu_aktuellem_abschnitt"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>w</td>
              <td>
                <span class="btn" data-code="87">
                  <l:ph id="email_an_freundin"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>p</td>
              <td>
                <span class="btn" data-code="80">
                  <l:ph id="klang_start_stop"/>
                </span>
              </td>
            </tr>
            <tr>
              <td>h</td>
              <td>
                <span class="btn" data-code="72">
                  <l:ph id="dieses_fenster_oeffnen_schliessen"/>
                </span>
              </td>
            </tr>
          </tbody>
        </table>
      </div><!-- help_frame -->
    </body>
</xsl:template>

<d:para>
Verweise unter der Hauptüberschrift
</d:para>
<xsl:template match="ht:div [@id = 'div_links']">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <div>
      <p>
        <a href="index.xhtml#section.formal" target="_blank"><l:ph id="kontakt"/></a>
      </p>
      <p>
        <a href="mobile"><l:ph id="mobil"/></a>
      </p>
      <p>
        <a href="sitemap.xml"><l:ph id="sitemap"/></a>
      </p>
      <p id="help_link" class="btn"><l:ph id="mehr"/></p>
    </div>
  </xsl:copy>
</xsl:template>

<d:section>
<d:title>Der Navigations-Baum</d:title>
<d:para>
Jeder Eintrag im Navigations-Baum ist ein <d:tag class="element">div</d:tag>-Element.
Untergeordnete Einträge sind verschachtelte
<d:tag class="element">div</d:tag>-Elemente.
</d:para>
<d:para>
Das <d:tag class="attribute">class</d:tag>-Wort <d:literal>head</d:literal>
kennzeichnet Einträge, zu denen es untergeordnete Einträge gibt.
CSS-Regeln interpretieren dieses Wort so, dass der Eintrag "gefaltet" darzustellen ist:
Untereinträge werden nicht dargestellt.
Javascript ersetzt <d:literal>head</d:literal> durch <d:literal>exp</d:literal>,
wenn der Eintrag expandiert wird.
Einträge ohne Untereinträge kennzeichnet das
<d:tag class="attribute">class</d:tag>-Wort <d:literal>end</d:literal>.
</d:para>
<d:para>
Den Text des Baumknotens enthält ein <d:tag class="element">p</d:tag>-Element
mit zwei <d:tag class="element">span</d:tag>-Elementen als Kindern.
Das erste <d:tag class="element">span</d:tag>-Element
mit dem <d:tag class="attribute">class</d:tag>-Wort <d:literal>navig_button</d:literal>
ist gedacht für ein Symbol,
das ein Eintrag als expandiert, gefaltet oder als Endknoten kennzeichen kann.
Der Inhalt bleibt leer, die Darstellung bleibt CSS-Regeln überlassen.
Das zweite <d:tag class="element">span</d:tag>-Element
mit dem <d:tag class="attribute">class</d:tag>-Wort <d:literal>navig_text</d:literal>
enthält den Titel des Abschnitts, auf den der Eintrag verweist.
</d:para>
</d:section>
<xsl:template match="ht:div" mode="navig">
  <xsl:variable name="type">
    <xsl:choose>
        <xsl:when test="ht:div [starts-with (@class, 'section')]">head</xsl:when>
        <xsl:otherwise>end</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <div class="{$type}">
    <xsl:attribute name="id">
      <xsl:value-of select="concat ('nav_', @id)"/>
    </xsl:attribute>
    <p>
      <span class="navig_button {$type}"/>
      <span class="navig_text">
        <xsl:value-of select="ht:h1 | ht:h2 | ht:h3 | ht:h4 | ht:h5 | ht:h6"/>
      </span>
    </p>
    <xsl:apply-templates select="ht:div [starts-with (@class, 'section')]" mode="navig"/>
  </div>
</xsl:template>

<d:para role="mode.navigsect">
Der Modus <d:tag class="attvalue">navigsect</d:tag>
kennzeichnet die Vorlage für einen Abschnitt, auf den der Navigationsbaum
(Inhaltsverzeichnis) verweist.
Er stellt sicher, dass verschachtelte Abschnitte,
deren übergeordneter Abschnitt nicht im Navigationsbaum eingetragen ist
(Attribut <d:tag class="attribute">class</d:tag>
beginnt nicht mit <d:literal>section</d:literal>),
als normale Unterabschnitte dargestellt werden.
</d:para>

<section xmlns="http://herbaer.de/xmlns/20051201/doc">
<title>Abschnitte mit einem Eintrag im Navigationsbaum</title>
<para>
Das <tag class="attribute">class</tag>-Attribut
der Abschnitte (<tag class="element">div</tag>-Elemente),
zu denen ein Eintrag im Navigationsbaum erzeugt wird,
beginnt mit <literal>section</literal>.
Unterabschnitte, zu denen ebenfalls ein Eintrag im Navigationsbaum erzeugt wird,
werden nicht als verschachtelte Kindelemente,
sondern als nebengeordnete <tag class="element">div</tag>-Elemente dargestellt.
Dem Attribut <tag class="attribute">class</tag> wird das Wort <literal>hidden</literal>
angefügt.
</para>
</section>
<xsl:template match="ht:div [starts-with (@class, 'section')]" mode="navigsect">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:if test="@id != $p_initsectid">
      <xsl:attribute name="class">
        <xsl:value-of select="concat (@class, ' hidden')"/>
      </xsl:attribute>
    </xsl:if>
    <xsl:if test="not (@e:embed)">
      <xsl:choose>
        <xsl:when test="starts-with(local-name(*[1]), 'h')">
          <xsl:apply-templates select="*[1]"/>
          <xsl:apply-templates select="/ht:html/@ti:machine" mode="hint"/>
          <xsl:apply-templates
            select = "
              *[ position() &gt; 1
              and (local-name() != 'div' or not (starts-with (@class, 'section'))) ]
            "
          />
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates select="/ht:html/@ti:machine" mode="hint"/>
          <xsl:apply-templates select="*[local-name() != 'div' or not (starts-with (@class, 'section'))]"
          />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:copy>
  <xsl:apply-templates select="ht:div [starts-with (@class, 'section')]" mode="navigsect"
  />
</xsl:template>

<d:para>
Hinweis auf die Übersetzungsmaschine
</d:para>
<xsl:template match="@ti:machine" mode="hint">
  <xsl:choose>
    <xsl:when test="contains (., 'google')">
      <p class="machine">
        <a href="https://translate.google.com" class="machine_link" target="_blank">
          <img src="/local/trans_by_google.png"/>
        </a>
      </p>
    </xsl:when>
    <!-- Datenbank translate enthält auch Google-Übersetzungen -->
    <xsl:when test="contains (., 'mysql')">
      <p class="machine">
        <a href="https://translate.google.com" class="machine_link" target="_blank">
          <img src="/local/trans_by_google.png"/>
        </a>
      </p>
    </xsl:when>
  </xsl:choose>
  <p class="machine">
    <l:ph id="maschinelle_uebersetzung"/>
  </p>
</xsl:template>

<d:para>
Die Hauptüberschrift wird im Inhaltsfeld ignoriert,
sie steht bereits in der Titelleiste.
</d:para>
<xsl:template match="ht:h1" mode="navigsect"/>

<d:para>
Die Verweisliste steht ebenfalls schon in der Titelleiste
und wird deshalb hier ignoriert.
</d:para>
<xsl:template match="ht:div [@id = 'div_links']" mode="navigsect"/>

<d:para>
Andere Elemente werden rekursiv kopiert.
</d:para>
<xsl:template match="*" mode="navigsect">
  <xsl:copy>
    <xsl:apply-templates select="* | @* | text()"/>
  </xsl:copy>
</xsl:template>

<d:para>
Elemente und Attribute werden rekursiv kopiert,
sofern es keine spezielle Vorlage gibt.
</d:para>
<xsl:template match="* | @*">
  <xsl:copy>
    <xsl:apply-templates select="* | @* | text()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
