<?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:xi = "http://www.w3.org/2003/XInclude"
  xmlns:tm = "http://herbaer.de/xmlns/20130628/transformation_attributes"
  xmlns = "http://www.w3.org/1999/xhtml"
  exclude-result-prefixes = "d ht"
  version = "1.0"
>
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>help_step_1.xslt</title>
  <subtitle>XHTML-Hilfedateien vorbereiten</subtitle>
  <date>2014-03-15</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>
In XHTML-Dateien (Hilfen) werden CSS- und Javascript-Dateien direkt eingebunden.
Im ersten Schritt werden
<tag class="element">link</tag>-Elemente mit dem Attribut
<tag class="attribute">rel</tag> = "<literal>stylesheet</literal>"
und
<tag class="element">script</tag>-Elemente mit dem Attribut
<tag class="attribute">src</tag>
durch
<tag class="element">xi:include</tag>-Elemente ersetzt.
Die
<tag class="element">xi:include</tag>-Elemente verweisen auf aufbereitete Versionen
der CSS- und Javascript-Dateien.
</para>
</d:section>

<d:para>
Präfix für CSS- und Javascript-Dateien.
Dieser Wert wird benutzt, wenn
<d:parameter>$p_tmpprefix</d:parameter> leer ist.
</d:para>
<xsl:param name="p_styleprf" select="''"/>

<d:para>
Präfix des temporären Pfades der einzubindenden JavaScript- und CSS-Dateien.
Wenn der Wert leer ist,
werden Verweise auf die Dateien eingefügt.
Sonst werden die Dateien per XInclude eingebunden.
</d:para>
<xsl:param name="p_tmpprefix" select="''"/>

<d:para>
Komma-getrennte Liste der Namen der Dateien,
die nicht mit <d:tag class="element">xi:include</d:tag> eingebunden werden sollen.
</d:para>
<xsl:param name="p_exclude" select="'common.js'"/>

<d:para>
Dateiname der Icon-Datei.
Wenn dieser Wert nicht die leere Zeichenkette ist,
und kein Verweis auf ein Icon bereits existiert,
wird ein Verweis auf diese Datei unter dem Pfad-Prefix
<d:parameter>$p_styleprf</d:parameter> eingefügt.
</d:para>
<xsl:param name="p_icon" select="'shortcut_icon.png'"/>

<d:para>
Vorlage <d:literal>txt.afterlastchar</d:literal>
</d:para>
<xsl:include href="/pool/txt.xslt"/>

<d:para>
Vorlage <d:literal>list.entry_by_key</d:literal>
</d:para>
<xsl:include href="/pool/list.xslt"/>

<xsl:template match="/">
  <xsl:apply-templates select="* | processing-instruction()"/>
</xsl:template>

<d:para>
Verarbeitungsanweisungen werden kopiert.
Sie sind bei der Übersetzung nützlich.
</d:para>
<xsl:template match="processing-instruction()">
  <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="* | @*">
  <xsl:copy>
    <xsl:apply-templates select="@* | * | text()"/>
  </xsl:copy>
</xsl:template>

<d:para>
Wenn kein "Shortcut-Icon" definiert ist,
wird es hier eingefügt.
</d:para>
<xsl:template match="ht:head">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:if test="string-length ($p_icon) &gt; 0 and not (ht:link [@rel = 'icon'])">
      <xsl:element name="link">
        <xsl:attribute name="href">
          <xsl:value-of select="concat ($p_styleprf, $p_icon)"/>
        </xsl:attribute>
        <xsl:attribute name="rel">icon</xsl:attribute>
      </xsl:element>
    </xsl:if>
    <xsl:apply-templates select="* | text()"/>
  </xsl:copy>
</xsl:template>

<d:section>
  <d:para>
Stylesheet-Verweis.
  </d:para>
  <d:para>
Wenn <d:parameter>p_tmpprefix</d:parameter> nicht leer ist,
wird ein <d:tag class="element">style</d:tag>-Element eingefügt,
das ein <d:tag class="element">xi:include</d:tag>-Element enthält,
das die CSS-Datei einbindet.
  </d:para>
  <d:para>
Andernfalls wird ein
<d:tag class="element">link</d:tag>-Element eingefügt,
dessen Attribut
<d:tag class="attribute">href</d:tag> auf die CSS-Datei verweist.
  </d:para>
</d:section>
<xsl:template match="ht:link [@rel = 'stylesheet']">
  <xsl:variable name="scriptname">
    <xsl:call-template name="txt.afterlastchar">
      <xsl:with-param name="txt" select="@href"/>
      <xsl:with-param name="delim" select="'/}'"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:variable name="prf">
    <xsl:call-template name="test_exclude">
      <xsl:with-param name="scriptname" select="$scriptname"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="string-length ($prf) = 0">
      <xsl:element name="link">
        <xsl:apply-templates select="@rel | @media"/>
        <xsl:attribute name="href">
          <xsl:value-of select="concat ($p_styleprf, $scriptname)"/>
        </xsl:attribute>
      </xsl:element>
    </xsl:when>
    <xsl:otherwise>
      <xsl:element name="style">
        <xsl:apply-templates select="@media"/>
        <xsl:attribute name="tm:placeholder">imageprefix</xsl:attribute>
        <xsl:element name="xi:include">
          <xsl:attribute name="href">
            <xsl:value-of select="concat ($p_tmpprefix, $scriptname)"/>
          </xsl:attribute>
          <xsl:attribute name="parse">text</xsl:attribute>
          <xsl:attribute name="encoding">utf-8</xsl:attribute>
        </xsl:element>
      </xsl:element>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<d:section>
  <d:para>
Fügt ein <d:tag class="element">script</d:tag>-Element ein.
  </d:para>
  <d:para>
Wenn <d:parameter>p_tmpprefix</d:parameter> nicht leer ist,
bindet ein <d:tag class="element">xi:include</d:tag>-Element
die Datei ein, sonst verweist ein
<d:tag class="attribute">src</d:tag>-Attribut
auf die Scriptdatei.
  </d:para>
</d:section>
<xsl:template match="ht:script[@src]">
  <xsl:variable name="scriptname">
    <xsl:call-template name="txt.afterlastchar">
      <xsl:with-param name="txt" select="@src"/>
      <xsl:with-param name="delim" select="'/}'"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:variable name="prf">
    <xsl:call-template name="test_exclude">
      <xsl:with-param name="scriptname" select="$scriptname"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:element name="script">
    <xsl:choose>
      <xsl:when test="string-length ($prf) = 0">
        <xsl:attribute name="src">
          <xsl:value-of select="concat ($p_styleprf, $scriptname)"/>
        </xsl:attribute>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="xi:include">
          <xsl:attribute name="href">
            <xsl:value-of select="concat ($p_tmpprefix, $scriptname)"/>
          </xsl:attribute>
          <xsl:attribute name="parse">text</xsl:attribute>
          <xsl:attribute name="encoding">utf-8</xsl:attribute>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:element>
</xsl:template>

<d:para>
Ergibt <d:varname>$p_tmpprefix</d:varname>,
wenn <d:varname>$scriptname</d:varname>
nicht in der Liste <d:varname>$p_exclude</d:varname> enthalten ist,
sonst nichts..
</d:para>
<xsl:template name="test_exclude">
  <!-- Der Dateiname der Script-Datei -->
  <xsl:param name="scriptname"/>
  <xsl:variable name="exclude">
    <xsl:call-template name="list.entry_by_key">
      <xsl:with-param name="list" select="$p_exclude"/>
      <xsl:with-param name="key" select="$scriptname"/>
      <xsl:with-param name="sep" select="','"/>
    </xsl:call-template>
  </xsl:variable>
  <xsl:choose>
    <xsl:when test="string-length ($exclude) &gt; 0"/>
    <xsl:otherwise>
      <xsl:value-of select="$p_tmpprefix"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

</xsl:stylesheet>
