1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/helpers/mimeXhtmlPart.xsl Fri Oct 14 00:45:06 2011 +0200
1.3 @@ -0,0 +1,199 @@
1.4 +<?xml version="1.0" encoding="UTF-8"?>
1.5 +<xsl:stylesheet version="1.0"
1.6 + xmlns="http://www.w3.org/1999/xhtml"
1.7 + xmlns:h="http://www.w3.org/1999/xhtml"
1.8 + xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
1.9 + xmlns:fn="http://www.w3.org/2005/xpath-functions"
1.10 + xmlns:svg="http://www.w3.org/2000/svg"
1.11 + xmlns:xs="http://www.w3.org/2001/XMLSchema"
1.12 + exclude-result-prefixes="fn h xs">
1.13 + <xsl:output
1.14 + method="xml"
1.15 + indent="yes"
1.16 + encoding="UTF-8"
1.17 + doctype-public="-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
1.18 + doctype-system="http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"/>
1.19 +
1.20 +
1.21 + <xsl:param name="title"/>
1.22 + <xsl:param name="isRoot"/>
1.23 + <xsl:param name="urlBase"/>
1.24 + <xsl:param name="wwwRead"/>
1.25 + <xsl:param name="wwwPost"/>
1.26 +
1.27 +
1.28 + <!-- Celý dokument -->
1.29 + <xsl:template match="/">
1.30 + <html>
1.31 + <head>
1.32 + <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
1.33 + <xsl:if test="$urlBase">
1.34 + <base href="{$urlBase}"/>
1.35 + </xsl:if>
1.36 + <xsl:if test="$title">
1.37 + <title><xsl:value-of select="$title"/></title>
1.38 + </xsl:if>
1.39 + <style type="text/css">
1.40 + body {
1.41 + font-family: sans-serif;
1.42 + font-size: 16px;
1.43 + }
1.44 +
1.45 + .wwwLinks {
1.46 + border-top: 2px solid grey;
1.47 + margin-top: 16px;
1.48 + font-size: 66%;
1.49 + }
1.50 +
1.51 + blockquote {
1.52 + background-color: #eee;
1.53 + font-style: italic;
1.54 + padding: 2px 20px;
1.55 + margin: 10px 32px;
1.56 + border-left: 3px solid silver;
1.57 + }
1.58 +
1.59 + pre {
1.60 + background-color: #eee;
1.61 + padding: 2px 20px;
1.62 + margin: 10px 32px;
1.63 + border-left: 3px solid #a00;
1.64 + }
1.65 +
1.66 + img {
1.67 + margin: 8px;
1.68 + }
1.69 +
1.70 + a img {
1.71 + border: none;
1.72 + }
1.73 + </style>
1.74 + </head>
1.75 + <body>
1.76 + <xsl:if test="$title and $isRoot">
1.77 + <h1><xsl:value-of select="$title"/></h1>
1.78 + </xsl:if>
1.79 + <xsl:apply-templates select="h:html/h:body/node()"/>
1.80 +
1.81 + <xsl:if test="$wwwRead or $wwwPost">
1.82 + <div class="wwwLinks">
1.83 + <p>Přístup přes síť www:</p>
1.84 + <ul>
1.85 + <xsl:if test="$wwwRead"><li><a href="{$wwwRead}">číst tento příspěvek</a></li></xsl:if>
1.86 + <xsl:if test="$wwwPost"><li><a href="{$wwwPost}">odpovědět na tento příspěvek</a></li></xsl:if>
1.87 + </ul>
1.88 + </div>
1.89 + </xsl:if>
1.90 + </body>
1.91 + </html>
1.92 + </xsl:template>
1.93 +
1.94 +
1.95 + <!-- Odkazy -->
1.96 + <xsl:template match="h:a">
1.97 + <a href="{@href}" title="{@title}"><xsl:apply-templates/></a>
1.98 + </xsl:template>
1.99 +
1.100 +
1.101 + <!-- Obrázky -->
1.102 + <xsl:template match="h:img">
1.103 + <img src="{@src}" alt="{@alt}" title="{@title}"><xsl:apply-templates/></img>
1.104 + </xsl:template>
1.105 +
1.106 + <!-- Zkratky -->
1.107 + <xsl:template match="h:abbr">
1.108 + <abbr title="{@title}"><xsl:apply-templates/></abbr>
1.109 + </xsl:template>
1.110 +
1.111 +
1.112 + <!-- Další povolené značky – ostatní odfiltrujeme (zbude z nich jen text) -->
1.113 + <xsl:template match="*">
1.114 + <xsl:choose>
1.115 + <xsl:when test="
1.116 + name() = 'h1' or
1.117 + name() = 'h2' or
1.118 + name() = 'h3' or
1.119 + name() = 'h4' or
1.120 + name() = 'h5' or
1.121 + name() = 'h6' or
1.122 + name() = 'p' or
1.123 + name() = 'div' or
1.124 + name() = 'br' or
1.125 + name() = 'strong' or
1.126 + name() = 'em' or
1.127 + name() = 'sub' or
1.128 + name() = 'sup' or
1.129 + name() = 'del' or
1.130 + name() = 'ul' or
1.131 + name() = 'ol' or
1.132 + name() = 'li' or
1.133 + name() = 'pre' or
1.134 + name() = 'code' or
1.135 + name() = 'blockquote'">
1.136 + <xsl:element name="{name()}">
1.137 + <xsl:apply-templates/>
1.138 + </xsl:element>
1.139 + </xsl:when>
1.140 + <xsl:otherwise>
1.141 + <xsl:value-of select="."/>
1.142 + </xsl:otherwise>
1.143 + </xsl:choose>
1.144 + </xsl:template>
1.145 +
1.146 +
1.147 + <!--
1.148 + Z neuzavřeného (nevalidně se vyskytujícího v body) textu uděláme odstavce.
1.149 + Bohužel nefunguje, když neuzavřený text obsahuje jiné značky (odkazy atd.),
1.150 + pak se totiž jedná o dva textové uzly (před značkou a za ní) a vzniknou dva odstavce.
1.151 + -->
1.152 + <xsl:template match="h:body/text()">
1.153 + <xsl:call-template name="makeParagraphs">
1.154 + <xsl:with-param name="string" select="."/>
1.155 + </xsl:call-template>
1.156 + </xsl:template>
1.157 + <xsl:variable name="newLinePlaceholder" select="'ߜ'"/>
1.158 + <xsl:template name="makeParagraphs">
1.159 + <xsl:param name="string" />
1.160 + <xsl:call-template name="makeParagraphsInternal">
1.161 + <!--
1.162 + Konec řádku převedeme na obskurní znak,
1.163 + normalizací pročistíme bílé znaky →
1.164 + dva obskurní znaky oddělené mezerou pak značí předěl mezi odstavci
1.165 + -->
1.166 + <xsl:with-param name="string" select="normalize-space(translate(., ' ', $newLinePlaceholder))"/>
1.167 + </xsl:call-template>
1.168 + </xsl:template>
1.169 + <xsl:template name="makeParagraphsInternal">
1.170 + <xsl:param name="string" />
1.171 + <xsl:if test="ends-with($string, $newLinePlaceholder)"><xsl:comment>končí na $newLinePlaceholder</xsl:comment> </xsl:if>
1.172 + <!-- V XSLT 2.0 můžeme použít fn:tokenize -->
1.173 + <xsl:param name="delimiter" select="concat($newLinePlaceholder, ' ', $newLinePlaceholder)"/>
1.174 + <xsl:choose>
1.175 + <xsl:when test="$delimiter and contains($string, $delimiter)">
1.176 + <xsl:call-template name="makeParagraph">
1.177 + <xsl:with-param name="string" select="substring-before($string, $delimiter)"></xsl:with-param>
1.178 + </xsl:call-template>
1.179 + <xsl:call-template name="makeParagraphsInternal">
1.180 + <xsl:with-param name="string" select="substring-after($string, $delimiter)" />
1.181 + <xsl:with-param name="delimiter" select="$delimiter" />
1.182 + </xsl:call-template>
1.183 + </xsl:when>
1.184 + <xsl:otherwise>
1.185 + <!--
1.186 + Poslední odstavec → zkontrolovat, zda je za ním
1.187 + -->
1.188 + <xsl:call-template name="makeParagraph">
1.189 + <xsl:with-param name="string" select="$string"></xsl:with-param>
1.190 + </xsl:call-template>
1.191 + </xsl:otherwise>
1.192 + </xsl:choose>
1.193 + </xsl:template>
1.194 + <xsl:template name="makeParagraph">
1.195 + <xsl:param name="string" />
1.196 + <!-- prázdné textové uzly nás nezajímají – nechceme prázdné odstavce -->
1.197 + <xsl:if test="normalize-space($string)">
1.198 + <p class="mešuge"><xsl:value-of select="translate($string, $newLinePlaceholder, ' ')" /></p>
1.199 + </xsl:if>
1.200 + </xsl:template>
1.201 +
1.202 +</xsl:stylesheet>