<?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:d = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:ht = "http://www.w3.org/1999/xhtml"
  xmlns:is = "http://herbaer.de/xmlns/20080705/imgshow"
  xmlns:l = "http://herbaer.de/xmlns/20141210/localization"
  xmlns:ti = "http://herbaer.de/xmlns/201500703/transinfo/"
  xmlns = "http://www.w3.org/1999/xhtml"
  exclude-result-prefixes = "d ht is l ti"
  version = "1.0"
>
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>mobile.xslt</title>
  <subtitle>XHTML-Darstellung einer "Bildgeschichte" für Smartfons</subtitle>
  <date>2014-08-25</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<d:section xmlns="http://herbaer.de/xmlns/20051201/doc" role="stylesheet">
<para>
Smartfone erfordern eine einfache Darstellung.
Alle anderen Anwender-Eingaben als die Auswahl (&#x201e;Click&#x201d;) sind
umständlich. Deshalb vermeide ich sie.
</para>
<para>
Anpassungen an eine geänderte Fenstergröße sind nicht nötig und nicht nützlich.
Die Darstellung nutzt die Fläche, die das Smartfon-System zur Verfügung stellt.
Der Anwender kann durch &#x201e;Spreizen&#x201d; die Anzeige vergrößern,
aber das ändert nicht die Zahl der &#x201e;logischen&#x201d; Pixel, nur die Ansicht.
Der Mobil-Browser sendet kein Ereignis &#x201e;Resize&#x201d;.
</para>
<para>
Die Anzeigefläche ist klein.
Deshalb muss sich die Anzeige auf das Wesentliche beschränken:
Zu jedem Abschnitt wird der Text angezeigt,
darunter Vorschaubilder.
Die Vorschaubilder sind Verweise zu den &#x201e;großen&#x201d; Bildern.
</para>
<para>
Statt der Liste der Abschnitte zeige ich einen zusätzlichen Abschnitt
"Übersicht".
Dieser Abschnitt enhält Verweise auf andere Abschnitte.
Der Hintergrund der Verweise ist die Vorschau des ersten Bildes des "Ziel"-Abschnitts.
</para>
<para>
Ich gehe davon aus, dass eine Klangwiedergabe möglich ist.
</para>
<para>
Diese Transformation wird durch die Dateien
<filename>mobile.js</filename> und
<filename>mobile.css</filename> ergänzt.
Die Datei
<filename>mobile.stub</filename> verknüpft eine Bildergeschichte
mit dieser Darstellung.
</para>
<para>
Die Darstellung nutzt die folgenden ID-Werte:
</para>
<variablelist>
  <varlistentry>
    <term><literal>audio</literal></term>
    <listitem>
      <para>
Das <tag class="element">audio</tag>-Element.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>d_links</literal></term>
    <listitem>
      <para>
Der Abschnitt mit Verweisen unterhalb des Titels.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>audiolnk</literal></term>
    <listitem>
      <para>
Der &#x201e;Schalter&#x201d; für die Klangwiedergabe.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>qv</literal></term>
    <listitem>
      <para>
Die "Übersicht":
Abschnitt mit Verweisen auf die Abschnitte mit Bildern.
Jeder Verweis enthält die Vorschau des ersten Bildes des Abschnitts
als Hintergrundbild.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>s<replaceable>NN</replaceable></literal></term>
    <listitem>
      <para>
Die ID des <replaceable>NN</replaceable>-ten Abschnitts
(<tag class="element">section</tag>-Elements).
<replaceable>NN</replaceable> steht für eine ein- oder mehrstellige
Dezimalzahl
      </para>
    </listitem>
  </varlistentry>
</variablelist>
<para>
Die Darstellung nutzt die folgenden Werte des Attributs
<tag class="attribute">@class</tag>:
</para>
<variablelist>
  <varlistentry>
    <term><literal>paused</literal></term>
    <listitem>
      <para>
Der Schalter für die Klangwiedergabe ist mit diesem Wert markiert,
während die Klangwiedergabe nicht läuft.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>playing</literal></term>
    <listitem>
      <para>
Während die Klangwiedergabe läuft,
setzt Javascript (Datei <filename>imgshow_mod.js</filename>)
das Attribut <tag class="attribute">@class</tag> des Schalters auf diesen Wert.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>sectlink</literal></term>
    <listitem>
      <para>
Wenn das Attribut
<tag class="attribute">span/@class</tag>
mit dem Wort <literal>sectlink</literal> beginnt,
kennzeichnet es einen Verweis auf einen Abschnitt der Bildergeschichte.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>inactive</literal></term>
    <listitem>
      <para>
Der Wert des Attributs <tag class="attribute">section/@class</tag>
steuert die Darstellung des Abschnitts.
      </para>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term><literal>active</literal></term>
    <listitem>
      <para>
Der Wert des Attributs <tag class="attribute">section/@class</tag>
wird durch Javascript (<filename>mobile.js</filename>)
zwischen <literal>inactive</literal> und <literal>active</literal>
umgeschaltet.
      </para>
    </listitem>
  </varlistentry>
</variablelist>
</d:section>

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

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

<d:para>
Sprache ohne weitere Spezifikation
</d:para>
<xsl:variable name="g_lang">
  <xsl:variable name="l" select="$g_rootelt/@xml:lang"/>
  <xsl:choose>
    <xsl:when test="string-length($l) = 0">
      <xsl:text>de</xsl:text>
    </xsl:when>
    <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>
So merkt auch Chromium, dass die Ausgabe utf-8-kodiert ist.
</d:para>
<xsl:output method="xml" encoding="utf-8" indent="yes"/>

<d:para>HTML-Rahmen: Kopf</d:para>
<xsl:template match="/">
  <html>
    <xsl:copy-of select="*/@xml:lang"/>
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1"/>
      <xsl:element name="title">
        <xsl:value-of select="$g_rootelt/is:title"/>
      </xsl:element>
      <xsl:element name="link">
        <xsl:attribute name="href">
          <xsl:value-of select="concat ($p_styleprefix, 'mobile.css')"/>
        </xsl:attribute>
        <xsl:attribute name="rel">stylesheet</xsl:attribute>
      </xsl:element>
      <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="script">
        <xsl:attribute name="src">
          <xsl:value-of select="concat ($p_styleprefix, 'mobile.js')"/>
        </xsl:attribute>
      </xsl:element>
      <xsl:element name="script">
        <xsl:text>
onload = function () { initialize (); };</xsl:text>
      </xsl:element>
    </head>
    <xsl:apply-templates select="$g_rootelt"/>
  </html>
</xsl:template>

<xsl:template match="is:document">
  <body>
    <xsl:element name="audio">
      <xsl:attribute name="id">audio</xsl:attribute>
      <xsl:attribute name="preload">auto</xsl:attribute>
      <source src="{$p_styleprefix}sound.ogg" type="audio/ogg; codecs=vorbis"/>
    </xsl:element>
    <h1><xsl:value-of select="is:title"/></h1>
    <div id="d_links">
      <a href="../mobile" target="_top">&#x2302;</a>
      <a href="../comp/formal/index.xhtml" target="_top">&#x2709;</a>
      <a href="imgview" target="_top">&#x25b6;</a>
      <a href="../smmobile" target="_top">&#x21f6;</a>
      <a href="desktop" target="_top"><l:ph id="desktop"/></a>
      <p id="audiolnk" class="paused"><span/>Scott Joplin: The Rag-Time Dance</p>
    </div>
    <xsl:apply-templates select="@ti:machine"/>
    <section class="active" id="qv">
      <h2><l:ph id="uebersicht"/></h2>
      <div>
        <xsl:apply-templates select="//is:section/descendant::is:jpg[1]" mode="qv"/>
      </div>
    </section>
    <xsl:apply-templates select="is:section"/>
  </body>
</xsl:template>

<d:para>
Hinweis auf maschinelle Übersetzung
</d:para>
<xsl:template match="@ti:machine">
  <xsl:if test="string-length (.) &gt; 0">
    <div class="machine">
      <xsl:choose>
        <xsl:when test="contains (., 'google')">
          <p>
            <a href="https://translate.google.com" 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>
            <a href="https://translate.google.com" target="_blank">
              <img src="/local/trans_by_google.png"/>
            </a>
          </p>
        </xsl:when>
      </xsl:choose>
      <p>
        <l:ph id="maschinelle_uebersetzung"/>
      </p>
    </div>
  </xsl:if>
</xsl:template>

<d:para>
Haupt-Inhalt:
Anfangs wird die Übersicht "entfaltet" angezeigt.
</d:para>
<xsl:template match="is:section">
  <xsl:variable name="sid" select="concat ('s', count (preceding::is:section) + 1)"/>
  <section id="{$sid}" class="inactive">
    <xsl:apply-templates select="is:title"/>
    <div>
      <xsl:apply-templates select="* [local-name() != 'title']">
        <xsl:with-param name="sid" select="$sid"/>
      </xsl:apply-templates>
    </div>
    <div>
      <xsl:choose>
        <xsl:when test=".//is:jpg">
          <xsl:apply-templates select=".//is:jpg" mode="inl">
            <xsl:with-param name="sid" select="$sid"/>
          </xsl:apply-templates>
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates select="//is:section/descendant::is:jpg[1]" mode="inl">
            <xsl:with-param name="sid" select="$sid"/>
          </xsl:apply-templates>
        </xsl:otherwise>
      </xsl:choose>
    </div>
  </section>
</xsl:template>

<d:para>Inline-Bilder</d:para>
<xsl:template match="is:jpg" mode="inl">
  <!-- Kennung des Abschnitts im Format s9+ -->
  <xsl:param name="sid"/>
  <!--
    Suffix, das die Eindeutigkeit der ID sicherstellen soll.
  -->
  <xsl:variable name="sfx" select="position () - 1"/>
  <a class="imglink" target="_blank">
    <xsl:attribute name="href">
      <xsl:value-of select="concat ('images/', @src, '.jpg')"/>
    </xsl:attribute>
    <xsl:attribute name="style">
      <xsl:value-of
        select = "
          concat (
          'background: url(montage/',
          $sid, '.jpg) 0px -', $sfx * 100 + 2, 'px;'
          )
        "
      />
    </xsl:attribute>
  </a>
</xsl:template>

<d:para>
Inline-Bilder in der Übersicht
</d:para>
<xsl:template match="is:jpg" mode="qv">
  <!-- Die Nummer des Abschnitts -->
  <xsl:variable name="sn" select="count(preceding::is:section) + 1"/>
  <span class="sectlink {$sn}_{@src}_0">
    <a class="imglink">
      <xsl:attribute name="style">
        <xsl:value-of select="concat ('background: url(montage/s', $sn, '.jpg) 0px -2px;')"
        />
      </xsl:attribute>
    </a>
  </span>
</xsl:template>

<d:para>Abschnitts-Überschrift</d:para>
<xsl:template match="is:title">
  <h2><xsl:apply-templates/></h2>
</xsl:template>

<d:para>
Unter-Abschnitt:
In der Web-Version gibt es keine "textfreien" Abschnitte
</d:para>
<xsl:template match="is:p">
  <xsl:apply-templates select="@title"/>
  <p>
    <xsl:apply-templates/>
  </p>
</xsl:template>

<d:para>Titel eines Unterabschnitts</d:para>
<xsl:template match="@title">
  <h3><xsl:value-of select="."/></h3>
</xsl:template>

<d:para>Verweis auf einen Abschnitt im Text</d:para>
<xsl:template match="is:sect [@ref]">
  <span class="sectlink {@ref}">
    <xsl:apply-templates/>
  </span>
</xsl:template>

<d:para>Verweis auf eine Bildergeschichte</d:para>
<xsl:template match="is:story">
  <a>
    <xsl:attribute name="href">
      <xsl:choose>
        <xsl:when test="contains (@ref, '#')">
          <xsl:value-of
            select = "
              concat (
              '../s',
              substring-before (@ref, '#'),
              '/story.xml',
              '#',
              substring-after (@ref, '#') )
            "
          />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat ('../s', @ref, '/story.xml')"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:attribute>
    <xsl:apply-templates/>
  </a>
</xsl:template>

<d:para>HTML-Inline-Elemente</d:para>
<xsl:template match="ht:*">
  <xsl:copy-of select="."/>
</xsl:template>

</xsl:stylesheet>
