Accept attributes in inline image syntax
[multimarkdown] / MultiMarkdownXSLTMathML / scripts.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: scripts.xsl 149 2006-09-12 21:23:53Z 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:munderover">\r
15         <xsl:variable name="base" select="translate(./*[1],' ','')"/>\r
16         <xsl:variable name="under" select="translate(./*[2],' ','')"/>\r
17         <xsl:variable name="over" select="translate(./*[3],' ','')"/>\r
18         <xsl:choose>\r
19                 <xsl:when test="$over='&#x000AF;'">     <!-- OverBar - over bar -->\r
20                         <xsl:text>\overline{</xsl:text>\r
21                         <xsl:call-template name="munder">\r
22                                 <xsl:with-param name="base" select="$base"/>\r
23                                 <xsl:with-param name="under" select="$under"/>\r
24                         </xsl:call-template>\r
25                         <xsl:text>}</xsl:text>\r
26                 </xsl:when>\r
27                 <xsl:when test="$over='&#x0FE37;'">     <!-- OverBrace - over brace -->\r
28                         <xsl:text>\overbrace{</xsl:text>\r
29                         <xsl:call-template name="munder">\r
30                                 <xsl:with-param name="base" select="$base"/>\r
31                                 <xsl:with-param name="under" select="$under"/>\r
32                         </xsl:call-template>\r
33                         <xsl:text>}</xsl:text>\r
34                 </xsl:when>\r
35                 <xsl:when test="$over='&#x02190;'">     <!--/leftarrow /gets A: =leftward arrow -->\r
36                         <xsl:text>\overleftarrow{</xsl:text>\r
37                         <xsl:call-template name="munder">\r
38                                 <xsl:with-param name="base" select="$base"/>\r
39                                 <xsl:with-param name="under" select="$under"/>\r
40                         </xsl:call-template>\r
41                         <xsl:text>}</xsl:text>\r
42                 </xsl:when>\r
43                 <xsl:when test="$over='&#x02192;'">     <!--/rightarrow /to A: =rightward arrow -->\r
44                         <xsl:text>\overrightarrow{</xsl:text>\r
45                         <xsl:call-template name="munder">\r
46                                 <xsl:with-param name="base" select="$base"/>\r
47                                 <xsl:with-param name="under" select="$under"/>\r
48                         </xsl:call-template>\r
49                         <xsl:text>}</xsl:text>\r
50                 </xsl:when>\r
51                 <xsl:when test="$over='&#x02194;'">     <!--/leftrightarrow A: l&r arrow -->\r
52                         <xsl:text>\overleftrightarrow{</xsl:text>\r
53                         <xsl:call-template name="munder">\r
54                                 <xsl:with-param name="base" select="$base"/>\r
55                                 <xsl:with-param name="under" select="$under"/>\r
56                         </xsl:call-template>\r
57                         <xsl:text>}</xsl:text>\r
58                 </xsl:when>\r
59                 <xsl:when test="$under='&#x00332;'">    <!-- UnderBar - combining low line -->\r
60                         <xsl:text>\underline{</xsl:text>\r
61                         <xsl:call-template name="mover">\r
62                                 <xsl:with-param name="base" select="$base"/>\r
63                                 <xsl:with-param name="over" select="$over"/>\r
64                                 <xsl:with-param name="pos_over" select="3"/>\r
65                         </xsl:call-template>\r
66                         <xsl:text>}</xsl:text>\r
67                 </xsl:when>\r
68                 <xsl:when test="$under='&#x0FE38;'">    <!-- UnderBrace - under brace -->\r
69                         <xsl:text>\underbrace{</xsl:text>\r
70                         <xsl:call-template name="mover">\r
71                                 <xsl:with-param name="base" select="$base"/>\r
72                                 <xsl:with-param name="over" select="$over"/>\r
73                                 <xsl:with-param name="pos_over" select="3"/>\r
74                         </xsl:call-template>\r
75                         <xsl:text>}</xsl:text>\r
76                 </xsl:when>\r
77                 <xsl:when test="$under='&#x02190;'">    <!--/leftarrow /gets A: =leftward arrow -->\r
78                         <xsl:text>\underleftarrow{</xsl:text>\r
79                         <xsl:call-template name="mover">\r
80                                 <xsl:with-param name="base" select="$base"/>\r
81                                 <xsl:with-param name="over" select="$over"/>\r
82                                 <xsl:with-param name="pos_over" select="3"/>\r
83                         </xsl:call-template>\r
84                         <xsl:text>}</xsl:text>\r
85                 </xsl:when>\r
86                 <xsl:when test="$under='&#x02192;'">    <!--/rightarrow /to A: =rightward arrow -->\r
87                         <xsl:text>\underrightarrow{</xsl:text>\r
88                         <xsl:call-template name="mover">\r
89                                 <xsl:with-param name="base" select="$base"/>\r
90                                 <xsl:with-param name="over" select="$over"/>\r
91                                 <xsl:with-param name="pos_over" select="3"/>\r
92                         </xsl:call-template>\r
93                         <xsl:text>}</xsl:text>\r
94                 </xsl:when>\r
95                 <xsl:when test="$under='&#x02194;'">    <!--/leftrightarrow A: l&r arrow -->\r
96                         <xsl:text>\underleftrightarrow{</xsl:text>\r
97                         <xsl:call-template name="mover">\r
98                                 <xsl:with-param name="base" select="$base"/>\r
99                                 <xsl:with-param name="over" select="$over"/>\r
100                                 <xsl:with-param name="pos_over" select="3"/>\r
101                         </xsl:call-template>\r
102                         <xsl:text>}</xsl:text>\r
103                 </xsl:when>             \r
104                 <xsl:when test="translate($base,'&#x0220F;&#x02210;&#x022c2;&#x022c3;&#x02294;',\r
105                                                 '&#x02211;&#x02211;&#x02211;&#x02211;&#x02211;')='&#x02211;'">\r
106 <!-- if $base is operator, such as\r
107                         &#x02211;       /sum L: summation operator\r
108                         &#x0220F;       /prod L: product operator\r
109                         &#x02210;       /coprod L: coproduct operator\r
110                         &#x022c2;       /bigcap\r
111                         &#x022c3;       /bigcup\r
112                         &#x02294;       /bigsqcup\r
113 -->\r
114                         <xsl:apply-templates select="./*[1]"/>\r
115                         <xsl:text>_{</xsl:text>\r
116                         <xsl:apply-templates select="./*[2]"/>\r
117                         <xsl:text>}^{</xsl:text>\r
118                         <xsl:apply-templates select="./*[3]"/>\r
119                         <xsl:text>}</xsl:text>\r
120                 </xsl:when>\r
121                 <xsl:otherwise>\r
122                         <xsl:text>\underset{</xsl:text>\r
123                         <xsl:apply-templates select="./*[2]"/>\r
124                         <xsl:text>}{\overset{</xsl:text>\r
125                         <xsl:apply-templates select="./*[3]"/>\r
126                         <xsl:text>}{</xsl:text>\r
127                         <xsl:apply-templates select="./*[1]"/>\r
128                         <xsl:text>}}</xsl:text>\r
129                 </xsl:otherwise>\r
130         </xsl:choose>\r
131 </xsl:template>\r
132 \r
133 <xsl:template match="m:mover">\r
134         <xsl:call-template name="mover">\r
135                 <xsl:with-param name="base" select="translate(./*[1],' ','')"/>\r
136                 <xsl:with-param name="over" select="translate(./*[2],' ','')"/>\r
137         </xsl:call-template>\r
138 </xsl:template>\r
139 \r
140 <xsl:template match="m:munder">\r
141         <xsl:call-template name="munder">\r
142                 <xsl:with-param name="base" select="translate(./*[1],' ','')"/>\r
143                 <xsl:with-param name="under" select="translate(./*[2],' ','')"/>\r
144         </xsl:call-template>\r
145 </xsl:template>\r
146 \r
147 <xsl:template name="mover">\r
148         <xsl:param name="base"/>\r
149         <xsl:param name="over"/>\r
150         <xsl:param name="pos_over" select="2"/>\r
151         <xsl:choose>\r
152                 <xsl:when test="$over='&#x000AF;'">     <!-- OverBar - over bar -->\r
153                         <xsl:text>\overline{</xsl:text>\r
154                         <xsl:apply-templates select="./*[1]"/>\r
155                         <xsl:text>}</xsl:text>\r
156                 </xsl:when>\r
157                 <xsl:when test="$over='&#x0FE37;'">     <!-- OverBrace - over brace -->\r
158                         <xsl:text>\overbrace{</xsl:text>\r
159                         <xsl:apply-templates select="./*[1]"/>\r
160                         <xsl:text>}</xsl:text>\r
161                 </xsl:when>\r
162                 <xsl:when test="$over='&#x02190;'">     <!--/leftarrow /gets A: =leftward arrow -->\r
163                         <xsl:text>\overleftarrow{</xsl:text>\r
164                         <xsl:apply-templates select="./*[1]"/>\r
165                         <xsl:text>}</xsl:text>\r
166                 </xsl:when>\r
167                 <xsl:when test="$over='&#x02192;'">     <!--/rightarrow /to A: =rightward arrow -->\r
168                         <xsl:text>\overrightarrow{</xsl:text>\r
169                         <xsl:apply-templates select="./*[1]"/>\r
170                         <xsl:text>}</xsl:text>\r
171                 </xsl:when>\r
172                 <xsl:when test="$over='&#x02194;'">     <!--/leftrightarrow A: l&r arrow -->\r
173                         <xsl:text>\overleftrightarrow{</xsl:text>\r
174                         <xsl:apply-templates select="./*[1]"/>\r
175                         <xsl:text>}</xsl:text>\r
176                 </xsl:when>\r
177                 <xsl:when test="$over='&#x002DC;'">     <!-- small tilde -->\r
178                         <xsl:text>\tilde{</xsl:text>\r
179                         <xsl:apply-templates select="./*[1]"/>\r
180                         <xsl:text>}</xsl:text>\r
181                 </xsl:when>\r
182                 <xsl:when test="$over='&#x02713;'">     <!-- /checkmark =tick, check mark -->\r
183                         <xsl:text>\check{</xsl:text>\r
184                         <xsl:apply-templates select="./*[1]"/>\r
185                         <xsl:text>}</xsl:text>\r
186                 </xsl:when>\r
187                         <xsl:when test="$over='&#x002D9;'">     <!-- dot above -->\r
188                         <xsl:text>\dot{</xsl:text>\r
189                         <xsl:apply-templates select="./*[1]"/>\r
190                         <xsl:text>}</xsl:text>\r
191                 </xsl:when>\r
192                 <xsl:when test="$over='&#x000A8;'">     <!-- DoubleDot - dieresis or umlaut mark -->\r
193                         <xsl:text>\ddot{</xsl:text>\r
194                         <xsl:apply-templates select="./*[1]"/>\r
195                         <xsl:text>}</xsl:text>\r
196                 </xsl:when>\r
197                 <xsl:when test="$over='&#x00302;' or $over='&#x0005E;'"> <!-- Hat or circ - circumflex accent -->\r
198                         <xsl:choose>\r
199                                 <xsl:when test="@accent='true'">\r
200                                         <xsl:text>\widehat{</xsl:text>\r
201                                 </xsl:when>\r
202                                 <xsl:otherwise>\r
203                                         <xsl:text>\hat{</xsl:text>\r
204                                 </xsl:otherwise>\r
205                         </xsl:choose>\r
206                         <xsl:apply-templates select="./*[1]"/><xsl:text>}</xsl:text>\r
207                 </xsl:when>\r
208                 <xsl:when test="translate($base,'&#x0220F;&#x02210;&#x022c2;&#x022c3;&#x02294;',\r
209                                                 '&#x02211;&#x02211;&#x02211;&#x02211;&#x02211;')='&#x02211;'">\r
210 <!-- if $base is operator, such as\r
211                         &#x02211;       /sum L: summation operator\r
212                         &#x0220F;       /prod L: product operator\r
213                         &#x02210;       /coprod L: coproduct operator\r
214                         &#x022c2;       /bigcap\r
215                         &#x022c3;       /bigcup\r
216                         &#x02294;       /bigsqcup\r
217 -->\r
218                         <xsl:apply-templates select="./*[1]"/>\r
219                         <xsl:text>^{</xsl:text>\r
220                         <xsl:apply-templates select="./*[$pos_over]"/>\r
221                         <xsl:text>}</xsl:text>\r
222                 </xsl:when>\r
223                 <xsl:otherwise>\r
224                         <xsl:text>\stackrel{</xsl:text>\r
225                         <xsl:apply-templates select="./*[$pos_over]"/>\r
226                         <xsl:text>}{</xsl:text>\r
227                         <xsl:apply-templates select="./*[1]"/>\r
228                         <xsl:text>}</xsl:text>\r
229                         <!--\r
230                         <xsl:text>\overset{</xsl:text>\r
231                         <xsl:apply-templates select="./*[$pos_over]"/>\r
232                         <xsl:text>}{</xsl:text> \r
233                         <xsl:apply-templates select="./*[1]"/>\r
234                         <xsl:text>}</xsl:text>-->\r
235                 </xsl:otherwise>\r
236         </xsl:choose>\r
237 </xsl:template>\r
238 \r
239 <xsl:template name="munder">\r
240         <xsl:param name="base"/>\r
241         <xsl:param name="under"/>\r
242         <xsl:choose>\r
243                 <xsl:when test="$under='&#x00332;'">    <!-- UnderBar - combining low line -->\r
244                         <xsl:text>\underline{</xsl:text>\r
245                         <xsl:apply-templates select="./*[1]"/>\r
246                         <xsl:text>}</xsl:text>\r
247                 </xsl:when>\r
248                 <xsl:when test="$under='&#x0FE38;'">    <!-- UnderBrace - under brace -->\r
249                         <xsl:text>\underbrace{</xsl:text>\r
250                         <xsl:apply-templates select="./*[1]"/>\r
251                         <xsl:text>}</xsl:text>\r
252                 </xsl:when>\r
253                 <xsl:when test="$under='&#x02190;'">    <!--/leftarrow /gets A: =leftward arrow -->\r
254                         <xsl:text>\underleftarrow{</xsl:text>\r
255                         <xsl:apply-templates select="./*[1]"/>\r
256                         <xsl:text>}</xsl:text>\r
257                 </xsl:when>\r
258                 <xsl:when test="$under='&#x02192;'">    <!--/rightarrow /to A: =rightward arrow -->\r
259                         <xsl:text>\underrightarrow{</xsl:text>\r
260                         <xsl:apply-templates select="./*[1]"/>\r
261                         <xsl:text>}</xsl:text>\r
262                 </xsl:when>\r
263                 <xsl:when test="$under='&#x02194;'">    <!--/leftrightarrow A: l&r arrow -->\r
264                         <xsl:text>\underleftrightarrow{</xsl:text>\r
265                         <xsl:apply-templates select="./*[1]"/>\r
266                         <xsl:text>}</xsl:text>\r
267                 </xsl:when>\r
268                 <xsl:when test="translate($base,'&#x0220F;&#x02210;&#x022c2;&#x022c3;&#x02294;',\r
269                                                 '&#x02211;&#x02211;&#x02211;&#x02211;&#x02211;')='&#x02211;'">\r
270 <!-- if $base is operator, such as\r
271                         &#x02211;       /sum L: summation operator\r
272                         &#x0220F;       /prod L: product operator\r
273                         &#x02210;       /coprod L: coproduct operator\r
274                         &#x022c2;       /bigcap\r
275                         &#x022c3;       /bigcup\r
276                         &#x02294;       /bigsqcup\r
277 -->\r
278                         <xsl:apply-templates select="./*[1]"/>\r
279                         <xsl:text>_{</xsl:text>\r
280                         <xsl:apply-templates select="./*[2]"/>\r
281                         <xsl:text>}</xsl:text>\r
282                 </xsl:when>\r
283                 <xsl:otherwise>\r
284                         <xsl:text>\underset{</xsl:text>         <!-- Required AmsMath package -->\r
285                         <xsl:apply-templates select="./*[2]"/>\r
286                         <xsl:text>}{</xsl:text> \r
287                         <xsl:apply-templates select="./*[1]"/>\r
288                         <xsl:text>}</xsl:text>  \r
289                 </xsl:otherwise>\r
290         </xsl:choose>\r
291 </xsl:template>\r
292 \r
293 <xsl:template match="m:msubsup">\r
294         <xsl:text>{</xsl:text>  \r
295         <xsl:apply-templates select="./*[1]"/>\r
296         <xsl:text>}_{</xsl:text>\r
297         <xsl:apply-templates select="./*[2]"/>\r
298         <xsl:text>}^{</xsl:text>        \r
299         <xsl:apply-templates select="./*[3]"/>\r
300         <xsl:text>}</xsl:text>  \r
301 </xsl:template>\r
302 \r
303 <xsl:template match="m:msup">\r
304         <xsl:text>{</xsl:text>  \r
305         <xsl:apply-templates select="./*[1]"/>\r
306         <xsl:text>}^{</xsl:text>        \r
307         <xsl:apply-templates select="./*[2]"/>\r
308         <xsl:text>}</xsl:text>  \r
309 </xsl:template>\r
310 \r
311 <xsl:template match="m:msub">\r
312         <xsl:text>{</xsl:text>  \r
313         <xsl:apply-templates select="./*[1]"/>\r
314         <xsl:text>}_{</xsl:text>        \r
315         <xsl:apply-templates select="./*[2]"/>\r
316         <xsl:text>}</xsl:text>  \r
317 </xsl:template>\r
318 \r
319 <xsl:template match="m:mmultiscripts" mode="mprescripts">\r
320         <xsl:for-each select="m:mprescripts/following-sibling::*">\r
321                 <xsl:if test="position() mod 2 and local-name(.)!='none'">\r
322                         <xsl:text>{}_{</xsl:text>       \r
323                         <xsl:apply-templates select="."/>\r
324                         <xsl:text>}</xsl:text>  \r
325                 </xsl:if>\r
326                 <xsl:if test="not(position() mod 2) and local-name(.)!='none'">\r
327                         <xsl:text>{}^{</xsl:text>       \r
328                         <xsl:apply-templates select="."/>\r
329                         <xsl:text>}</xsl:text>  \r
330                 </xsl:if>\r
331         </xsl:for-each>\r
332         <xsl:apply-templates select="./*[1]"/>\r
333         <xsl:for-each select="m:mprescripts/preceding-sibling::*[position()!=last()]">\r
334                 <xsl:if test="position()>2 and local-name(.)!='none'">\r
335                         <xsl:text>{}</xsl:text> \r
336                 </xsl:if>\r
337                 <xsl:if test="position() mod 2 and local-name(.)!='none'">\r
338                         <xsl:text>_{</xsl:text> \r
339                         <xsl:apply-templates select="."/>\r
340                         <xsl:text>}</xsl:text>  \r
341                 </xsl:if>\r
342                 <xsl:if test="not(position() mod 2) and local-name(.)!='none'">\r
343                         <xsl:text>^{</xsl:text> \r
344                         <xsl:apply-templates select="."/>\r
345                         <xsl:text>}</xsl:text>  \r
346                 </xsl:if>\r
347         </xsl:for-each>\r
348 </xsl:template>\r
349 \r
350 <xsl:template match="m:mmultiscripts">\r
351         <xsl:choose>\r
352                 <xsl:when test="m:mprescripts">\r
353                         <xsl:apply-templates select="." mode="mprescripts"/>\r
354                 </xsl:when>\r
355                 <xsl:otherwise>\r
356                         <xsl:apply-templates select="./*[1]"/>\r
357                         <xsl:for-each select="*[position()>1]">\r
358                                 <xsl:if test="position()>2 and local-name(.)!='none'">\r
359                                         <xsl:text>{}</xsl:text> \r
360                                 </xsl:if>\r
361                                 <xsl:if test="position() mod 2 and local-name(.)!='none'">\r
362                                         <xsl:text>_{</xsl:text> \r
363                                         <xsl:apply-templates select="."/>\r
364                                         <xsl:text>}</xsl:text>  \r
365                                 </xsl:if>\r
366                                 <xsl:if test="not(position() mod 2) and local-name(.)!='none'">\r
367                                         <xsl:text>^{</xsl:text> \r
368                                         <xsl:apply-templates select="."/>\r
369                                         <xsl:text>}</xsl:text>  \r
370                                 </xsl:if>\r
371                         </xsl:for-each>\r
372                 </xsl:otherwise>\r
373         </xsl:choose>\r
374 </xsl:template>\r
375 \r
376 </xsl:stylesheet>