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