print functions as #<fn name>
[jackhill/mal.git] / xslt / printer.xslt
1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
3 <!-- expects input as a single <value><malval .../></value> -->
4 <!-- output of form <value>literal string</value> -->
5 <xsl:template name="malprinter-pr_str">
6 <xsl:param name="readably" as="xs:boolean" />
7
8 <xsl:variable name="value">
9 <xsl:copy-of select="value/malval" />
10 </xsl:variable>
11 <xsl:for-each select="$value">
12 <xsl:choose>
13 <xsl:when test="malval/@kind = 'true'">
14 <value>true</value>
15 </xsl:when>
16 <xsl:when test="malval/@kind = 'false'">
17 <value>false</value>
18 </xsl:when>
19 <xsl:when test="malval/@kind = 'nil'">
20 <value>nil</value>
21 </xsl:when>
22 <xsl:when test="malval/@kind = 'string'">
23 <value>
24 <xsl:value-of select="concat('&quot;', fn:desc_string(malval/@value, $readably), '&quot;')" />
25 </value>
26 </xsl:when>
27 <xsl:when test="malval/@kind = 'keyword'">
28 <value>
29 <xsl:value-of select="concat(':', malval/@value)" />
30 </value>
31 </xsl:when>
32 <xsl:when test="malval/@kind = 'symbol'">
33 <value>
34 <xsl:value-of select="malval/@value" />
35 </value>
36 </xsl:when>
37 <xsl:when test="malval/@kind = 'number'">
38 <value>
39 <xsl:value-of select="malval/@value" />
40 </value>
41 </xsl:when>
42 <xsl:when test="malval/@kind = 'list'">
43 <xsl:variable name="val">
44 <xsl:for-each select="malval/lvalue/malval">
45 <xsl:variable name="ctx">
46 <value><xsl:copy-of select="." /></value>
47 </xsl:variable>
48 <xsl:for-each select="$ctx">
49 <xsl:call-template name="malprinter-pr_str"><xsl:with-param name="readably" select="$readably"/></xsl:call-template>
50 </xsl:for-each>
51 </xsl:for-each>
52 </xsl:variable>
53 <xsl:for-each select="$val">
54 <value>
55 <xsl:value-of select="concat('(', string-join(/value, ' '), ')')" />
56 </value>
57 </xsl:for-each>
58 </xsl:when>
59 <xsl:when test="malval/@kind = 'vector'">
60 <xsl:variable name="val">
61 <xsl:for-each select="malval/lvalue/malval">
62 <xsl:variable name="ctx">
63 <value><xsl:copy-of select="." /></value>
64 </xsl:variable>
65 <xsl:for-each select="$ctx">
66 <xsl:call-template name="malprinter-pr_str"><xsl:with-param name="readably" select="$readably"/></xsl:call-template>
67 </xsl:for-each>
68 </xsl:for-each>
69 </xsl:variable>
70 <xsl:for-each select="$val">
71 <value>
72 <xsl:value-of select="concat('[', string-join(/value, ' '), ']')" />
73 </value>
74 </xsl:for-each>
75 </xsl:when>
76 <xsl:when test="malval/@kind = 'hash'">
77 <xsl:variable name="val">
78 <xsl:for-each select="malval/lvalue/malval">
79 <xsl:variable name="ctx">
80 <value><xsl:copy-of select="." /></value>
81 </xsl:variable>
82 <xsl:for-each select="$ctx">
83 <xsl:call-template name="malprinter-pr_str"><xsl:with-param name="readably" select="$readably"/></xsl:call-template>
84 </xsl:for-each>
85 </xsl:for-each>
86 </xsl:variable>
87 <xsl:for-each select="$val">
88 <value>
89 <xsl:value-of select="concat('{', string-join(/value, ' '), '}')" />
90 </value>
91 </xsl:for-each>
92 </xsl:when>
93 <xsl:when test="malval/@kind = 'function'">
94 <value>
95 <xsl:variable name="gt">&gt;</xsl:variable>
96 <xsl:variable name="lt">&lt;</xsl:variable>
97 <xsl:value-of select="concat('#', $lt, 'fn ', malval/@name, $gt)" />
98 </value>
99 </xsl:when>
100 <xsl:otherwise>
101 <value>Unknown <xsl:copy-of select="." /></value>
102 </xsl:otherwise>
103 </xsl:choose>
104 </xsl:for-each>
105 </xsl:template>
106
107 <xsl:function name="fn:desc_string" as="xs:string">
108 <xsl:param name="str" as="xs:string" />
109 <xsl:param name="readable" as="xs:boolean" />
110 <xsl:choose>
111 <xsl:when test="not($readable)">
112 <xsl:variable name="sx">
113 <xsl:analyze-string select="$str" regex="\\(n|&quot;|\\)">
114 <xsl:matching-substring>
115 <x>
116 <xsl:choose>
117 <xsl:when test="regex-group(1) = 'n'">
118 <xsl:value-of select="'&#10;'" />
119 </xsl:when>
120 <xsl:otherwise>
121 <xsl:value-of select="regex-group(1)" />
122 </xsl:otherwise>
123 </xsl:choose>
124 </x>
125 </xsl:matching-substring>
126 <xsl:non-matching-substring><x><xsl:value-of select="." /></x></xsl:non-matching-substring>
127 </xsl:analyze-string>
128 </xsl:variable>
129 <xsl:value-of select="string-join($sx/x, '')" />
130 </xsl:when>
131 <xsl:otherwise>
132 <xsl:value-of select="$str" />
133 </xsl:otherwise>
134 </xsl:choose>
135 </xsl:function>
136 </xsl:stylesheet>