fbb66fbad3a0c33c395ddfd112a376aa5be289b8
[redakcja.git] / src / wlxml / templates / wlxml / wl2html.xsl
1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="1.0"    
3     xmlns="http://www.w3.org/1999/xhtml"    
4     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
5     <xsl:output method="html" omit-xml-declaration="yes" encoding="utf-8" indent="no" />
6
7     <!--
8         Base tag for rendering a fragment of text
9     -->
10     <xsl:template match="chunk">        
11         <xsl:apply-templates select="child::node()">            
12             <xsl:with-param name="mixed" select="true()" />
13         </xsl:apply-templates>        
14     </xsl:template>
15     
16     <xsl:template match="utwor">
17         <div>
18             <xsl:call-template name="standard-attributes" />
19             <xsl:apply-templates select="child::node()">
20                 <xsl:with-param name="mixed" select="false()" />
21             </xsl:apply-templates>
22         </div>
23     </xsl:template>    
24
25
26     <!-- nieedytowany - zawiera bloki   section-->
27     <xsl:template match="{{ tags.section|join:"|" }}">
28         <xsl:param name="mixed" />
29         <div>
30             <xsl:call-template name="standard-attributes" />
31             <xsl:apply-templates select="child::node()">
32                 <xsl:with-param name="mixed" select="false()" />
33             </xsl:apply-templates>
34         </div>
35     </xsl:template>
36
37     <!-- edytowalny - zawiera tekst      div -->
38     <xsl:template match="{{ tags.div|join:"|" }}">
39         <xsl:param name="mixed" />
40         <div x-editable="true">
41             <xsl:call-template name="standard-attributes" />
42             <xsl:apply-templates select="child::node()">
43                 <xsl:with-param name="mixed" select="true()" />
44             </xsl:apply-templates>
45         </div>
46     </xsl:template>
47     
48     <xsl:template match="ilustr">
49       <div>
50         <xsl:call-template name="standard-attributes" />
51         <img>
52           <xsl:attribute name="src">
53             <xsl:value-of select="@src" />
54           </xsl:attribute>
55         </img>
56         <p class="alt"><xsl:value-of select="@alt"/></p>
57       </div>
58     </xsl:template>
59
60     <!--
61         ********
62         STROFA
63         ********
64     -->
65     <xsl:template match="strofa">
66         <div x-editable="true">
67             <xsl:call-template name="standard-attributes" />
68          
69             <xsl:choose>
70                 <xsl:when test="count(br) > 0">
71                     <xsl:variable name="first-verse" select="br[1]/preceding-sibling::node()" />                    
72                     <xsl:call-template name="verse">
73                         <xsl:with-param name="verse-content" select="$first-verse" />                        
74                     </xsl:call-template>
75                     <xsl:for-each select="br">
76                         <xsl:variable name="lnum" select="count(preceding-sibling::br)" />
77                         <!-- select all nodes up to the next br or end of stanza -->
78                         <xsl:variable name="current-verse"
79                             select="following-sibling::node()[count(preceding-sibling::br) = $lnum+1]" />                        
80                         <xsl:call-template name="verse">
81                             <xsl:with-param name="verse-content" select="$current-verse" />                            
82                         </xsl:call-template>
83                     </xsl:for-each>
84                 </xsl:when>
85                 <xsl:otherwise>
86                     <xsl:call-template name="verse">
87                         <xsl:with-param name="verse-content" select="child::node()" />                        
88                     </xsl:call-template>
89                 </xsl:otherwise>
90             </xsl:choose>
91         </div>
92     </xsl:template>
93
94     <xsl:template name="verse">
95         <!-- the verse contents including the last br (if any) -->
96         <xsl:param name="verse-content" />
97         <xsl:variable name="first-tag-name" select="name($verse-content/self::*)" />
98         <!-- name of text nodes is '' == false -->
99
100         <!-- THIS IS A HORROR!!! -->
101         <!-- Possible variants: -->
102         <xsl:choose>
103             <!-- Simple verse == not wers_ tags anywhere until the ending br -->
104             <xsl:when test="not($verse-content[starts-with(name(), 'wers')])">
105                 <div class="wers" x-node="wers" x-verse="true" x-auto-node="true">
106                 <xsl:apply-templates select="$verse-content[local-name(.) != 'br']">
107                     <xsl:with-param name="mixed" select="true()" />
108                 </xsl:apply-templates>
109                 </div>
110             </xsl:when>
111
112             <xsl:otherwise>
113             <xsl:apply-templates select="$verse-content[local-name(.) != 'br']">
114                 <xsl:with-param name="mixed" select="false()" />
115             </xsl:apply-templates>
116             </xsl:otherwise>
117         </xsl:choose>
118     </xsl:template>
119
120     {% if tags.verse %}
121     <xsl:template match="{{ tags.verse|join:"|" }}">
122         <xsl:param name="mixed" />
123                 <div x-verse="true">
124                 <xsl:call-template name="standard-attributes" />
125                 <xsl:apply-templates select="child::node()">
126                         <xsl:with-param name="mixed" select="true()" />
127                 </xsl:apply-templates>
128                 </div>
129     </xsl:template>
130     {% endif %}
131
132     <xsl:template match="br"><xsl:text>/</xsl:text></xsl:template>
133
134     {% if tags.span %}
135     <!-- Style znakowe         span -->
136     <xsl:template match="{{ tags.span|join:"|" }}">
137         <xsl:param name="mixed" />
138         <em>
139             <xsl:call-template name="standard-attributes" />
140             <xsl:apply-templates select="child::node()">
141                 <xsl:with-param name="mixed" select="true()" />
142             </xsl:apply-templates>
143         </em>
144     </xsl:template>
145     {% endif %}
146
147     {% if tags.sep %}
148     <!-- Separatory            sep -->
149     <xsl:template match="{{ tags.sep|join:"|" }}">
150         <xsl:param name="mixed" />
151         <hr><xsl:call-template name="standard-attributes" /></hr>
152     </xsl:template>
153     {% endif %}
154
155     {% if tags.aside %}
156     <!-- Przypisy i motywy     aside -->
157     <xsl:template match="{{ tags.aside|join:"|" }}">
158         <span x-editable="true">
159             <xsl:call-template name="standard-attributes">
160                 <xsl:with-param name="extra-class" select="'annotation-inline-box'" />
161             </xsl:call-template>
162             <a name="anchor-{generate-id(.)}" />
163             <!-- the link to the non-inline version -->
164             <a href="#annotation-{generate-id(.)}" class="annotation"></a>
165             <!-- inline contents -->
166             <span x-annotation-box="true" x-pass-thru="true">
167                 <xsl:apply-templates select="node()">
168                     <xsl:with-param name="mixed" select="true()" />
169                 </xsl:apply-templates>
170             </span>
171         </span>
172     </xsl:template>
173     {% endif %}
174
175     <xsl:template match="ref">
176       <span x-editable="true" x-edit-no-format="true" x-edit-attribute="href">
177         <xsl:call-template name="standard-attributes">
178           <xsl:with-param name="extra-class" select="'reference-inline-box'" />
179         </xsl:call-template>
180         <a class="reference">📌</a>
181         <span x-preview="true" x-pass-thru="true">
182           <a target="wiki" title="?">
183             <xsl:attribute name="href">
184               <xsl:value-of select="@href" />
185             </xsl:attribute>
186             <xsl:value-of select="@href" />
187           </a>
188         </span>
189       </span>
190     </xsl:template>
191     
192     <xsl:template match="begin">        
193         <span>
194             <xsl:call-template name="standard-attributes" />
195             <xsl:attribute name="theme-class">
196                 <xsl:value-of select="substring-after(@id, 'b')" />
197             </xsl:attribute>
198         </span>
199     </xsl:template>
200
201     <xsl:template match="motyw">
202         <span x-editable="true" x-edit-no-format="true">
203             <xsl:call-template name="standard-attributes" />
204             <xsl:attribute name="theme-class">
205                 <xsl:value-of select="substring-after(@id, 'm')" />
206             </xsl:attribute>
207             <span x-pass-thru="true" class="theme-text-list"><xsl:value-of select=".|node()" /></span>
208         </span>
209     </xsl:template>
210
211     <xsl:template match="end">
212         <span>
213             <xsl:call-template name="standard-attributes" />
214             <xsl:attribute name="theme-class">
215                 <xsl:value-of select="substring-after(@id, 'e')" />
216             </xsl:attribute>
217         </span>
218     </xsl:template>
219
220
221     <!-- Tekst -->
222     <xsl:template match="text()">
223       <!-- <xsl:value-of select="." /> -->
224       <xsl:param name="mixed" />
225       <xsl:choose>
226         <xsl:when test="normalize-space(.) = ''">
227           <xsl:value-of select="." />
228         </xsl:when>
229         <xsl:when test="not($mixed)">
230           <span x-node="out-of-flow-text" class="out-of-flow-text" x-editable="true">
231             <xsl:value-of select="." />
232           </span>
233         </xsl:when>
234         <xsl:otherwise><xsl:value-of select="." /></xsl:otherwise>
235       </xsl:choose>
236     </xsl:template>
237
238     <xsl:template match="comment()">
239         <xsl:comment><xsl:value-of select="." /></xsl:comment>
240     </xsl:template>
241
242     <xsl:template match="*[name() != local-name()]">
243         <span>
244             <xsl:call-template name="standard-attributes" />
245             <xsl:apply-templates select="child::node()">
246                 <xsl:with-param name="mixed" select="true()" />
247             </xsl:apply-templates>
248         </span>
249     </xsl:template>
250         
251     <xsl:template match="*">
252         <span>
253             <xsl:call-template name="standard-attributes">
254                 <xsl:with-param name="extra-class">unknown-tag</xsl:with-param>
255             </xsl:call-template>
256             <xsl:apply-templates select="child::node()">
257                 <xsl:with-param name="mixed" select="true()" />
258             </xsl:apply-templates>        
259         </span>
260     </xsl:template>
261
262     <xsl:template name="standard-attributes">
263         <xsl:param name="extra-class" />
264         <xsl:attribute name="class"><xsl:value-of select="$extra-class" /></xsl:attribute>
265
266         <xsl:attribute name="x-node"><xsl:value-of select="local-name()" /></xsl:attribute>
267
268         <xsl:if test="local-name() != name()">
269             <xsl:attribute name="x-ns"><xsl:value-of select="namespace-uri()" /></xsl:attribute>
270         </xsl:if>
271
272         <xsl:for-each select="@*">
273
274           <xsl:choose>
275             {% for namespace, prefix in namespaces.items %}
276             <xsl:when test="namespace-uri() =  '{{ namespace }}'">
277               <xsl:attribute name="x-a-{{ prefix }}-{local-name()}">
278                 <xsl:value-of select="."/>
279               </xsl:attribute>
280             </xsl:when>
281             {% endfor %}
282
283             <xsl:otherwise>
284               <xsl:variable name="id" select="generate-id()" />
285               <xsl:attribute name="x-attr-value-{$id}"><xsl:value-of select="."/></xsl:attribute>
286               <xsl:attribute name="x-attr-name-{$id}"><xsl:value-of select="local-name()"/></xsl:attribute>
287               <xsl:attribute name="x-attr-ns-{$id}"><xsl:value-of select="namespace-uri()"/></xsl:attribute>
288             </xsl:otherwise>
289           </xsl:choose>               
290
291         </xsl:for-each>
292     </xsl:template>
293
294     <xsl:template match="alien">
295             <span class="alien" x-pass-thru="true">
296                 <xsl:apply-templates select="node()">
297                     <xsl:with-param name="mixed" select="true()" />
298                 </xsl:apply-templates>
299             </span>
300     </xsl:template>
301
302     <xsl:template match="comment()">
303         <xsl:comment><xsl:value-of select="."/></xsl:comment>
304     </xsl:template>
305 </xsl:stylesheet>