java/Postak/src/cz/frantovo/postak/odchozíEmailText.xsl
author František Kučera <franta-hg@frantovo.cz>
Tue Oct 15 23:16:04 2013 +0200 (2013-10-15)
changeset 21 798e7455da4e
parent 17 9cb46ca7e26c
permissions -rw-r--r--
XSLT převod XHTML na prostý text: mailto odkazy nebudou obsahovat duplicitně adresu
franta-hg@17
     1
<?xml version="1.0" encoding="UTF-8"?>
franta-hg@17
     2
<!--
franta-hg@17
     3
	Převzato z projektu hellDesk.
franta-hg@17
     4
-->
franta-hg@17
     5
<xsl:stylesheet version="1.0"
franta-hg@17
     6
				xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
franta-hg@17
     7
				xmlns:fn="http://www.w3.org/2005/xpath-functions"
franta-hg@17
     8
				xmlns:str="http://xsltsl.org/string"
franta-hg@17
     9
				xmlns:h="http://www.w3.org/1999/xhtml">
franta-hg@17
    10
	<xsl:output method="text" encoding="UTF-8"/>
franta-hg@17
    11
	<xsl:strip-space elements="*"/>
franta-hg@17
    12
franta-hg@17
    13
	<xsl:output method="text" encoding="UTF-8"/>
franta-hg@17
    14
	<xsl:strip-space elements="*"/>
franta-hg@17
    15
franta-hg@17
    16
	<xsl:variable name="urlBase" select="/h:html/h:head/h:base/@href"/>
franta-hg@17
    17
franta-hg@17
    18
franta-hg@17
    19
	<!-- Celý dokument -->
franta-hg@17
    20
	<xsl:template match="/">
franta-hg@17
    21
		<xsl:apply-templates select="h:html/h:body"/>
franta-hg@17
    22
	</xsl:template>
franta-hg@17
    23
franta-hg@17
    24
franta-hg@17
    25
	<xsl:template match="h:h1">
franta-hg@17
    26
		<xsl:value-of select="text()"/>
franta-hg@17
    27
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    28
		<xsl:call-template name="str:generate-string">
franta-hg@17
    29
			<xsl:with-param name="text" select="'='"/>
franta-hg@17
    30
			<xsl:with-param name="count" select="string-length(.)"/>
franta-hg@17
    31
		</xsl:call-template>
franta-hg@17
    32
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    33
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    34
	</xsl:template>
franta-hg@17
    35
franta-hg@17
    36
franta-hg@17
    37
	<xsl:template match="h:h2">
franta-hg@17
    38
		<xsl:value-of select="text()"/>
franta-hg@17
    39
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    40
		<xsl:call-template name="str:generate-string">
franta-hg@17
    41
			<xsl:with-param name="text" select="'-'"/>
franta-hg@17
    42
			<xsl:with-param name="count" select="string-length(.)"/>
franta-hg@17
    43
		</xsl:call-template>
franta-hg@17
    44
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    45
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    46
	</xsl:template>
franta-hg@17
    47
franta-hg@17
    48
franta-hg@17
    49
	<xsl:template match="h:h3">
franta-hg@17
    50
		<xsl:text>### </xsl:text>
franta-hg@17
    51
		<xsl:value-of select="text()"/>
franta-hg@17
    52
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    53
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    54
	</xsl:template>
franta-hg@17
    55
franta-hg@17
    56
franta-hg@17
    57
	<xsl:template match="h:h4">
franta-hg@17
    58
		<xsl:text>#### </xsl:text>
franta-hg@17
    59
		<xsl:value-of select="text()"/>
franta-hg@17
    60
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    61
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    62
	</xsl:template>
franta-hg@17
    63
franta-hg@17
    64
franta-hg@17
    65
	<xsl:template match="h:h5">
franta-hg@17
    66
		<xsl:text>##### </xsl:text>
franta-hg@17
    67
		<xsl:value-of select="text()"/>
franta-hg@17
    68
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    69
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    70
	</xsl:template>
franta-hg@17
    71
franta-hg@17
    72
franta-hg@17
    73
	<xsl:template match="h:h6">
franta-hg@17
    74
		<xsl:text>###### </xsl:text>
franta-hg@17
    75
		<xsl:value-of select="text()"/>
franta-hg@17
    76
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    77
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    78
	</xsl:template>
franta-hg@17
    79
franta-hg@17
    80
franta-hg@17
    81
	<xsl:template match="h:p">
franta-hg@17
    82
		<xsl:apply-templates/>
franta-hg@17
    83
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    84
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    85
	</xsl:template>
franta-hg@17
    86
franta-hg@17
    87
	
franta-hg@17
    88
	<xsl:template match="h:blockquote/h:p">
franta-hg@17
    89
		<xsl:text>&gt; </xsl:text>
franta-hg@17
    90
		<xsl:apply-templates/>
franta-hg@17
    91
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    92
		<xsl:text>&#10;</xsl:text>
franta-hg@17
    93
	</xsl:template>
franta-hg@17
    94
franta-hg@17
    95
franta-hg@17
    96
	<xsl:template match="h:cite[not(starts-with(., '„') or starts-with(., '‚'))]">
franta-hg@17
    97
		<xsl:text>„</xsl:text>
franta-hg@17
    98
		<xsl:apply-templates/>
franta-hg@17
    99
		<xsl:text>“</xsl:text>
franta-hg@17
   100
	</xsl:template>	
franta-hg@17
   101
franta-hg@17
   102
franta-hg@17
   103
	<xsl:template match="h:a">
franta-hg@21
   104
		<xsl:if test="not(text() = @href or concat('mailto:', text()) = @href)">
franta-hg@17
   105
			<xsl:text>'</xsl:text>
franta-hg@17
   106
			<xsl:apply-templates select="node()"/>
franta-hg@17
   107
			<xsl:text>' </xsl:text>
franta-hg@17
   108
		</xsl:if>
franta-hg@17
   109
		<xsl:text>&lt;</xsl:text>
franta-hg@17
   110
		<xsl:choose>
franta-hg@17
   111
			<xsl:when test="starts-with(@href, 'http:') or starts-with(@href, 'https:') or starts-with(@href, 'ftp:')">
franta-hg@17
   112
				<xsl:value-of select="@href"/>
franta-hg@17
   113
			</xsl:when>
franta-hg@17
   114
			<xsl:when test="starts-with(@href, 'mailto:')">
franta-hg@17
   115
				<xsl:value-of select="substring-after(@href, 'mailto:')"/>
franta-hg@17
   116
			</xsl:when>
franta-hg@17
   117
			<xsl:otherwise>
franta-hg@17
   118
				<xsl:choose>
franta-hg@17
   119
					<!-- TODO: $urlBase by nemělo končit lomítkem -->
franta-hg@17
   120
					<xsl:when test="starts-with(@href, '/')">
franta-hg@17
   121
						<xsl:value-of select="concat($urlBase, @href)"/>
franta-hg@17
   122
					</xsl:when>
franta-hg@17
   123
					<xsl:otherwise>
franta-hg@17
   124
						<xsl:value-of select="concat($urlBase, '/', @href)"/>
franta-hg@17
   125
					</xsl:otherwise>
franta-hg@17
   126
				</xsl:choose>
franta-hg@17
   127
			</xsl:otherwise>
franta-hg@17
   128
		</xsl:choose>
franta-hg@17
   129
		<xsl:text>&gt;</xsl:text>
franta-hg@17
   130
		<xsl:if test="normalize-space(@title)">
franta-hg@17
   131
			<xsl:text> (</xsl:text>
franta-hg@17
   132
			<xsl:value-of select="@title"/>
franta-hg@17
   133
			<xsl:text>)</xsl:text>
franta-hg@17
   134
		</xsl:if>
franta-hg@17
   135
	</xsl:template>
franta-hg@17
   136
franta-hg@17
   137
franta-hg@17
   138
	<xsl:template match="h:img">
franta-hg@17
   139
		<xsl:text>Obrázek: </xsl:text>
franta-hg@17
   140
		<xsl:value-of select="@src"/>
franta-hg@17
   141
		<!-- TODO: relativní odkazy -->
franta-hg@17
   142
	</xsl:template>
franta-hg@17
   143
franta-hg@17
   144
franta-hg@17
   145
	<xsl:template match="h:strong|h:b">
franta-hg@17
   146
		<xsl:text>**</xsl:text>
franta-hg@17
   147
		<xsl:apply-templates/>
franta-hg@17
   148
		<xsl:text>**</xsl:text>
franta-hg@17
   149
	</xsl:template>
franta-hg@17
   150
franta-hg@17
   151
franta-hg@17
   152
	<xsl:template match="h:em|h:i">
franta-hg@17
   153
		<xsl:text>*</xsl:text>
franta-hg@17
   154
		<xsl:apply-templates/>
franta-hg@17
   155
		<xsl:text>*</xsl:text>
franta-hg@17
   156
	</xsl:template>
franta-hg@17
   157
franta-hg@17
   158
franta-hg@17
   159
	<xsl:template match="h:abbr[@title]">
franta-hg@17
   160
		<xsl:apply-templates/>
franta-hg@17
   161
		<xsl:text> (</xsl:text>
franta-hg@17
   162
		<xsl:value-of select="@title"/>
franta-hg@17
   163
		<xsl:text>)</xsl:text>
franta-hg@17
   164
	</xsl:template>
franta-hg@17
   165
franta-hg@17
   166
franta-hg@17
   167
	<xsl:template match="h:pre">
franta-hg@17
   168
		<xsl:text>--------------------------------</xsl:text>
franta-hg@17
   169
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   170
		<xsl:apply-templates/>
franta-hg@17
   171
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   172
		<xsl:text>--------------------------------</xsl:text>
franta-hg@17
   173
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   174
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   175
	</xsl:template>
franta-hg@17
   176
franta-hg@17
   177
franta-hg@17
   178
	<xsl:template match="h:code">
franta-hg@17
   179
		<xsl:text>`</xsl:text>
franta-hg@17
   180
		<xsl:apply-templates/>
franta-hg@17
   181
		<xsl:text>`</xsl:text>
franta-hg@17
   182
	</xsl:template>
franta-hg@17
   183
franta-hg@17
   184
franta-hg@17
   185
	<xsl:template match="h:hr">
franta-hg@17
   186
		<xsl:text>----------------------------------------------------------------</xsl:text>
franta-hg@17
   187
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   188
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   189
	</xsl:template>
franta-hg@17
   190
franta-hg@17
   191
franta-hg@17
   192
	<xsl:template match="h:br">
franta-hg@17
   193
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   194
	</xsl:template>	
franta-hg@17
   195
franta-hg@17
   196
franta-hg@17
   197
	<xsl:template match="h:ol|h:ul">
franta-hg@17
   198
		<xsl:variable name="úroveň" select="count(ancestor::h:li)"/>
franta-hg@17
   199
		<xsl:variable name="odsazení">
franta-hg@17
   200
			<!-- položky na nejvyšší úrovni odsazené jednou mezerou -->
franta-hg@17
   201
			<xsl:value-of select="' '"/>
franta-hg@17
   202
			<xsl:call-template name="str:generate-string">
franta-hg@17
   203
				<xsl:with-param name="text" select="'  '"/>
franta-hg@17
   204
				<!-- položky na druhé a vyšší úrovni odsazené vždy dvěma dalšími mezerami -->
franta-hg@17
   205
				<xsl:with-param name="count" select="$úroveň - 1"/>
franta-hg@17
   206
			</xsl:call-template>
franta-hg@17
   207
		</xsl:variable>
franta-hg@17
   208
franta-hg@17
   209
		<xsl:if test="$úroveň &gt; 0">
franta-hg@17
   210
			<xsl:text>&#10;</xsl:text>
franta-hg@17
   211
		</xsl:if>
franta-hg@17
   212
franta-hg@17
   213
		<xsl:for-each select="h:li">
franta-hg@17
   214
			<xsl:if test="parent::h:ol">
franta-hg@17
   215
				<xsl:value-of select="concat($odsazení, position(), ') ')"/>
franta-hg@17
   216
			</xsl:if>
franta-hg@17
   217
			<xsl:if test="parent::h:ul">
franta-hg@17
   218
				<xsl:value-of select="concat($odsazení, '- ')"/>
franta-hg@17
   219
			</xsl:if>
franta-hg@17
   220
			<xsl:apply-templates/>
franta-hg@17
   221
			<xsl:if test="$úroveň = 0 or not(position() = last())">
franta-hg@17
   222
				<xsl:text>&#10;</xsl:text>
franta-hg@17
   223
			</xsl:if>
franta-hg@17
   224
		</xsl:for-each>
franta-hg@17
   225
		
franta-hg@17
   226
		<xsl:if test="$úroveň = 0">
franta-hg@17
   227
			<xsl:text>&#10;</xsl:text>
franta-hg@17
   228
		</xsl:if>
franta-hg@17
   229
	</xsl:template>
franta-hg@17
   230
franta-hg@17
   231
franta-hg@17
   232
	<xsl:template match="text()[not(parent::h:pre)]">
franta-hg@17
   233
		<xsl:if test="(starts-with(., ' ') or starts-with(., '&#10;')) and preceding-sibling::node() and not(preceding-sibling::h:br)">
franta-hg@17
   234
			<xsl:text> </xsl:text>
franta-hg@17
   235
		</xsl:if>
franta-hg@17
   236
		<xsl:value-of select="normalize-space(.)"/>
franta-hg@17
   237
		<xsl:variable name="posledníZnak" select="substring(., string-length(.))"/>
franta-hg@17
   238
		<!-- TODO: tabulátor? -->
franta-hg@17
   239
		<xsl:if test="($posledníZnak = ' ' or $posledníZnak = '&#10;') and following-sibling::node()">
franta-hg@17
   240
			<xsl:text> </xsl:text>
franta-hg@17
   241
		</xsl:if>
franta-hg@17
   242
	</xsl:template>
franta-hg@17
   243
	
franta-hg@17
   244
	
franta-hg@17
   245
	<xsl:template match="h:div[@class = 'patička']">
franta-hg@17
   246
		<xsl:text>-- </xsl:text>
franta-hg@17
   247
		<xsl:text>&#10;</xsl:text>
franta-hg@17
   248
		<xsl:apply-templates/>
franta-hg@17
   249
	</xsl:template>
franta-hg@17
   250
	
franta-hg@17
   251
franta-hg@17
   252
	<!--
franta-hg@17
   253
		Převzato z:
franta-hg@17
   254
		http://xsltsl.sourceforge.net/string.html#template.str:generate-string
franta-hg@17
   255
	-->
franta-hg@17
   256
	<xsl:template name="str:generate-string">
franta-hg@17
   257
		<xsl:param name="text"/>
franta-hg@17
   258
		<xsl:param name="count"/>
franta-hg@17
   259
franta-hg@17
   260
		<xsl:choose>
franta-hg@17
   261
			<xsl:when test="string-length($text) = 0 or $count &lt;= 0"/>
franta-hg@17
   262
			<xsl:otherwise>
franta-hg@17
   263
				<xsl:value-of select="$text"/>
franta-hg@17
   264
				<xsl:call-template name="str:generate-string">
franta-hg@17
   265
					<xsl:with-param name="text" select="$text"/>
franta-hg@17
   266
					<xsl:with-param name="count" select="$count - 1"/>
franta-hg@17
   267
				</xsl:call-template>
franta-hg@17
   268
			</xsl:otherwise>
franta-hg@17
   269
		</xsl:choose>
franta-hg@17
   270
	</xsl:template>
franta-hg@17
   271
franta-hg@17
   272
franta-hg@17
   273
</xsl:stylesheet>
franta-hg@17
   274