0e2dbfe8c78262a3c19d0e9157aa23d83dd4e7c4
[librarian.git] / librarian / xslt / wl2tex.xslt
1 <?xml version="1.0" encoding="utf-8"?>
2 <!--
3  
4    This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
5    Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
6   
7 -->
8 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
9     xmlns:wl="http://wolnelektury.pl/functions"
10     xmlns:dc="http://purl.org/dc/elements/1.1/"
11     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
12
13 <xsl:output encoding="utf-8" indent="yes" version="2.0" />
14
15 <xsl:template match="utwor">
16     <TeXML xmlns="http://getfo.sourceforge.net/texml/ns1">
17         <TeXML escape="0">
18         \documentclass[a4paper, oneside, 11pt]{book}
19         \usepackage{wl}
20         </TeXML>
21
22         <xsl:choose>
23             <xsl:when test="@old-morefloats">
24                 <TeXML escape="0">
25                     \IfFileExists{morefloats.sty}{
26                         \usepackage{morefloats}
27                     }{}
28                 </TeXML>
29             </xsl:when>
30             <xsl:otherwise>
31                 <TeXML escape="0">
32                     \usepackage[maxfloats=64]{morefloats}
33                 </TeXML>
34             </xsl:otherwise>
35         </xsl:choose>
36
37         <xsl:apply-templates select="rdf:RDF" mode="titlepage" />
38         <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" mode='titlepage' />
39
40         <env name="document">
41             <cmd name="maketitle" />
42
43             <xsl:choose>
44                 <xsl:when test="(powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny)/nazwa_utworu">
45                     <xsl:apply-templates select="(powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny)/autor_utworu" mode="title" />
46                     <!-- title in master -->
47                 </xsl:when>
48                 <xsl:otherwise>
49                     <!-- look for author title in dc -->
50                     <xsl:apply-templates select="rdf:RDF" mode="firstdctitle" />
51                     <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" mode='firstdctitle' />
52                 </xsl:otherwise>
53             </xsl:choose>
54             <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" />
55             <xsl:apply-templates select="utwor" mode="part" />
56         </env>
57     </TeXML>
58 </xsl:template>
59
60 <xsl:template match="utwor" mode="part">
61     <!-- title for empty dc -->
62     <xsl:choose>
63         <xsl:when test="(powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny)/nazwa_utworu">
64             <!-- title in master -->
65         </xsl:when>
66         <xsl:otherwise>
67             <!-- look for title in dc -->
68             <xsl:apply-templates select="rdf:RDF" mode="dctitle" />
69             <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" mode='dctitle' />
70         </xsl:otherwise>
71     </xsl:choose>
72
73     <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" />
74     <xsl:apply-templates select="utwor" mode="part" />
75 </xsl:template>
76
77 <!-- =================== -->
78 <!-- = MAIN TITLE PAGE = -->
79 <!-- = (from DC)       = -->
80 <!-- =================== -->
81
82 <xsl:template match="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" mode="titlepage">
83     <xsl:apply-templates select="rdf:RDF" mode="titlepage" />
84 </xsl:template>
85
86 <xsl:template match="rdf:RDF" mode="titlepage">
87     <cmd name='title'><parm>
88         <xsl:apply-templates select=".//dc:title/node()" mode="inline" />
89     </parm></cmd>
90     <cmd name='author'><parm>
91         <xsl:apply-templates select=".//dc:creator_parsed/node()" mode="inline" />
92     </parm></cmd>
93     <TeXML escape="0">
94         \def\sourceinfo{<TeXML escape="1"><xsl:apply-templates select=".//dc:source/node()" mode="inline" /></TeXML>}
95     </TeXML>
96 </xsl:template>
97
98
99 <!-- ============== -->
100 <!-- = BOOK TITLE = -->
101 <!-- = (from DC)  = -->
102 <!-- ============== -->
103
104 <xsl:template match="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" mode="dctitle">
105     <xsl:apply-templates select="rdf:RDF" mode="dctitle" />
106 </xsl:template>
107
108 <xsl:template match="rdf:RDF" mode="dctitle">
109     <cmd name="nazwapodutworu"><parm>
110         <xsl:apply-templates select=".//dc:title/node()" mode="inline" />
111     </parm></cmd>
112 </xsl:template>
113
114 <xsl:template match="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" mode="firstdctitle">
115     <xsl:apply-templates select="rdf:RDF" mode="firstdctitle" />
116 </xsl:template>
117
118 <xsl:template match="rdf:RDF" mode="firstdctitle">
119     <cmd name="autorutworu"><parm>
120         <xsl:apply-templates select=".//dc:creator_parsed/node()" mode="inline" />
121     </parm></cmd>
122     <cmd name="nazwautworu"><parm>
123         <xsl:apply-templates select=".//dc:title/node()" mode="inline" />
124     </parm></cmd>
125 </xsl:template>
126
127
128 <!-- ============================================================================== -->
129 <!-- = MASTER TAG                                                                 = -->
130 <!-- = (can contain block tags, paragraph tags, standalone tags and special tags) = -->
131 <!-- ============================================================================== -->
132 <!-- ==================================================================================== -->
133 <!-- = BLOCK TAGS                                                                       = -->
134 <!-- = (can contain other block tags, paragraph tags, standalone tags and special tags) = -->
135 <!-- ==================================================================================== -->
136
137 <xsl:template 
138     match="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny|nota|dedykacja|dlugi_cytat|poezja_cyt|motto">
139     <cmd>
140         <xsl:attribute name="name">
141             <xsl:value-of select="wl:texcommand(name())" />
142         </xsl:attribute>
143         <parm><xsl:apply-templates/></parm>
144     </cmd>
145 </xsl:template>
146
147 <xsl:template match="lista_osob">
148     <cmd name="listaosob">
149         <parm><xsl:apply-templates select="naglowek_listy" /></parm>
150         <parm><xsl:apply-templates select="lista_osoba" /></parm>
151     </cmd>
152 </xsl:template>
153
154 <xsl:template match="kwestia">
155     <cmd name="kwestia">
156         <parm><xsl:apply-templates select="strofa|akap|didaskalia" /></parm>
157     </cmd>
158 </xsl:template>
159
160
161 <!-- ========================================== -->
162 <!-- = PARAGRAPH TAGS                         = -->
163 <!-- = (can contain inline and special tags)  = -->
164 <!-- ========================================== -->
165
166 <!-- only in root -->
167 <xsl:template match="autor_utworu" mode="title">
168     <cmd name="autorutworu"><parm>
169         <xsl:apply-templates mode="inline" />
170     </parm></cmd>
171 </xsl:template>
172
173
174 <xsl:template 
175     match="nazwa_utworu|naglowek_akt|naglowek_czesc|srodtytul|naglowek_osoba|naglowek_podrozdzial|naglowek_scena|naglowek_rozdzial|miejsce_czas|didaskalia|lista_osoba|akap|akap_dialog|akap_cd|motto_podpis|naglowek_listy">
176     <cmd>
177         <xsl:attribute name="name">
178             <xsl:value-of select="wl:texcommand(name())" />
179         </xsl:attribute>
180         <parm><xsl:apply-templates mode="inline"/></parm>
181     </cmd>
182 </xsl:template>
183
184 <xsl:template match="strofa">
185   <cmd name="strofa"><parm>
186     <xsl:choose>
187         <xsl:when test="count(br) > 0">
188             <xsl:call-template name="verse">
189                 <xsl:with-param name="verse-content" select="br[1]/preceding-sibling::text() | br[1]/preceding-sibling::node()" />
190                 <xsl:with-param name="verse-type" select="br[1]/preceding-sibling::*[name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd'][1]" />
191             </xsl:call-template>
192             <xsl:for-each select="br">
193                 <TeXML escape="0">\\{}</TeXML>
194                 <!-- Each BR tag "consumes" text after it -->
195                 <xsl:variable name="lnum" select="count(preceding-sibling::br)" />
196                 <xsl:call-template name="verse">
197                     <xsl:with-param name="verse-content"
198                         select="following-sibling::text()[count(preceding-sibling::br) = $lnum+1] | following-sibling::node()[count(preceding-sibling::br) = $lnum+1]" />
199                     <xsl:with-param name="verse-type" select="following-sibling::*[count(preceding-sibling::br) = $lnum+1 and (name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd')][1]" />
200                 </xsl:call-template>
201             </xsl:for-each>
202         </xsl:when>
203         <xsl:otherwise>
204             <xsl:call-template name="verse">
205                 <xsl:with-param name="verse-content" select="text() | node()" />
206                 <xsl:with-param name="verse-type" select="wers_wciety|wers_akap|wers_cd[1]" />
207             </xsl:call-template>
208         </xsl:otherwise>
209     </xsl:choose>
210   </parm></cmd>
211 </xsl:template>
212
213
214 <xsl:template name="verse">
215     <xsl:param name="verse-content" />
216     <xsl:param name="verse-type" />
217
218     <cmd>
219         <xsl:attribute name="name">
220             <xsl:choose>
221                 <xsl:when test="$verse-type != ''">
222                     <xsl:value-of select='wl:texcommand(name($verse-type))' />
223                 </xsl:when>
224                 <xsl:otherwise>wers</xsl:otherwise>
225             </xsl:choose>
226         </xsl:attribute>
227         <xsl:if test="string($verse-content/@typ)">
228             <opt><xsl:value-of select="$verse-content/@typ" />em</opt>
229         </xsl:if>
230         <parm><xsl:apply-templates select="$verse-content" mode="inline"/></parm>
231     </cmd>
232 </xsl:template>
233
234 <!-- ================================================ -->
235 <!-- = INLINE TAGS                                  = -->
236 <!-- = (contain other inline tags and special tags) = -->
237 <!-- ================================================ -->
238
239 <xsl:template mode="inline"
240     match="pa|pe|pr|pt|mat|didask_tekst|slowo_obce|wyroznienie|osoba">
241     <cmd>
242         <xsl:attribute name="name">
243             <xsl:value-of select="wl:texcommand(name())" />
244         </xsl:attribute>
245         <parm><xsl:apply-templates mode="inline"/></parm>
246     </cmd>
247 </xsl:template>
248
249
250
251 <xsl:template match="tytul_dziela" mode="inline">
252     <cmd name="tytuldziela"><parm>
253         <xsl:if test="@typ = '1'">„</xsl:if><xsl:apply-templates mode="inline" /><xsl:if test="@typ = '1'">”</xsl:if>
254     </parm></cmd>
255 </xsl:template>
256
257
258
259 <!-- ============================================== -->
260 <!-- = STANDALONE TAGS                            = -->
261 <!-- = (cannot contain any other tags)            = -->
262 <!-- ============================================== -->
263 <xsl:template
264     match="sekcja_swiatlo|sekcja_asterysk|separator_linia">
265     <cmd>
266         <xsl:attribute name="name">
267             <xsl:value-of select="wl:texcommand(name())" />
268         </xsl:attribute>
269     </cmd>
270 </xsl:template>
271
272
273 <!-- ================ -->
274 <!-- = SPECIAL TAGS = -->
275 <!-- ================ -->
276 <!-- Themes -->
277
278
279 <xsl:template match="begin|end|motyw">
280     <xsl:apply-templates select='.' mode="inline" />
281 </xsl:template>
282
283 <xsl:template match="begin" mode="inline" />
284 <xsl:template match="end" mode="inline" />
285
286 <xsl:template match="motyw" mode="inline">
287     <cmd name="motyw">
288         <xsl:if test="@moved">
289             <opt name="moved"><xsl:value-of select="@moved" /></opt>
290         </xsl:if>
291         <parm><xsl:apply-templates mode="inline" /></parm>
292     </cmd>
293 </xsl:template>
294
295
296 <!-- ============== -->
297 <!-- = ADDED TAGS = -->
298 <!-- ============== -->
299
300
301 <xsl:template match="dywiz" mode="inline">
302     <cmd name="dywiz" />
303 </xsl:template>
304
305 <xsl:template match="nbsp" mode="inline">
306     <spec cat="tilde" />
307 </xsl:template>
308
309 <!-- ================ -->
310 <!-- = IGNORED TAGS = -->
311 <!-- ================ -->
312 <xsl:template match="extra|uwaga" />
313 <xsl:template match="extra|uwaga" mode="inline" />
314
315 <xsl:template match="nota_red" />
316
317 <!-- ======== -->
318 <!-- = TEXT = -->
319 <!-- ======== -->
320 <xsl:template match="text()" />
321 <xsl:template match="text()" mode="inline">
322     <xsl:if test="preceding-sibling::node() and wl:starts_white(.)">
323       <xsl:text> </xsl:text>
324     </xsl:if>
325
326     <xsl:value-of select="wl:substitute_entities(wl:strip(.))" />
327
328     <xsl:if test="following-sibling::node() and wl:ends_white(.)">
329       <xsl:text> </xsl:text>
330     </xsl:if>
331 </xsl:template>
332
333
334 </xsl:stylesheet>