# HG changeset patch
# User František Kučera <franta-hg@frantovo.cz>
# Date 1318588874 -7200
# Node ID 623025c704c579864531ce842c2b4368c6db917b
# Parent  b5690fc25af6dc29e847e307697ad84788dfa08f
Drupal: lámání textu na odstavce – XSLT 2.0, TODO:…

diff -r b5690fc25af6 -r 623025c704c5 helpers/mimeXhtmlPart.xsl
--- a/helpers/mimeXhtmlPart.xsl	Fri Oct 14 00:45:06 2011 +0200
+++ b/helpers/mimeXhtmlPart.xsl	Fri Oct 14 12:41:14 2011 +0200
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
+<xsl:stylesheet version="2.0"
 	xmlns="http://www.w3.org/1999/xhtml"
 	xmlns:h="http://www.w3.org/1999/xhtml"
 	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
@@ -27,6 +27,7 @@
 		<html>
 			<head>
 				<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+				<meta http-equiv="X-NNTP-Generated" content="{fn:current-dateTime()}" />
 				<xsl:if test="$urlBase">
 					<base href="{$urlBase}"/>
 				</xsl:if>
@@ -67,6 +68,11 @@
 					a img {
 						border: none;
 					}
+					
+					/** TODO: smazat */
+					.mešuge {
+						background-color: #afa;
+					}
 				</style>
 			</head>
 			<body>
@@ -143,57 +149,57 @@
     
     <!-- 
     	Z neuzavřeného (nevalidně se vyskytujícího v body) textu uděláme odstavce.
-    	Bohužel nefunguje, když neuzavřený text obsahuje jiné značky (odkazy atd.),
-    	pak se totiž jedná o dva textové uzly (před značkou a za ní) a vzniknou dva odstavce.
     -->
 	<xsl:template match="h:body/text()">
-		<xsl:call-template name="makeParagraphs">
-			<xsl:with-param name="string" select="."/>
-		</xsl:call-template>
+		<xsl:call-template name="dělejOdstavce">
+			<xsl:with-param name="blokTextu" select="."/>
+		</xsl:call-template>		
 	</xsl:template>
-    <xsl:variable name="newLinePlaceholder" select="'ߜ'"/>
-    <xsl:template name="makeParagraphs">
-    	<xsl:param name="string" />
-    	<xsl:call-template name="makeParagraphsInternal">
-    		<!--
-    			Konec řádku převedeme na obskurní znak, 
-    			normalizací pročistíme bílé znaky → 
-    			dva obskurní znaky oddělené mezerou pak značí předěl mezi odstavci
-    		-->
-    		<xsl:with-param name="string" select="normalize-space(translate(., '&#10;', $newLinePlaceholder))"/>
-    	</xsl:call-template>
-    </xsl:template>
-	<xsl:template name="makeParagraphsInternal">
-		<xsl:param name="string" />
-		<xsl:if test="ends-with($string, $newLinePlaceholder)"><xsl:comment>končí na $newLinePlaceholder</xsl:comment> </xsl:if>
-		<!-- V XSLT 2.0 můžeme použít fn:tokenize -->
-		<xsl:param name="delimiter" select="concat($newLinePlaceholder, ' ', $newLinePlaceholder)"/>
-		<xsl:choose>
-			<xsl:when test="$delimiter and contains($string, $delimiter)">
-				<xsl:call-template name="makeParagraph">
-					<xsl:with-param name="string" select="substring-before($string, $delimiter)"></xsl:with-param>
-				</xsl:call-template>
-				<xsl:call-template name="makeParagraphsInternal">
-					<xsl:with-param name="string" select="substring-after($string, $delimiter)" />
-					<xsl:with-param name="delimiter" select="$delimiter" />
-				</xsl:call-template>
-			</xsl:when>
-			<xsl:otherwise>
-				<!--
-					Poslední odstavec → zkontrolovat, zda je za ním  
-				-->
-				<xsl:call-template name="makeParagraph">
-					<xsl:with-param name="string" select="$string"></xsl:with-param>
-				</xsl:call-template>
-			</xsl:otherwise>
-		</xsl:choose>
+	<xsl:template name="dělejOdstavce">
+		<xsl:param name="blokTextu"/>
+		<xsl:variable name="oddělovač" select="'\n\s+\n\s+'"/>
+		<xsl:for-each select="fn:tokenize(., $oddělovač)">
+			<xsl:if test="normalize-space(.)">
+				<p class="mešuge">
+					<xsl:value-of select="."/>
+					<!-- 
+						Toto je poslední odstavec bloku textu 
+						a blok nekončí dvěma konci řádku → 
+						může za ním následovat značka (např. odkaz nebo tučné písmo)
+						vnořená do téhož odstavce
+					-->
+					<xsl:if test="
+						position() = last() and
+						not(fn:matches($blokTextu, concat('.*', $oddělovač ,'$')))
+						">
+						
+						<xsl:variable name="n" select="$blokTextu/following-sibling::*[position() = 1]"/>
+						<xsl:variable name="nn" select="$n/name()"/>
+						<!--
+							Za blokem textu nenásleduje značka, která nemůže být uvnitř odstavce.
+						-->
+						<xsl:if test="not(
+								$nn = 'p' or
+								$nn = 'div' or								
+								$nn = 'h1' or								
+								$nn = 'h2' or								
+								$nn = 'h3' or								
+								$nn = 'h4' or								
+								$nn = 'h5' or								
+								$nn = 'h6' or								
+								$nn = 'pre' or								
+								$nn = 'table' or								
+								$nn = 'blockquote' or								
+								$nn = 'hr'								
+							)">
+							<xsl:apply-templates select="$n"/>
+							<xsl:apply-templates select="$n/following-sibling::text()[position() = 1]"/>
+						</xsl:if>						
+					</xsl:if>
+				</p>
+			</xsl:if>
+		</xsl:for-each>
 	</xsl:template>
-	<xsl:template name="makeParagraph">
-		<xsl:param name="string" />
-			<!-- prázdné textové uzly nás nezajímají – nechceme prázdné odstavce -->
-			<xsl:if test="normalize-space($string)">
-				<p class="mešuge"><xsl:value-of select="translate($string, $newLinePlaceholder, '&#10;')" /></p>				
-			</xsl:if>
-	</xsl:template>
-
+    
+	
 </xsl:stylesheet>