# 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(., ' ', $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, ' ')" /></p> - </xsl:if> - </xsl:template> - + + </xsl:stylesheet>