85ff4a38371bdb764fa8d0ba6ddb0e4fd21ddc34
[redakcja.git] / platforma / static / xsl / wl2html_client.xsl
1 <xsl:stylesheet version="1.0"    
2     xmlns="http://www.w3.org/1999/xhtml"    
3     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
4
5     <!--
6         Dokument ten opisuje jednoznaczne przekształcenie WLML 0.1 -> XHTML.
7     -->        
8     <xsl:output method="html" encoding="utf-8" indent="yes" />
9
10     <xsl:template match="/">
11         <xsl:apply-templates select="chunk|utwor" />
12     </xsl:template>
13
14     <!--
15         Base tag for rendering a fragment of text
16     -->
17     <xsl:template match="chunk">        
18         <xsl:apply-templates select="child::node()">            
19             <xsl:with-param name="mixed" select="true()" />
20         </xsl:apply-templates>        
21     </xsl:template>
22     
23     <!--
24         Base tag for rendering the whole text 
25     -->
26
27     <!-- TODO -->
28
29     
30     
31     <!-- 
32         Przekształcenia poszczególnych elementów zgodnie z:            
33         http://wiki.wolnepodreczniki.pl/Lektury:Sk%C5%82ad/Tagi_sk%C5%82adu
34     -->
35
36     <!-- TAGI MASTERÓW STYLÓW
37     
38         Tagi rozpoczynające i kończące tekst utworu lirycznego o standardowej szerokości łamu:
39     -->
40
41     <xsl:template match="liryka_l">
42         <xsl:param name="mixed" />
43         <div class="{name()}" x-node="{name()}">
44             <xsl:apply-templates select="child::node()">
45                 <xsl:with-param name="mixed" select="false()" />
46             </xsl:apply-templates>
47         </div>
48     </xsl:template>
49
50     <!-- 
51         *****************************
52         ELEMENTY POZA TEKSTEM GŁÓWNYM
53         *****************************
54     -->
55
56     <!--
57         Autor składanego utworu
58
59         Element strony tytułowej - lub odpowiadającej jej przestrzeni,
60         np. na stronie internetowej) :
61
62         <autor_utworu> imiona-itd.-autora-składanego-utworu </autor_utworu>
63     -->
64     <xsl:template match="autor_utworu">
65         <xsl:param name="mixed" />
66         <h2 class="{name()}" x-editable="true" x-node="{name()}">
67             <xsl:apply-templates select="child::node()">
68                 <xsl:with-param name="mixed" select="true()" />
69             </xsl:apply-templates>
70         </h2>
71     </xsl:template>
72
73     <!-- 
74         Nazwa składanego utworu
75
76         Element strony tytułowej - lub odpowiadającej jej przestrzeni,
77         np. na stronie internetowej
78
79         <nazwa_utworu> tytuł-składanego-utworu </nazwa_utworu>
80     -->
81     <xsl:template match="nazwa_utworu">
82         <xsl:param name="mixed" />
83         <h1 class="{name()}" x-editable="true" x-node="{name()}">
84             <xsl:apply-templates select="child::node()">
85                 <xsl:with-param name="mixed" select="true()" />
86             </xsl:apply-templates>
87         </h1>
88     </xsl:template>
89
90     <!--
91         Nazwa utworu nadrzędnego, w którego skład wchodzi dany utwór
92         <dzielo_nadrzedne> tytuł-dzieła-nadrzędnego </dzielo_nadrzedne>
93
94          Przykład:
95
96          <utwor>
97          <liryka_l>
98             <autor_utworu>Bruno Jasieński</autor_utworu>
99             <dzielo_nadrzedne>But w butonierce</dzielo_nadrzedne>
100             <nazwa_utworu>Deszcz</nazwa_utworu>
101             ....
102     -->
103     <xsl:template match="dzielo_nadrzedne">
104         <xsl:param name="mixed" />
105         <h2 class="{name()}" x-editable="true" x-node="{name()}">
106             <xsl:apply-templates select="child::node()">
107                 <xsl:with-param name="mixed" select="true()" />
108             </xsl:apply-templates>
109         </h2>
110     </xsl:template>
111
112     <!--
113         Podtytuł, czyli wszystkie dopiski do tytułu
114
115         Element strony tytułowej - lub odpowiadającej jej przestrzeni.
116         <podtytul> podtytuł-składanego-utworu </podtytul>
117
118         Przykład:
119         <utwor>
120             <powiesc>
121             <autor_utworu>Daniel Defoe</autor_utworu>
122             <nazwa_utworu>Robinson Crusoe</nazwa_utworu>
123             <podtytul>Jego życia losy, doświadczenia i przypadki</podtytul>
124             ...
125     -->
126     <xsl:template match="podtytul">
127         <xsl:param name="mixed" />
128         <h3 class="{name()}" x-editable="true" x-node="{name()}">
129             <xsl:apply-templates select="child::node()">
130                 <xsl:with-param name="mixed" select="true()" />
131             </xsl:apply-templates>
132         </h3>
133     </xsl:template>
134
135     <!--
136        Tagi obejmujące tekst noty poprzedzającej tekst główny (styl wieloakapitowy):
137
138         <nota><akap> tekst-noty </akap></nota> (styl wieloakapitowy)
139     -->
140
141     <xsl:template match="nota">
142         <xsl:param name="mixed" />
143         <div class="{name()}" x-node="{name()}">
144             <xsl:apply-templates select="child::node()">
145                 <xsl:with-param name="mixed" select="false()" />
146             </xsl:apply-templates>
147         </div>
148     </xsl:template>
149
150     <!--
151         Tagi obejmujące tekst dedykacji (styl wieloakapitowy bądź wielostrofowy):
152         <dedykacja> tekst-dedykacji </dedykacja>
153     -->
154     <xsl:template match="dedykacja">
155         <xsl:param name="mixed" />
156         <div class="{name()}" x-node="{name()}">
157             <xsl:apply-templates select="child::node()">
158                 <xsl:with-param name="mixed" select="false()" />
159             </xsl:apply-templates>
160         </div>
161     </xsl:template>
162
163     <!--
164         Tagi obejmujące tekst motta (styl wieloakapitowy bądź wielostrofowy):
165         <motto> tekst-motta </motto>
166     -->
167     <xsl:template match="motto">
168         <xsl:param name="mixed" />
169         <div class="{name()}" x-node="{name()}">
170             <xsl:apply-templates select="child::node()">
171                 <xsl:with-param name="mixed" select="false()" />
172             </xsl:apply-templates>
173         </div>
174     </xsl:template>
175
176     <xsl:template match="motto_podpis">
177         <xsl:param name="mixed" />
178         <p class="{name()}" x-editable="true" x-node="{name()}">
179             <xsl:apply-templates select="child::node()">
180                 <xsl:with-param name="mixed" select="true()" />
181             </xsl:apply-templates>
182         </p>
183     </xsl:template>
184
185     <!--
186         Tagi obejmujące listę osób poprzedzającą tekst dramatu
187           (zwykle składaną na osobnej stronie; to odmiana stylu listy):
188
189         <lista_osob> osoby </lista_osob>
190     -->
191     <xsl:template match="lista_osob">
192         <xsl:param name="mixed" />
193         <div class="{name()}" x-editable="true" x-node="{name()}">
194             <xsl:apply-templates select="child::node()">
195                 <xsl:with-param name="mixed" select="false()" />
196             </xsl:apply-templates>
197         </div>
198     </xsl:template>
199
200     <xsl:template match="naglowek_listy">
201         <xsl:param name="mixed" />
202         <p class="{name()}" x-node="{name()}">
203             <xsl:apply-templates select="child::node()">
204                 <xsl:with-param name="mixed" select="true()" />
205             </xsl:apply-templates>
206         </p>
207     </xsl:template>
208
209     <xsl:template match="lista_osoba">
210         <xsl:param name="mixed" />
211         <p class="{name()}" x-editable="true" x-node="{name()}">
212             <xsl:apply-templates select="child::node()">
213                 <xsl:with-param name="mixed" select="true()" />
214             </xsl:apply-templates>
215         </p>
216     </xsl:template>
217
218
219     <!--
220         ***************************
221         TAGI STYLÓW TEKSTU GŁÓWNEGO
222         ***************************
223     -->
224
225     <!--
226       Tagi nagłówka części/księgi:
227       <naglowek_czesc> nagłówek-części-lub-księgi </naglowek_czesc>
228     -->
229     <xsl:template match="naglowek_czesc">
230         <xsl:param name="mixed" />
231         <h2 class="{name()}" x-editable="true" x-node="{name()}">
232             <xsl:apply-templates select="child::node()">
233                 <xsl:with-param name="mixed" select="true()" />
234             </xsl:apply-templates>
235         </h2>
236     </xsl:template>
237
238     <!--
239       Tagi tytułu rozdziału:
240       <naglowek_rozdzial> nr-i/lub-tytuł </naglowek_rozdzial>
241     -->
242     <xsl:template match="naglowek_rozdzial">
243         <xsl:param name="mixed" />
244         <h3 class="{name()}" x-editable="true" x-node="{name()}">
245             <xsl:apply-templates select="child::node()">
246                 <xsl:with-param name="mixed" select="true()" />
247             </xsl:apply-templates>
248         </h3>
249     </xsl:template>
250
251     <!--
252       Tagi tytułu podrozdziału:
253       <naglowek_podrozdzial> nr-i/lub-podtytuł </naglowek_podrozdzial>
254     -->
255     <xsl:template match="naglowek_podrozdzial">
256         <xsl:param name="mixed" />
257         <h4 class="{name()}" x-editable="true" x-node="{name()}">
258             <xsl:apply-templates select="child::node()">
259                 <xsl:with-param name="mixed" select="true()" />
260             </xsl:apply-templates>
261         </h4>
262     </xsl:template>
263
264     <!--
265        Tagi sródtytułu:
266        <srodtytul> śródtytuł </srodtytul>
267
268        Tagi nagłówków aktów:
269        <naglowek_akt> nagłówek-aktu </naglowek_akt>
270     -->
271
272     <xsl:template match="srodtytul">
273         <xsl:param name="mixed" />
274         <h2 class="{name()}" x-editable="true" x-node="{name()}">
275             <xsl:apply-templates select="child::node()">
276                 <xsl:with-param name="mixed" select="true()" />
277             </xsl:apply-templates>
278         </h2>
279     </xsl:template>
280
281     <xsl:template match="naglowek_akt">
282         <xsl:param name="mixed" />
283         <h2 class="{name()}" x-editable="true" x-node="{name()}">
284             <xsl:apply-templates select="child::node()">
285                 <xsl:with-param name="mixed" select="true()" />
286             </xsl:apply-templates>
287         </h2>
288     </xsl:template>
289
290     <!--
291       Tagi nagłówków scen:
292       <naglowek_scena> nagłówek-sceny </naglowek_scena>
293     -->
294
295     <xsl:template match="naglowek_scena">
296         <xsl:param name="mixed" />
297         <h3 class="{name()}" x-editable="true" x-node="{name()}">
298             <xsl:apply-templates select="child::node()">
299                 <xsl:with-param name="mixed" select="true()" />
300             </xsl:apply-templates>
301         </h3>
302     </xsl:template>
303     
304     <xsl:template match="naglowek_osoba">
305         <xsl:param name="mixed" />
306         <h4 class="{name()}" x-editable="true" x-node="{name()}">
307             <xsl:apply-templates select="child::node()">
308                 <xsl:with-param name="mixed" select="true()" />
309             </xsl:apply-templates>
310         </h4>
311     </xsl:template>
312
313     <!--
314        ************************
315        Bloki w tekście głównym
316        ************************
317     -->
318     
319     <xsl:template match="dlugi_cytat">
320         <xsl:param name="mixed" />
321         <div class="{name()}" x-node="{name()}">
322             <xsl:apply-templates select="child::node()">
323                 <xsl:with-param name="mixed" select="false()" />
324             </xsl:apply-templates>
325         </div>
326     </xsl:template>
327     
328     <xsl:template match="poezja_cyt">
329         <xsl:param name="mixed" />
330         <div class="{name()}" x-node="{name()}">
331             <xsl:apply-templates select="child::node()">
332                 <xsl:with-param name="mixed" select="false()" />
333             </xsl:apply-templates>
334         </div>
335     </xsl:template>
336
337     <xsl:template match="kwestia">
338         <xsl:param name="mixed" />
339         <div class="{name()}" x-node="{name()}">
340             <xsl:apply-templates select="child::node()">
341                 <xsl:with-param name="mixed" select="false()" />
342             </xsl:apply-templates>
343         </div>
344     </xsl:template>
345
346     <xsl:template match="didaskalia">
347         <xsl:param name="mixed" />
348         <div class="{name()}" x-node="{name()}">
349             <xsl:apply-templates select="child::node()">
350                 <xsl:with-param name="mixed" select="false()" />
351             </xsl:apply-templates>
352         </div>
353     </xsl:template>
354
355     <xsl:template match="wywiad_pyt">
356         <xsl:param name="mixed" />
357         <div class="{name()}" x-node="{name()}">
358             <xsl:apply-templates select="child::node()">
359                 <xsl:with-param name="mixed" select="false()" />
360             </xsl:apply-templates>
361         </div>
362     </xsl:template>
363
364     <xsl:template match="wywiad_odp">
365         <xsl:param name="mixed" />
366         <div class="{name()}" x-node="{name()}">
367             <xsl:apply-templates select="child::node()">
368                 <xsl:with-param name="mixed" select="false()" />
369             </xsl:apply-templates>
370         </div>
371     </xsl:template>
372
373     <!--
374         ***********************************
375         Style akapitowe oraz strofy i wersy
376         ***********************************
377     -->
378
379     <xsl:template match="akap">
380         <xsl:param name="mixed" />
381         <p class="{name()}" x-editable="true" x-node="{name()}">
382             <xsl:apply-templates select="child::node()">
383                 <xsl:with-param name="mixed" select="true()" />
384             </xsl:apply-templates>
385         </p>
386     </xsl:template>
387
388     <xsl:template match="akap_cd">
389         <xsl:param name="mixed" />
390         <p class="{name()}" x-editable="true" x-node="{name()}">
391             <xsl:apply-templates select="child::node()">
392                 <xsl:with-param name="mixed" select="true()" />
393             </xsl:apply-templates>
394         </p>
395     </xsl:template>
396
397     <xsl:template match="akap_dialog">
398         <xsl:param name="mixed" />
399         <p class="{name()}" x-editable="true" x-node="{name()}">
400             <xsl:apply-templates select="child::node()">
401                 <xsl:with-param name="mixed" select="true()" />
402             </xsl:apply-templates>
403         </p>
404     </xsl:template>
405
406     <!--
407         ********
408         STROFA
409         ********
410     -->
411     <xsl:template match="strofa">
412         <div class="{name()}" x-editable="true" x-node="{name()}">
413             <xsl:choose>
414                 <xsl:when test="count(br) > 0">
415                     <xsl:call-template name="verse">
416                         <xsl:with-param name="verse-content" select="br[1]/preceding-sibling::node()" />
417                         <xsl:with-param name="verse-type" select="name(br[1]/preceding-sibling::*[starts-with(name(current()),'wers')])" />
418                     </xsl:call-template>
419                     <xsl:for-each select="br">
420                         <!-- Each BR tag "consumes" text after it -->
421                         <xsl:variable name="lnum" select="count(preceding-sibling::br)" />
422                         <xsl:call-template name="verse">
423                             <xsl:with-param name="verse-content"
424                                 select="following-sibling::node()[count(preceding-sibling::br) = $lnum+1]" />
425                             <xsl:with-param name="verse-type"
426                                 select="name(following-sibling::*[count(preceding-sibling::br) = $lnum+1 and starts-with(name(current()), 'wers')][1])" />
427                         </xsl:call-template>
428                     </xsl:for-each>
429                 </xsl:when>
430                 <xsl:otherwise>
431                     <xsl:call-template name="verse">
432                         <xsl:with-param name="verse-content" select="child::node()" />
433                         <xsl:with-param name="verse-type" select="name(child::*[starts-with(name(current()),'wers')])" />
434                     </xsl:call-template>
435                 </xsl:otherwise>
436             </xsl:choose>
437         </div>
438     </xsl:template>
439
440     <xsl:template name="verse">
441         <xsl:param name="verse-content" />
442         <xsl:param name="verse-type" />
443
444         <xsl:choose>
445             <xsl:when test="$verse-type = ''">
446                 <p class="wers" x-node="wers">
447                 <xsl:for-each select="$verse-content[name(.) != 'br']">
448                     <xsl:apply-templates select=".">
449                     <xsl:with-param name="mixed" select="true()" />
450                     </xsl:apply-templates>
451                 </xsl:for-each>
452                 </p>                
453             </xsl:when>
454             <xsl:otherwise>
455                 <p class="{$verse-type}" x-node="{$verse-type}">
456                 <xsl:for-each select="$verse-content[name(.) != 'br']">
457                 <xsl:apply-templates select=".">
458                     <xsl:with-param name="mixed" select="true()" />
459                 </xsl:apply-templates>
460                 </xsl:for-each>
461                 </p>
462             </xsl:otherwise>
463         </xsl:choose>
464         
465         
466     </xsl:template>
467     
468
469     <!--
470         *************
471         STYLE ZNAKOWE
472         *************
473     -->
474
475     <!--
476         Tagi obejmujące tytuł dzieła, np. książki, filmu, piosenki,
477         modlitwy, przedstawienia teatr. itd.:
478
479         <tytul_dziela> tytuł-dzieła </tytul_dziela>
480     -->
481     <xsl:template match="tytul_dziela">
482         <xsl:param name="mixed" />
483         <span class="{name()}" x-editable="true" x-node="{name()}">
484             <xsl:apply-templates select="child::node()">
485                 <xsl:with-param name="mixed" select="true()" />
486             </xsl:apply-templates>
487         </span>
488     </xsl:template>
489
490     <xsl:template match="wyroznienie|slowo_obce|mat|didask_tekst|osoba|wyp_osoba|www">
491         <xsl:param name="mixed" />
492         <em class="{name()}" x-node="{name()}">
493             <xsl:apply-templates select="child::node()">
494                 <xsl:with-param name="mixed" select="true()" />
495             </xsl:apply-templates>
496         </em>
497     </xsl:template>
498
499     <!--
500         **********
501         SEPARATORY
502         **********
503     -->
504     <xsl:template match="sekcja_swiatlo">
505         <xsl:param name="mixed" />
506         <br class="{name()}" x-node="{name()}" />
507     </xsl:template>
508
509     <xsl:template match="sekcja_asteryks">
510         <xsl:param name="mixed" />
511         <hr class="{name()}" x-node="{name()}" />
512     </xsl:template>
513
514     <xsl:template match="separator_linia">
515         <xsl:param name="mixed" />
516         <hr class="{name()}" x-node="{name()}" />
517     </xsl:template>
518
519     <xsl:template match="zastepnik_wersu">
520         <xsl:param name="mixed" />
521         <hr class="{name()}" x-node="{name()}" />
522     </xsl:template>
523
524     <!--
525         *************
526            PRZYPISY
527         *************
528     -->
529
530     <!--
531         Przypisy i motywy
532     -->
533     <xsl:template match="pr|pa|pe|pt">       
534         <span class="annotation-inline-box" x-node="{name()}">
535             <a name="anchor-{generate-id(.)}" />
536             <!-- the link to the non-inline version -->
537             <a href="#annotation-{generate-id(.)}" class="annotation"></a>
538             <!-- inline contents -->
539             <span x-annotation-box="true">
540                 <xsl:apply-templates select="node()">
541                     <xsl:with-param name="mixed" select="true()" />
542                 </xsl:apply-templates>
543             </span>
544         </span>
545
546     </xsl:template>
547
548     <xsl:template match="begin">
549         <xsl:variable name="id" select="substring-after(@id, 'b')" />
550         <span class="theme-begin" x-node="begin" x-theme-class="{$id}" id="{@id}"></span>
551         <xsl:apply-templates select="following-sibling::motyw[@id = concat('m', $id)]" mode="theme-begin" />
552     </xsl:template>
553
554     <xsl:template match="motyw">
555         <span class="theme-ref" x-node="motyw" x-theme-class="{substring-after(@id, 'm')}" id="{@id}">
556             <xsl:value-of select="." />
557         </span>
558     </xsl:template>
559
560
561     <xsl:template match="end">
562         <span class="theme-end" x-node="end" x-theme-class="{substring-after(@id, 'e')}" id="{@id}">
563         </span>
564     </xsl:template>
565
566
567     <!--
568         ****************
569          TEKST WŁAŚCIWY
570         ****************
571     -->
572
573     <xsl:template match="text()">
574         <xsl:param name="mixed" />
575         <xsl:choose>
576             <xsl:when test="normalize-space(.) = ''" />
577             <xsl:when test="not($mixed)">
578                 <span x-node="text" class="out-of-flow-text"
579                     x-content="{normalize-space(.)}"></span>
580             </xsl:when>
581             <xsl:otherwise>
582                 <xsl:value-of select="." />
583             </xsl:otherwise>
584         </xsl:choose>
585     </xsl:template>
586
587     <xsl:template match="*">
588         <div x-node="error" x-content="{name()}" />
589     </xsl:template>
590     
591 </xsl:stylesheet>