1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="2.0"
3 xmlns="http://www.w3.org/1999/xhtml"
4 xmlns:h="http://www.w3.org/1999/xhtml"
5 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
6 xmlns:fn="http://www.w3.org/2005/xpath-functions"
7 xmlns:svg="http://www.w3.org/2000/svg"
8 xmlns:xs="http://www.w3.org/2001/XMLSchema"
9 exclude-result-prefixes="fn h xs">
14 doctype-public="-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
15 doctype-system="http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"/>
18 <xsl:param name="title"/>
19 <xsl:param name="isRoot"/>
20 <xsl:param name="urlBase"/>
21 <xsl:param name="wwwRead"/>
22 <xsl:param name="wwwPost"/>
25 <!-- Celý dokument -->
26 <xsl:template match="/">
29 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
30 <meta http-equiv="X-NNTP-Generated" content="{fn:current-dateTime()}" />
31 <xsl:if test="$urlBase">
32 <base href="{$urlBase}"/>
34 <xsl:if test="$title">
35 <title><xsl:value-of select="$title"/></title>
37 <style type="text/css">
39 font-family: sans-serif;
44 border-top: 2px solid grey;
50 background-color: #eee;
54 border-left: 3px solid silver;
58 background-color: #eee;
61 border-left: 3px solid #a00;
74 background-color: #afa;
75 border: 1px solid #5f5;
80 <xsl:if test="$title and $isRoot">
81 <h1><xsl:value-of select="$title"/></h1>
83 <xsl:call-template name="zpracujTělo">
84 <xsl:with-param name="prvek" select="h:html/h:body/node()[1]"/>
87 <xsl:if test="$wwwRead or $wwwPost">
88 <div class="wwwLinks">
89 <p>Přístup přes síť www:</p>
91 <xsl:if test="$wwwRead"><li><a href="{$wwwRead}">číst tento příspěvek</a></li></xsl:if>
92 <xsl:if test="$wwwPost"><li><a href="{$wwwPost}">odpovědět na tento příspěvek</a></li></xsl:if>
102 <xsl:template match="h:a">
103 <a href="{@href}" title="{@title}"><xsl:apply-templates/></a>
108 <xsl:template match="h:img">
109 <img src="{@src}" alt="{@alt}" title="{@title}"><xsl:apply-templates/></img>
113 <xsl:template match="h:abbr">
114 <abbr title="{@title}"><xsl:apply-templates/></abbr>
118 <!-- Další povolené značky – ostatní odfiltrujeme (zbude z nich jen text) -->
119 <xsl:template match="*">
141 name() = 'blockquote'">
142 <xsl:element name="{name()}">
143 <xsl:apply-templates/>
147 <xsl:value-of select="."/>
153 Z neuzavřeného (nevalidně se vyskytujícího v body) textu uděláme odstavce.
155 <xsl:template name="zpracujTělo">
156 <xsl:param name="prvek"/>
157 <xsl:param name="vnořeno" select="false()"/>
158 <xsl:if test="$prvek">
160 <xsl:when test="$prvek/self::text()">
162 Textový uzel → budeme dělat odstavce
163 (rekurzivně se opět zavolá šablona zpracujTělo)
165 <xsl:call-template name="dělejOdstavceX">
166 <xsl:with-param name="blokTextu" select="$prvek"/>
167 <xsl:with-param name="vnořeno" select="$vnořeno"/>
169 <!-- TODO: někdy zpracujTělo dalšího prvku -->
171 <xsl:variable name="navázat" as="xs:boolean">
172 <xsl:call-template name="navázat">
173 <xsl:with-param name="blokTextu" select="$prvek"/>
177 <xsl:if test="not($navázat)">[not(navázat)]</xsl:if>
182 Jiný uzel → aplikujeme obecné šablony
183 a zpracujeme následující uzel.
185 <xsl:apply-templates select="$prvek"/>
186 <xsl:call-template name="zpracujTělo">
187 <xsl:with-param name="prvek" select="$prvek/following-sibling::node()[1]"/>
188 <xsl:with-param name="vnořeno" select="$vnořeno"/>
195 <xsl:variable name="oddělovač" select="'\n\s+\n\s+'"/>
197 <xsl:template name="navázat" as="xs:boolean">
198 <xsl:param name="blokTextu"/>
199 <xsl:variable name="dalšíUzel" select="$blokTextu/following-sibling::node()[1]"/>
200 <xsl:sequence select="
201 not(fn:matches($blokTextu, concat('.*', $oddělovač ,'$'))) and
204 $dalšíUzel/name() = 'p' or
205 $dalšíUzel/name() = 'div' or
206 $dalšíUzel/name() = 'h1' or
207 $dalšíUzel/name() = 'h2' or
208 $dalšíUzel/name() = 'h3' or
209 $dalšíUzel/name() = 'h4' or
210 $dalšíUzel/name() = 'h5' or
211 $dalšíUzel/name() = 'h6' or
212 $dalšíUzel/name() = 'pre' or
213 $dalšíUzel/name() = 'table' or
214 $dalšíUzel/name() = 'blockquote' or
215 $dalšíUzel/name() = 'hr'
220 <xsl:template name="dělejOdstavceX">
221 <xsl:param name="blokTextu"/>
222 <xsl:param name="vnořeno" select="false()"/>
224 <xsl:variable name="dalšíUzel" select="$blokTextu/following-sibling::node()[1]"/>
226 <xsl:variable name="navázat" as="xs:boolean">
227 <xsl:call-template name="navázat">
228 <xsl:with-param name="blokTextu" select="$blokTextu"/>
232 <xsl:for-each select="fn:tokenize($blokTextu, $oddělovač)">
233 <xsl:if test="normalize-space(.)">
235 <xsl:when test="$vnořeno">
236 <xsl:value-of select="."/>
237 <xsl:if test="$navázat and position() = last()">
238 <xsl:call-template name="zpracujTělo">
239 <xsl:with-param name="prvek" select="$dalšíUzel"/>
245 <xsl:value-of select="."/>
246 <xsl:if test="$navázat and position() = last()">
247 <xsl:call-template name="zpracujTělo">
248 <xsl:with-param name="prvek" select="$dalšíUzel"/>
249 <xsl:with-param name="vnořeno" select="true()"/>
258 <xsl:if test="not($navázat)">
259 <xsl:call-template name="zpracujTělo">
260 <xsl:with-param name="prvek" select="$dalšíUzel"/>
270 <xsl:template name="dělejOdstavce">
271 <xsl:param name="blokTextu"/>
272 <xsl:variable name="oddělovač" select="'\n\s+\n\s+'"/>
273 <xsl:for-each select="fn:tokenize(., $oddělovač)">
274 <xsl:if test="normalize-space(.)">
276 <xsl:value-of select="."/>
278 Toto je poslední odstavec bloku textu
279 a blok nekončí dvěma konci řádku →
280 může za ním následovat značka (např. odkaz nebo tučné písmo)
281 vnořená do téhož odstavce
284 position() = last() and
285 not(fn:matches($blokTextu, concat('.*', $oddělovač ,'$')))
287 <xsl:variable name="n" select="$blokTextu/following-sibling::*[1]"/>
288 <xsl:variable name="nn" select="$n/name()"/>
290 Za blokem textu nenásleduje značka, která nemůže být uvnitř odstavce.
303 $nn = 'blockquote' or
306 <xsl:apply-templates select="$n"/>
309 <xsl:call-template name="zpracujTělo">
310 <xsl:with-param name="prvek" select="$blokTextu/following-sibling::node()[1]"/>