blob: 2432586cefed3f01e6c0cc21a21bb8e61f222051 [file] [log] [blame]
<?xml version="1.0"?>
<!--
Convert the slop parser output to a collection of slides
$Id: filter-slop-output.xsl,v 1.7 2003/10/14 11:54:40 bdelacretaz Exp $
-->
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:slop="http://apache.org/cocoon/slop/parser/1.0"
>
<!-- prefix for presentation hints in slides -->
<xsl:variable name="hintPrefix" select="'hint-'"/>
<!-- key based on last preceding slide element, used to group slides content -->
<xsl:key
name="lastSlideKey"
match="slop:empty-line[not(self::slop:slide)]" use="generate-id(preceding::slop:slide[1])"
/>
<!--
Extract the presentation heading and let slides extract themselves,
once to generate the navigation (list of slides) and once to
generate content
-->
<xsl:template match="/">
<yapt-presentation>
<heading>
<!-- get everything up to the first slide -->
<xsl:apply-templates
mode="head"
select="slop:parsed-text/*[not(preceding::slop:slide) and not(self::slop:slide)]"
/>
</heading>
<navigation>
<!-- extract all slides, without content -->
<xsl:apply-templates
mode="navigation"
select="slop:parsed-text/slop:slide"
/>
</navigation>
<content>
<!-- extract slide elements, let them get their content -->
<xsl:apply-templates
mode="content"
select="slop:parsed-text/slop:slide"
/>
</content>
</yapt-presentation>
</xsl:template>
<!-- head: by default copy everything, removing slop namespace -->
<xsl:template match="*" mode="head">
<xsl:element name="{name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- head: eat empty lines and config stuff -->
<xsl:template match="slop:empty-line" mode="head"/>
<!-- navigation: output slide with unique id -->
<xsl:template match="slop:slide" mode="navigation">
<xsl:variable name="id">
<xsl:number level="single" count="slop:slide"/>
</xsl:variable>
<slide-ref slide-id="{$id}" title="{.}"/>
</xsl:template>
<!-- content: output slide with unique id and content -->
<xsl:template match="slop:slide" mode="content">
<xsl:variable name="id">
<xsl:number level="single" count="slop:slide"/>
</xsl:variable>
<slide slide-id="{$id}">
<xsl:variable name="anchor" select="."/>
<slide-head>
<title><xsl:value-of select="."/></title>
</slide-head>
<slide-hints>
<!-- collect presentation hints -->
<xsl:apply-templates mode="hints" select="following-sibling::slop:*[starts-with(name(),$hintPrefix)][preceding::slop:slide[1] = $anchor]"/>
</slide-hints>
<slide-content>
<!-- get content of this slide based on lastSlideKey -->
<xsl:apply-templates select="key('lastSlideKey',generate-id(.))" mode="paragraph"/>
</slide-content>
</slide>
</xsl:template>
<!-- presentation hints -->
<xsl:template match="*[starts-with(name(),$hintPrefix)]" mode="hints">
<xsl:element name="{substring-after(name(),$hintPrefix)}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<!-- ignore hints in content -->
<xsl:template match="*[starts-with(name(),$hintPrefix)]" mode="content"/>
<!-- ignore multiple empty lines -->
<xsl:template mode="paragraph" match="slop:empty-line[following-sibling::*[1][self::slop:empty-line]]"/>
<!-- extract paragraph and code blocks -->
<xsl:template mode="paragraph" match="slop:empty-line">
<xsl:choose>
<xsl:when test="following-sibling::*[1][self::slop:code]">
<pre>
<xsl:for-each select="following-sibling::*[1][not(self::slop:empty-line) and not(self::slop:slide)]">
<xsl:call-template name="code-grouper"/>
</xsl:for-each>
</pre>
</xsl:when>
<xsl:when test="following-sibling::*[1][self::slop:list]">
<ul>
<xsl:for-each select="following-sibling::*[1][not(self::slop:empty-line) and not(self::slop:slide)]">
<xsl:call-template name="list-grouper"/>
</xsl:for-each>
</ul>
</xsl:when>
<xsl:otherwise>
<p>
<xsl:for-each select="following-sibling::*[1][not(self::slop:empty-line) and not(self::slop:slide)]">
<xsl:call-template name="para-grouper"/>
</xsl:for-each>
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- recursively collect elements until an empty line or the next slide is found -->
<xsl:template name="para-grouper">
<xsl:apply-templates mode="paragraph" select="."/>
<xsl:for-each select="following-sibling::*[1][not(self::slop:empty-line) and not(self::slop:slide)]">
<xsl:call-template name="para-grouper"/>
</xsl:for-each>
</xsl:template>
<!-- ditto for code lines -->
<xsl:template name="code-grouper">
<xsl:apply-templates mode="code" select="."/>
<xsl:for-each select="following-sibling::*[1][not(self::slop:empty-line) and not(self::slop:slide)]">
<xsl:call-template name="code-grouper"/>
</xsl:for-each>
</xsl:template>
<!-- ditto for list items -->
<xsl:template name="list-grouper">
<xsl:apply-templates mode="list" select="."/>
<xsl:for-each select="following-sibling::*[1][not(self::slop:empty-line) and not(self::slop:slide)]">
<xsl:call-template name="list-grouper"/>
</xsl:for-each>
</xsl:template>
<!-- paragraph grouping mode, by default copy everything, removing slop namespace -->
<xsl:template match="slop:*" mode="paragraph">
<xsl:element name="{name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- output code slop:lines as-is, with added carriage return -->
<xsl:template match="slop:line" mode="list">
<li>&#187; <xsl:copy-of select="text()"/></li>
</xsl:template>
<!-- output code slop:lines as-is, with added carriage return -->
<xsl:template match="slop:line" mode="code">
<xsl:copy-of select="text()"/><xsl:text>&#13;</xsl:text>
</xsl:template>
<!-- extract the text of lines -->
<xsl:template match="slop:line" mode="paragraph">
<xsl:value-of select="concat(.,' ')"/>
</xsl:template>
<!-- images are defined like "img_XX: filename" where XX is the CSS class -->
<xsl:template mode="paragraph" match="slop:*[starts-with(name(),'img')]">
<xsl:variable name="class" select="substring-after(name(),'img_')"/>
<img src="{normalize-space(.)}" alt="{normalize-space(.)}" class="{$class}"/>
</xsl:template>
</xsl:stylesheet>