Import MMD 2.0b5
[multimarkdown] / MultiMarkdownXSLTMathML / tokens.xsl
1 <?xml version='1.0' encoding="UTF-8"?>\r
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"\r
3                 xmlns:m="http://www.w3.org/1998/Math/MathML"\r
4                 version='1.0'>\r
5                 \r
6 <!-- ====================================================================== -->\r
7 <!-- $Id: tokens.xsl 282 2006-11-19 16:28:39Z fletcher $\r
8      This file is part of the XSLT MathML Library distribution.\r
9      See ./README or http://www.raleigh.ru/MathML/mmltex for\r
10      copyright and other information\r
11      Modified by Fletcher T. Penney for MultiMarkdown Version 2.0.a             -->\r
12 <!-- ====================================================================== -->\r
13 \r
14 <xsl:template match="m:mi|m:mn|m:mo|m:mtext|m:ms">\r
15         <xsl:call-template name="CommonTokenAtr"/>\r
16 </xsl:template>\r
17 \r
18 <!-- 3.2.9 mglyph -->\r
19 <xsl:template match="m:mglyph">\r
20         <xsl:text>\textcolor{red}{</xsl:text>\r
21         <xsl:value-of select="@alt"/>\r
22         <xsl:text>}</xsl:text>\r
23 </xsl:template>\r
24 \r
25 <xsl:template name="mi">\r
26         <xsl:choose>\r
27                 <xsl:when test="string-length(normalize-space(.))>1 and not(@mathvariant)">\r
28                         <xsl:text>\mathrm{</xsl:text>\r
29                                 <xsl:apply-templates/>\r
30                         <xsl:text>}</xsl:text>\r
31                 </xsl:when>\r
32                 <xsl:otherwise>\r
33                         <xsl:apply-templates/>\r
34                 </xsl:otherwise>\r
35         </xsl:choose>\r
36 </xsl:template>\r
37 \r
38 <xsl:template name="mn">\r
39         <xsl:choose>\r
40                 <xsl:when test="string(number(.))='NaN' and not(@mathvariant)">\r
41                         <xsl:text>\mathrm{</xsl:text>\r
42                                 <xsl:apply-templates/>\r
43                         <xsl:text>}</xsl:text>\r
44                 </xsl:when>\r
45                 <xsl:otherwise>\r
46                         <xsl:apply-templates/>\r
47                 </xsl:otherwise>\r
48         </xsl:choose>\r
49 </xsl:template>\r
50 \r
51 <!-- 3.2.5 Math Operator -->\r
52 <xsl:template name="mo">\r
53 <xsl:if test="translate(normalize-space(.),'()[]}|','{{{{{{')='{'">\r
54                 <xsl:choose>\r
55         <xsl:when test="not(@stretchy='false') and count(preceding-sibling::m:mo[translate(normalize-space(.),'()[]}|','{{{{{{')='{'])mod 2=0 and following-sibling::m:mo[1][not(@stretchy='false')][translate(normalize-space(.),'()[]}|','{{{{{{')='{']">\r
56                         <xsl:text>\left</xsl:text>\r
57                 </xsl:when>\r
58                 <xsl:when test="not(@stretchy='false') and count(preceding-sibling::m:mo[translate(normalize-space(.),'()[]}|','{{{{{{')='{'])mod 2=1 and preceding-sibling::m:mo[1][not(@stretchy='false')][translate(normalize-space(.),'()[]}|','{{{{{{')='{']">\r
59                         <xsl:text>\right</xsl:text>\r
60                 </xsl:when>\r
61         </xsl:choose>\r
62 </xsl:if>\r
63 <xsl:apply-templates/>\r
64 </xsl:template>\r
65 \r
66 <xsl:template name="mtext">\r
67         <xsl:variable name="content">\r
68                 <xsl:call-template name="replaceMtextEntities">\r
69                         <xsl:with-param name="content" select="normalize-space(.)"/>\r
70                 </xsl:call-template>\r
71         </xsl:variable>\r
72         <xsl:text>\text{</xsl:text>\r
73         <xsl:value-of select="$content"/>\r
74         <xsl:text>}</xsl:text>\r
75 </xsl:template>\r
76 \r
77 <xsl:template match="m:mspace">\r
78         <xsl:text>\phantom{\rule</xsl:text>\r
79         <xsl:if test="@depth">\r
80                 <xsl:text>[-</xsl:text>\r
81                 <xsl:value-of select="@depth"/>\r
82                 <xsl:text>]</xsl:text>\r
83         </xsl:if>\r
84         <xsl:text>{</xsl:text>\r
85         <xsl:if test="not(@width)">\r
86                 <xsl:text>0ex</xsl:text>\r
87         </xsl:if>\r
88         <xsl:value-of select="@width"/>\r
89         <xsl:text>}{</xsl:text>\r
90         <xsl:if test="not(@height)">\r
91                 <xsl:text>0ex</xsl:text>\r
92         </xsl:if>\r
93         <xsl:value-of select="@height"/>\r
94         <xsl:text>}}</xsl:text>\r
95 </xsl:template>\r
96 \r
97 <xsl:template name="ms">\r
98         <xsl:choose>\r
99                 <xsl:when test="@lquote"><xsl:value-of select="@lquote"/></xsl:when>\r
100                 <xsl:otherwise><xsl:text>''</xsl:text></xsl:otherwise>\r
101         </xsl:choose><xsl:apply-templates/><xsl:choose>\r
102                 <xsl:when test="@rquote"><xsl:value-of select="@rquote"/></xsl:when>\r
103                 <xsl:otherwise><xsl:text>''</xsl:text></xsl:otherwise>\r
104         </xsl:choose>\r
105 </xsl:template>\r
106 \r
107 <xsl:template name="CommonTokenAtr">\r
108         <xsl:if test="@mathbackground">\r
109                 <xsl:text>\colorbox[rgb]{</xsl:text>\r
110                 <xsl:call-template name="color">\r
111                         <xsl:with-param name="color" select="@mathbackground"/>\r
112                 </xsl:call-template>\r
113                 <xsl:text>}{$</xsl:text>\r
114         </xsl:if>\r
115         <xsl:if test="@color[not(@mathcolor)] or @mathcolor"> <!-- Note: @color is deprecated in MathML 2.0 -->\r
116                 <xsl:text>\textcolor[rgb]{</xsl:text>\r
117                 <xsl:call-template name="color">\r
118                         <xsl:with-param name="color" select="@color|@mathcolor"/>\r
119                 </xsl:call-template>\r
120                 <xsl:text>}{</xsl:text>\r
121         </xsl:if>\r
122         <xsl:if test="@mathvariant">\r
123                 <xsl:choose>\r
124                         <xsl:when test="@mathvariant='normal'">\r
125                                 <xsl:text>\mathrm{</xsl:text>\r
126                         </xsl:when>\r
127                         <xsl:when test="@mathvariant='bold'">\r
128                                 <xsl:text>\mathbf{</xsl:text>\r
129                         </xsl:when>\r
130                         <xsl:when test="@mathvariant='italic'">\r
131                                 <xsl:text>\mathit{</xsl:text>\r
132                         </xsl:when>\r
133                         <xsl:when test="@mathvariant='bold-italic'"> <!-- not supported -->\r
134                                 <xsl:text>\mathit{</xsl:text>\r
135                                 <xsl:message>The value bold-italic for mathvariant is not supported</xsl:message>\r
136                         </xsl:when>\r
137                         <xsl:when test="@mathvariant='double-struck'">  <!-- Required amsfonts -->\r
138                                 <xsl:text>\mathbb{</xsl:text>\r
139                         </xsl:when>\r
140                         <xsl:when test="@mathvariant='bold-fraktur'"> <!-- not supported -->\r
141                                 <xsl:text>\mathfrak{</xsl:text>\r
142                                 <xsl:message>The value bold-fraktur for mathvariant is not supported</xsl:message>\r
143                         </xsl:when>\r
144                         <xsl:when test="@mathvariant='script'">\r
145                                 <xsl:text>\mathcal{</xsl:text>\r
146                         </xsl:when>\r
147                         <xsl:when test="@mathvariant='bold-script'"> <!-- not supported -->\r
148                                 <xsl:text>\mathcal{</xsl:text>\r
149                                 <xsl:message>The value bold-script for mathvariant is not supported</xsl:message>\r
150                         </xsl:when>\r
151                         <xsl:when test="@mathvariant='fraktur'">        <!-- Required amsfonts -->\r
152                                 <xsl:text>\mathfrak{</xsl:text>\r
153                         </xsl:when>\r
154                         <xsl:when test="@mathvariant='sans-serif'">\r
155                                 <xsl:text>\mathsf{</xsl:text>\r
156                         </xsl:when>\r
157                         <xsl:when test="@mathvariant='bold-sans-serif'"> <!-- not supported -->\r
158                                 <xsl:text>\mathsf{</xsl:text>\r
159                                 <xsl:message>The value bold-sans-serif for mathvariant is not supported</xsl:message>\r
160                         </xsl:when>\r
161                         <xsl:when test="@mathvariant='sans-serif-italic'"> <!-- not supported -->\r
162                                 <xsl:text>\mathsf{</xsl:text>\r
163                                 <xsl:message>The value sans-serif-italic for mathvariant is not supported</xsl:message>\r
164                         </xsl:when>\r
165                         <xsl:when test="@mathvariant='sans-serif-bold-italic'"> <!-- not supported -->\r
166                                 <xsl:text>\mathsf{</xsl:text>\r
167                                 <xsl:message>The value sans-serif-bold-italic for mathvariant is not supported</xsl:message>\r
168                         </xsl:when>\r
169                         <xsl:when test="@mathvariant='monospace'">\r
170                                 <xsl:text>\mathtt{</xsl:text>\r
171                         </xsl:when>\r
172                         <xsl:otherwise>\r
173                                 <xsl:text>{</xsl:text>\r
174                                 <xsl:message>Error at mathvariant attribute</xsl:message>\r
175                         </xsl:otherwise>\r
176                 </xsl:choose>\r
177         </xsl:if>\r
178         <xsl:call-template name="selectTemplate"/>\r
179         <xsl:if test="@mathvariant">\r
180                 <xsl:text>}</xsl:text>\r
181         </xsl:if>\r
182         <xsl:if test="@color or @mathcolor">\r
183                 <xsl:text>}</xsl:text>\r
184         </xsl:if>\r
185         <xsl:if test="@mathbackground">\r
186                 <xsl:text>$}</xsl:text>\r
187         </xsl:if>\r
188 </xsl:template>\r
189 \r
190 <xsl:template name="selectTemplate">\r
191         <xsl:choose>\r
192                 <xsl:when test="local-name(.)='mi'">\r
193                         <xsl:call-template name="mi"/>\r
194                 </xsl:when>\r
195                 <xsl:when test="local-name(.)='mn'">\r
196                         <xsl:call-template name="mn"/>\r
197                 </xsl:when>\r
198                 <xsl:when test="local-name(.)='mo'">\r
199                         <xsl:call-template name="mo"/>\r
200                 </xsl:when>\r
201                 <xsl:when test="local-name(.)='mtext'">\r
202                         <xsl:call-template name="mtext"/>\r
203                 </xsl:when>\r
204                 <xsl:when test="local-name(.)='ms'">\r
205                         <xsl:call-template name="ms"/>\r
206                 </xsl:when>\r
207         </xsl:choose>\r
208 </xsl:template>\r
209 \r
210 <xsl:template name="color">\r
211 <!-- NB: Variables colora and valueColor{n} only for Sablotron -->\r
212         <xsl:param name="color"/>\r
213         <xsl:variable name="colora" select="translate($color,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')"/>\r
214         <xsl:choose>\r
215         <xsl:when test="starts-with($colora,'#') and string-length($colora)=4">\r
216                 <xsl:variable name="valueColor">\r
217                         <xsl:call-template name="Hex2Decimal">\r
218                                 <xsl:with-param name="arg" select="substring($colora,2,1)"/>\r
219                         </xsl:call-template>\r
220                 </xsl:variable>\r
221                 <xsl:value-of select="$valueColor div 15"/><xsl:text>,</xsl:text>\r
222                 <xsl:variable name="valueColor1">\r
223                         <xsl:call-template name="Hex2Decimal">\r
224                                 <xsl:with-param name="arg" select="substring($colora,3,1)"/>\r
225                         </xsl:call-template>\r
226                 </xsl:variable>\r
227                 <xsl:value-of select="$valueColor1 div 15"/><xsl:text>,</xsl:text>\r
228                 <xsl:variable name="valueColor2">\r
229                         <xsl:call-template name="Hex2Decimal">\r
230                                 <xsl:with-param name="arg" select="substring($colora,4,1)"/>\r
231                         </xsl:call-template>\r
232                 </xsl:variable>\r
233                 <xsl:value-of select="$valueColor2 div 15"/>\r
234         </xsl:when>\r
235         <xsl:when test="starts-with($colora,'#') and string-length($colora)=7">\r
236                 <xsl:variable name="valueColor1">\r
237                         <xsl:call-template name="Hex2Decimal">\r
238                                 <xsl:with-param name="arg" select="substring($colora,2,1)"/>\r
239                         </xsl:call-template>\r
240                 </xsl:variable>\r
241                 <xsl:variable name="valueColor2">\r
242                         <xsl:call-template name="Hex2Decimal">\r
243                                 <xsl:with-param name="arg" select="substring($colora,3,1)"/>\r
244                         </xsl:call-template>\r
245                 </xsl:variable>\r
246                 <xsl:value-of select="($valueColor1*16 + $valueColor2) div 255"/><xsl:text>,</xsl:text>\r
247                 <xsl:variable name="valueColor1a">\r
248                         <xsl:call-template name="Hex2Decimal">\r
249                                 <xsl:with-param name="arg" select="substring($colora,4,1)"/>\r
250                         </xsl:call-template>\r
251                 </xsl:variable>\r
252                 <xsl:variable name="valueColor2a">\r
253                         <xsl:call-template name="Hex2Decimal">\r
254                                 <xsl:with-param name="arg" select="substring($colora,5,1)"/>\r
255                         </xsl:call-template>\r
256                 </xsl:variable>\r
257                 <xsl:value-of select="($valueColor1a*16 + $valueColor2a) div 255"/><xsl:text>,</xsl:text>\r
258                 <xsl:variable name="valueColor1b">\r
259                         <xsl:call-template name="Hex2Decimal">\r
260                                 <xsl:with-param name="arg" select="substring($colora,6,1)"/>\r
261                         </xsl:call-template>\r
262                 </xsl:variable>\r
263                 <xsl:variable name="valueColor2b">\r
264                         <xsl:call-template name="Hex2Decimal">\r
265                                 <xsl:with-param name="arg" select="substring($colora,7,1)"/>\r
266                         </xsl:call-template>\r
267                 </xsl:variable>\r
268                 <xsl:value-of select="($valueColor1b*16 + $valueColor2b) div 255"/>\r
269         </xsl:when>\r
270 <!-- ======================= if color specifed as an html-color-name ========================================== -->\r
271         <xsl:when test="$colora='aqua'"><xsl:text>0,1,1</xsl:text></xsl:when>\r
272         <xsl:when test="$colora='black'"><xsl:text>0,0,0</xsl:text></xsl:when>\r
273         <xsl:when test="$colora='blue'"><xsl:text>0,0,1</xsl:text></xsl:when>\r
274         <xsl:when test="$colora='fuchsia'"><xsl:text>1,0,1</xsl:text></xsl:when>\r
275         <xsl:when test="$colora='gray'"><xsl:text>.5,.5,.5</xsl:text></xsl:when>\r
276         <xsl:when test="$colora='green'"><xsl:text>0,.5,0</xsl:text></xsl:when>\r
277         <xsl:when test="$colora='lime'"><xsl:text>0,1,0</xsl:text></xsl:when>\r
278         <xsl:when test="$colora='maroon'"><xsl:text>.5,0,0</xsl:text></xsl:when>\r
279         <xsl:when test="$colora='navy'"><xsl:text>0,0,.5</xsl:text></xsl:when>\r
280         <xsl:when test="$colora='olive'"><xsl:text>.5,.5,0</xsl:text></xsl:when>\r
281         <xsl:when test="$colora='purple'"><xsl:text>.5,0,.5</xsl:text></xsl:when>\r
282         <xsl:when test="$colora='red'"><xsl:text>1,0,0</xsl:text></xsl:when>\r
283         <xsl:when test="$colora='silver'"><xsl:text>.75,.75,.75</xsl:text></xsl:when>\r
284         <xsl:when test="$colora='teal'"><xsl:text>0,.5,.5</xsl:text></xsl:when>\r
285         <xsl:when test="$colora='white'"><xsl:text>1,1,1</xsl:text></xsl:when>\r
286         <xsl:when test="$colora='yellow'"><xsl:text>1,1,0</xsl:text></xsl:when>\r
287         <xsl:otherwise>\r
288                 <xsl:message>Exception at color template</xsl:message>\r
289         </xsl:otherwise>\r
290         </xsl:choose>\r
291 </xsl:template>\r
292 \r
293 <xsl:template name="Hex2Decimal">\r
294         <xsl:param name="arg"/>\r
295         <xsl:choose>\r
296                 <xsl:when test="$arg='f'">\r
297                         <xsl:value-of select="15"/>\r
298                 </xsl:when>\r
299                 <xsl:when test="$arg='e'">\r
300                         <xsl:value-of select="14"/>\r
301                 </xsl:when>\r
302                 <xsl:when test="$arg='d'">\r
303                         <xsl:value-of select="13"/>\r
304                 </xsl:when>\r
305                 <xsl:when test="$arg='c'">\r
306                         <xsl:value-of select="12"/>\r
307                 </xsl:when>\r
308                 <xsl:when test="$arg='b'">\r
309                         <xsl:value-of select="11"/>\r
310                 </xsl:when>\r
311                 <xsl:when test="$arg='a'">\r
312                         <xsl:value-of select="10"/>\r
313                 </xsl:when>\r
314                 <xsl:when test="translate($arg, '0123456789', '9999999999')='9'"> <!-- if $arg is number -->\r
315                         <xsl:value-of select="$arg"/>\r
316                 </xsl:when>\r
317                 <xsl:otherwise>\r
318                         <xsl:message>Exception at Hex2Decimal template</xsl:message>\r
319                 </xsl:otherwise>\r
320         </xsl:choose>\r
321 </xsl:template>\r
322 \r
323 <xsl:template match="m:*/text()">\r
324         <xsl:call-template name="replaceEntities">\r
325                 <xsl:with-param name="content" select="normalize-space()"/>\r
326         </xsl:call-template>\r
327 </xsl:template>\r
328 \r
329 </xsl:stylesheet>