helpers/mimeXhtmlPart.xsl
changeset 76 b5690fc25af6
child 77 623025c704c5
     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(., '&#10;', $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, '&#10;')" /></p>				
   1.199 +			</xsl:if>
   1.200 +	</xsl:template>
   1.201 +
   1.202 +</xsl:stylesheet>