helpers/mimeXhtmlPart.xsl
author František Kučera <franta-hg@frantovo.cz>
Fri Oct 14 17:50:35 2011 +0200 (2011-10-14)
changeset 80 1f9e5757caf4
parent 79 245311d10726
child 81 b51ab80c7a9d
permissions -rwxr-xr-x
Drupal: XSLT odstavce – [not(navázat)] TODO:…
franta-hg@76
     1
<?xml version="1.0" encoding="UTF-8"?>
franta-hg@77
     2
<xsl:stylesheet version="2.0"
franta-hg@76
     3
	xmlns="http://www.w3.org/1999/xhtml"
franta-hg@76
     4
	xmlns:h="http://www.w3.org/1999/xhtml"
franta-hg@76
     5
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
franta-hg@76
     6
	xmlns:fn="http://www.w3.org/2005/xpath-functions"
franta-hg@76
     7
	xmlns:svg="http://www.w3.org/2000/svg"
franta-hg@76
     8
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
franta-hg@76
     9
	exclude-result-prefixes="fn h xs">
franta-hg@76
    10
	<xsl:output 
franta-hg@76
    11
		method="xml" 
franta-hg@76
    12
		indent="yes" 
franta-hg@76
    13
		encoding="UTF-8"		
franta-hg@76
    14
		doctype-public="-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" 
franta-hg@76
    15
		doctype-system="http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"/>
franta-hg@76
    16
	
franta-hg@76
    17
		
franta-hg@76
    18
	<xsl:param name="title"/>
franta-hg@76
    19
	<xsl:param name="isRoot"/>
franta-hg@76
    20
	<xsl:param name="urlBase"/>
franta-hg@76
    21
	<xsl:param name="wwwRead"/>
franta-hg@76
    22
	<xsl:param name="wwwPost"/>
franta-hg@76
    23
	
franta-hg@76
    24
	
franta-hg@76
    25
	<!-- Celý dokument -->
franta-hg@76
    26
	<xsl:template match="/">
franta-hg@76
    27
		<html>
franta-hg@76
    28
			<head>
franta-hg@76
    29
				<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
franta-hg@77
    30
				<meta http-equiv="X-NNTP-Generated" content="{fn:current-dateTime()}" />
franta-hg@76
    31
				<xsl:if test="$urlBase">
franta-hg@76
    32
					<base href="{$urlBase}"/>
franta-hg@76
    33
				</xsl:if>
franta-hg@76
    34
				<xsl:if test="$title">
franta-hg@76
    35
					<title><xsl:value-of select="$title"/></title>
franta-hg@76
    36
				</xsl:if>
franta-hg@76
    37
				<style type="text/css">
franta-hg@76
    38
					body {
franta-hg@76
    39
						font-family: sans-serif;
franta-hg@76
    40
						font-size: 16px;
franta-hg@76
    41
					}
franta-hg@76
    42
					
franta-hg@76
    43
					.wwwLinks {
franta-hg@76
    44
						border-top: 2px solid grey;
franta-hg@76
    45
						margin-top: 16px;
franta-hg@76
    46
						font-size: 66%;
franta-hg@76
    47
					}
franta-hg@76
    48
					
franta-hg@76
    49
					blockquote {
franta-hg@76
    50
						background-color: #eee;
franta-hg@76
    51
						font-style: italic;
franta-hg@76
    52
						padding: 2px 20px;
franta-hg@76
    53
						margin: 10px 32px;
franta-hg@76
    54
						border-left: 3px solid silver;
franta-hg@76
    55
					}
franta-hg@76
    56
					
franta-hg@76
    57
					pre {
franta-hg@76
    58
						background-color: #eee;
franta-hg@76
    59
						padding: 2px 20px;
franta-hg@76
    60
						margin: 10px 32px;
franta-hg@76
    61
						border-left: 3px solid #a00;
franta-hg@76
    62
					}
franta-hg@76
    63
					
franta-hg@76
    64
					img {
franta-hg@76
    65
						margin: 8px;
franta-hg@76
    66
					}
franta-hg@76
    67
					
franta-hg@76
    68
					a img {
franta-hg@76
    69
						border: none;
franta-hg@76
    70
					}
franta-hg@77
    71
					
franta-hg@77
    72
					/** TODO: smazat */
franta-hg@77
    73
					.mešuge {
franta-hg@77
    74
						background-color: #afa;
franta-hg@80
    75
						border: 1px solid #5f5;
franta-hg@77
    76
					}
franta-hg@76
    77
				</style>
franta-hg@76
    78
			</head>
franta-hg@76
    79
			<body>
franta-hg@76
    80
				<xsl:if test="$title and $isRoot">
franta-hg@76
    81
					<h1><xsl:value-of select="$title"/></h1>			
franta-hg@76
    82
				</xsl:if>
franta-hg@78
    83
				<xsl:call-template name="zpracujTělo">
franta-hg@78
    84
					<xsl:with-param name="prvek" select="h:html/h:body/node()[1]"/>
franta-hg@78
    85
				</xsl:call-template>
franta-hg@76
    86
				
franta-hg@76
    87
				<xsl:if test="$wwwRead or $wwwPost">
franta-hg@76
    88
					<div class="wwwLinks">
franta-hg@76
    89
						<p>Přístup přes síť www:</p>
franta-hg@76
    90
						<ul>
franta-hg@76
    91
							<xsl:if test="$wwwRead"><li><a href="{$wwwRead}">číst tento příspěvek</a></li></xsl:if>
franta-hg@76
    92
							<xsl:if test="$wwwPost"><li><a href="{$wwwPost}">odpovědět na tento příspěvek</a></li></xsl:if>
franta-hg@76
    93
						</ul>
franta-hg@76
    94
					</div>
franta-hg@76
    95
				</xsl:if>
franta-hg@76
    96
			</body>
franta-hg@76
    97
		</html>
franta-hg@76
    98
	</xsl:template>
franta-hg@76
    99
	
franta-hg@76
   100
	
franta-hg@76
   101
	<!-- Odkazy -->
franta-hg@76
   102
	<xsl:template match="h:a">
franta-hg@76
   103
		<a href="{@href}" title="{@title}"><xsl:apply-templates/></a>
franta-hg@76
   104
	</xsl:template>
franta-hg@76
   105
	
franta-hg@76
   106
	
franta-hg@76
   107
	<!-- Obrázky -->
franta-hg@76
   108
	<xsl:template match="h:img">
franta-hg@76
   109
		<img src="{@src}" alt="{@alt}" title="{@title}"><xsl:apply-templates/></img>
franta-hg@76
   110
	</xsl:template>
franta-hg@76
   111
	
franta-hg@76
   112
	<!-- Zkratky -->
franta-hg@76
   113
	<xsl:template match="h:abbr">
franta-hg@76
   114
		<abbr title="{@title}"><xsl:apply-templates/></abbr>
franta-hg@76
   115
	</xsl:template>
franta-hg@76
   116
	
franta-hg@76
   117
	
franta-hg@76
   118
	<!-- Další povolené značky – ostatní odfiltrujeme (zbude z nich jen text) -->
franta-hg@76
   119
	<xsl:template match="*">
franta-hg@76
   120
		<xsl:choose>		
franta-hg@76
   121
			<xsl:when test="
franta-hg@76
   122
				name() = 'h1' or
franta-hg@76
   123
				name() = 'h2' or
franta-hg@76
   124
				name() = 'h3' or
franta-hg@76
   125
				name() = 'h4' or
franta-hg@76
   126
				name() = 'h5' or
franta-hg@76
   127
				name() = 'h6' or
franta-hg@76
   128
				name() = 'p' or
franta-hg@76
   129
				name() = 'div' or
franta-hg@76
   130
				name() = 'br' or
franta-hg@76
   131
				name() = 'strong' or
franta-hg@76
   132
				name() = 'em' or
franta-hg@76
   133
				name() = 'sub' or
franta-hg@76
   134
				name() = 'sup' or
franta-hg@76
   135
				name() = 'del' or
franta-hg@76
   136
				name() = 'ul' or
franta-hg@76
   137
				name() = 'ol' or
franta-hg@76
   138
				name() = 'li' or
franta-hg@76
   139
				name() = 'pre' or
franta-hg@76
   140
				name() = 'code' or
franta-hg@76
   141
				name() = 'blockquote'">
franta-hg@76
   142
				<xsl:element name="{name()}">
franta-hg@76
   143
					<xsl:apply-templates/>
franta-hg@76
   144
				</xsl:element>
franta-hg@76
   145
			</xsl:when>
franta-hg@76
   146
			<xsl:otherwise>
franta-hg@76
   147
				<xsl:value-of select="."/>
franta-hg@76
   148
			</xsl:otherwise>
franta-hg@76
   149
		</xsl:choose>		
franta-hg@76
   150
    </xsl:template>
franta-hg@76
   151
    
franta-hg@76
   152
    <!-- 
franta-hg@76
   153
    	Z neuzavřeného (nevalidně se vyskytujícího v body) textu uděláme odstavce.
franta-hg@76
   154
    -->
franta-hg@78
   155
	<xsl:template name="zpracujTělo">
franta-hg@78
   156
		<xsl:param name="prvek"/>
franta-hg@80
   157
		<xsl:param name="vnořeno" select="false()"/>
franta-hg@78
   158
		<xsl:if test="$prvek">
franta-hg@79
   159
			<xsl:choose>
franta-hg@79
   160
				<xsl:when test="$prvek/self::text()">
franta-hg@79
   161
					<!--
franta-hg@79
   162
						Textový uzel → budeme dělat odstavce
franta-hg@79
   163
						(rekurzivně se opět zavolá šablona zpracujTělo)
franta-hg@79
   164
					-->
franta-hg@79
   165
					<xsl:call-template name="dělejOdstavceX">
franta-hg@79
   166
						<xsl:with-param name="blokTextu" select="$prvek"/>
franta-hg@80
   167
						<xsl:with-param name="vnořeno" select="$vnořeno"/>
franta-hg@79
   168
					</xsl:call-template>
franta-hg@80
   169
					<!-- TODO: někdy zpracujTělo dalšího prvku -->
franta-hg@80
   170
					
franta-hg@80
   171
					<xsl:variable name="navázat" as="xs:boolean">
franta-hg@80
   172
						<xsl:call-template name="navázat">
franta-hg@80
   173
							<xsl:with-param name="blokTextu" select="$prvek"/>
franta-hg@80
   174
						</xsl:call-template>
franta-hg@80
   175
					</xsl:variable>
franta-hg@80
   176
					
franta-hg@80
   177
					<xsl:if test="not($navázat)">[not(navázat)]</xsl:if>
franta-hg@80
   178
					
franta-hg@79
   179
				</xsl:when>
franta-hg@79
   180
				<xsl:otherwise>
franta-hg@79
   181
					<!--
franta-hg@79
   182
						Jiný uzel → aplikujeme obecné šablony
franta-hg@79
   183
						a zpracujeme následující uzel.
franta-hg@79
   184
					-->
franta-hg@79
   185
					<xsl:apply-templates select="$prvek"/>
franta-hg@79
   186
					<xsl:call-template name="zpracujTělo">
franta-hg@79
   187
						<xsl:with-param name="prvek" select="$prvek/following-sibling::node()[1]"/>
franta-hg@80
   188
						<xsl:with-param name="vnořeno" select="$vnořeno"/>
franta-hg@79
   189
					</xsl:call-template>
franta-hg@79
   190
				</xsl:otherwise>					
franta-hg@79
   191
			</xsl:choose>				
franta-hg@78
   192
		</xsl:if>
franta-hg@76
   193
	</xsl:template>
franta-hg@78
   194
	
franta-hg@80
   195
	<xsl:variable name="oddělovač" select="'\n\s+\n\s+'"/>
franta-hg@80
   196
	
franta-hg@80
   197
	<xsl:template name="navázat" as="xs:boolean">
franta-hg@80
   198
		<xsl:param name="blokTextu"/>
franta-hg@80
   199
		<xsl:variable name="dalšíUzel" select="$blokTextu/following-sibling::node()[1]"/>
franta-hg@80
   200
		<xsl:sequence select="
franta-hg@80
   201
			not(fn:matches($blokTextu, concat('.*', $oddělovač ,'$'))) and
franta-hg@80
   202
			$dalšíUzel and
franta-hg@80
   203
			not(
franta-hg@80
   204
				$dalšíUzel/name() = 'p' or
franta-hg@80
   205
				$dalšíUzel/name() = 'div' or								
franta-hg@80
   206
				$dalšíUzel/name() = 'h1' or								
franta-hg@80
   207
				$dalšíUzel/name() = 'h2' or								
franta-hg@80
   208
				$dalšíUzel/name() = 'h3' or								
franta-hg@80
   209
				$dalšíUzel/name() = 'h4' or								
franta-hg@80
   210
				$dalšíUzel/name() = 'h5' or								
franta-hg@80
   211
				$dalšíUzel/name() = 'h6' or								
franta-hg@80
   212
				$dalšíUzel/name() = 'pre' or								
franta-hg@80
   213
				$dalšíUzel/name() = 'table' or								
franta-hg@80
   214
				$dalšíUzel/name() = 'blockquote' or								
franta-hg@80
   215
				$dalšíUzel/name() = 'hr'								
franta-hg@80
   216
			)
franta-hg@80
   217
		"/>
franta-hg@80
   218
	</xsl:template>
franta-hg@80
   219
	
franta-hg@79
   220
	<xsl:template name="dělejOdstavceX">
franta-hg@79
   221
		<xsl:param name="blokTextu"/>
franta-hg@80
   222
		<xsl:param name="vnořeno" select="false()"/>
franta-hg@80
   223
		
franta-hg@79
   224
		<xsl:variable name="dalšíUzel" select="$blokTextu/following-sibling::node()[1]"/>
franta-hg@79
   225
		
franta-hg@80
   226
		<xsl:variable name="navázat" as="xs:boolean">
franta-hg@80
   227
			<xsl:call-template name="navázat">
franta-hg@80
   228
				<xsl:with-param name="blokTextu" select="$blokTextu"/>
franta-hg@80
   229
			</xsl:call-template>
franta-hg@80
   230
		</xsl:variable>
franta-hg@79
   231
		
franta-hg@79
   232
		<xsl:for-each select="fn:tokenize($blokTextu, $oddělovač)">
franta-hg@79
   233
			<xsl:if test="normalize-space(.)">
franta-hg@80
   234
				<xsl:choose>
franta-hg@80
   235
					<xsl:when test="$vnořeno">
franta-hg@80
   236
						<xsl:value-of select="."/>
franta-hg@80
   237
						<xsl:if test="$navázat and position() = last()">
franta-hg@80
   238
							<xsl:call-template name="zpracujTělo">
franta-hg@80
   239
								<xsl:with-param name="prvek" select="$dalšíUzel"/>
franta-hg@80
   240
							</xsl:call-template>
franta-hg@80
   241
						</xsl:if>
franta-hg@80
   242
					</xsl:when>
franta-hg@80
   243
					<xsl:otherwise>
franta-hg@80
   244
						<p class="mešuge">
franta-hg@80
   245
							<xsl:value-of select="."/>
franta-hg@80
   246
							<xsl:if test="$navázat and position() = last()">
franta-hg@80
   247
								<xsl:call-template name="zpracujTělo">
franta-hg@80
   248
									<xsl:with-param name="prvek" select="$dalšíUzel"/>
franta-hg@80
   249
									<xsl:with-param name="vnořeno" select="true()"/>
franta-hg@80
   250
								</xsl:call-template>
franta-hg@80
   251
							</xsl:if>
franta-hg@80
   252
						</p>
franta-hg@80
   253
					</xsl:otherwise>
franta-hg@80
   254
				</xsl:choose>
franta-hg@79
   255
			</xsl:if>
franta-hg@79
   256
		</xsl:for-each>
franta-hg@79
   257
		
franta-hg@79
   258
		<xsl:if test="not($navázat)">
franta-hg@79
   259
			<xsl:call-template name="zpracujTělo">
franta-hg@79
   260
				<xsl:with-param name="prvek" select="$dalšíUzel"/>
franta-hg@79
   261
			</xsl:call-template>
franta-hg@79
   262
		</xsl:if>
franta-hg@79
   263
	</xsl:template>
franta-hg@79
   264
	
franta-hg@79
   265
	
franta-hg@79
   266
	
franta-hg@79
   267
	
franta-hg@79
   268
	
franta-hg@79
   269
	
franta-hg@77
   270
	<xsl:template name="dělejOdstavce">
franta-hg@77
   271
		<xsl:param name="blokTextu"/>
franta-hg@77
   272
		<xsl:variable name="oddělovač" select="'\n\s+\n\s+'"/>
franta-hg@77
   273
		<xsl:for-each select="fn:tokenize(., $oddělovač)">
franta-hg@77
   274
			<xsl:if test="normalize-space(.)">
franta-hg@77
   275
				<p class="mešuge">
franta-hg@77
   276
					<xsl:value-of select="."/>
franta-hg@77
   277
					<!-- 
franta-hg@77
   278
						Toto je poslední odstavec bloku textu 
franta-hg@77
   279
						a blok nekončí dvěma konci řádku → 
franta-hg@77
   280
						může za ním následovat značka (např. odkaz nebo tučné písmo)
franta-hg@77
   281
						vnořená do téhož odstavce
franta-hg@77
   282
					-->
franta-hg@77
   283
					<xsl:if test="
franta-hg@77
   284
						position() = last() and
franta-hg@77
   285
						not(fn:matches($blokTextu, concat('.*', $oddělovač ,'$')))
franta-hg@77
   286
						">
franta-hg@79
   287
						<xsl:variable name="n" select="$blokTextu/following-sibling::*[1]"/>
franta-hg@77
   288
						<xsl:variable name="nn" select="$n/name()"/>
franta-hg@77
   289
						<!--
franta-hg@77
   290
							Za blokem textu nenásleduje značka, která nemůže být uvnitř odstavce.
franta-hg@77
   291
						-->
franta-hg@77
   292
						<xsl:if test="not(
franta-hg@77
   293
								$nn = 'p' or
franta-hg@77
   294
								$nn = 'div' or								
franta-hg@77
   295
								$nn = 'h1' or								
franta-hg@77
   296
								$nn = 'h2' or								
franta-hg@77
   297
								$nn = 'h3' or								
franta-hg@77
   298
								$nn = 'h4' or								
franta-hg@77
   299
								$nn = 'h5' or								
franta-hg@77
   300
								$nn = 'h6' or								
franta-hg@77
   301
								$nn = 'pre' or								
franta-hg@77
   302
								$nn = 'table' or								
franta-hg@77
   303
								$nn = 'blockquote' or								
franta-hg@77
   304
								$nn = 'hr'								
franta-hg@77
   305
							)">
franta-hg@77
   306
							<xsl:apply-templates select="$n"/>
franta-hg@79
   307
						</xsl:if>
franta-hg@79
   308
						
franta-hg@79
   309
						<xsl:call-template name="zpracujTělo">
franta-hg@79
   310
							<xsl:with-param name="prvek" select="$blokTextu/following-sibling::node()[1]"/>
franta-hg@79
   311
						</xsl:call-template>
franta-hg@79
   312
				
franta-hg@77
   313
					</xsl:if>
franta-hg@79
   314
				</p>				
franta-hg@77
   315
			</xsl:if>
franta-hg@77
   316
		</xsl:for-each>
franta-hg@76
   317
	</xsl:template>
franta-hg@77
   318
    
franta-hg@77
   319
	
franta-hg@76
   320
</xsl:stylesheet>