89c9dfd5cd00eba27b223bb35c97a820aa593677
[librarian.git] / librarian / xslt / book2txt.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
12 <xsl:output encoding="utf-8" method="text" />
13
14 <xsl:param name="wrapping" select="0" />
15
16 <!-- ============================================================================== -->
17 <!-- = MASTER TAG                                                                 = -->
18 <!-- = (can contain block tags, paragraph tags, standalone tags and special tags) = -->
19 <!-- ============================================================================== -->
20 <xsl:template match="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny">
21 <xsl:if test="not (../@raw-text) and nazwa_utworu">
22     <xsl:apply-templates select="autor_utworu|dzielo_nadrzedne|nazwa_utworu|podtytul" mode="header" />
23     <xsl:call-template name="translators" />
24     <xsl:call-template name="isbn" />
25     <xsl:text>
26 </xsl:text>
27 </xsl:if>
28 <xsl:apply-templates />
29 <xsl:text>
30
31 </xsl:text>
32 </xsl:template>
33
34
35 <!-- ==================================================================================== -->
36 <!-- = BLOCK TAGS                                                                       = -->
37 <!-- = (can contain other block tags, paragraph tags, standalone tags and special tags) = -->
38 <!-- ==================================================================================== -->
39 <xsl:template match="nota">
40 <xsl:apply-templates />
41 </xsl:template>
42
43 <xsl:template match="lista_osob">
44 <xsl:text>
45
46
47 </xsl:text>
48 <xsl:value-of select="naglowek_listy" />
49 <xsl:apply-templates select="lista_osoba" />
50 <xsl:text>
51 </xsl:text>
52 </xsl:template>
53
54 <xsl:template match="dedykacja">
55 <xsl:text>
56
57 </xsl:text>
58 <xsl:apply-templates />
59 </xsl:template>
60
61 <xsl:template match="kwestia">
62 <xsl:apply-templates select="strofa|akap|didaskalia" />
63 </xsl:template>
64
65 <xsl:template match="dlugi_cytat|poezja_cyt">
66 <xsl:text>
67 </xsl:text>
68 <xsl:apply-templates />
69 </xsl:template>
70
71 <xsl:template match="motto">
72 <xsl:text>
73
74
75
76 </xsl:text>
77 <xsl:apply-templates /><xsl:text>
78
79 </xsl:text>
80 </xsl:template>
81
82
83 <!-- ========================================== -->
84 <!-- = PARAGRAPH TAGS                         = -->
85 <!-- = (can contain inline and special tags)  = -->
86 <!-- ========================================== -->
87 <!-- Title page -->
88 <xsl:template match="autor_utworu" mode="header">
89 <xsl:apply-templates mode="inline" />
90 <xsl:text>
91
92 </xsl:text>
93 </xsl:template>
94
95 <xsl:template match="nazwa_utworu" mode="header">
96 <xsl:apply-templates mode="inline" />
97 <xsl:text>
98 </xsl:text>
99 </xsl:template>
100
101 <xsl:template match="dzielo_nadrzedne" mode="header">
102 <xsl:apply-templates mode="inline" />
103 <xsl:text>
104 </xsl:text>
105 </xsl:template>
106
107 <xsl:template match="podtytul" mode="header">
108 <xsl:apply-templates mode="inline" />
109 <xsl:text>
110 </xsl:text>
111 </xsl:template>
112
113 <!-- Section headers (included in index)-->
114 <xsl:template match="naglowek_akt|naglowek_czesc|srodtytul">
115 <xsl:text>
116
117
118
119
120 </xsl:text>
121 <xsl:apply-templates mode="inline" />
122 </xsl:template>
123
124 <xsl:template match="naglowek_scena|naglowek_rozdzial">
125 <xsl:text>
126
127
128
129 </xsl:text>
130 <xsl:apply-templates mode="inline" />
131 </xsl:template>
132
133 <xsl:template match="naglowek_osoba|naglowek_podrozdzial">
134 <xsl:text>
135
136
137 </xsl:text>
138 <xsl:apply-templates mode="inline" />
139 </xsl:template>
140
141 <!-- Other paragraph tags -->
142 <xsl:template match="miejsce_czas">
143 <xsl:text>
144
145
146
147 </xsl:text>
148 <xsl:apply-templates mode="inline" />
149 </xsl:template>
150
151 <xsl:template match="didaskalia">
152 <xsl:variable name="content">
153     <xsl:apply-templates select="*|text()" mode="inline" />
154 </xsl:variable>
155 <xsl:text>
156
157 / </xsl:text><xsl:value-of select="wl:wrap_words(wl:strip($content), $wrapping)" /><xsl:text> /</xsl:text>
158 </xsl:template>
159
160 <xsl:template match="lista_osoba">
161 <xsl:text>
162  * </xsl:text>
163 <xsl:apply-templates mode="inline" />
164 </xsl:template>
165
166 <xsl:template match="akap|akap_dialog|akap_cd">
167 <xsl:variable name="content">
168     <xsl:apply-templates select="*|text()" mode="inline" />
169 </xsl:variable>
170 <xsl:text>
171
172 </xsl:text>
173 <xsl:value-of select="wl:wrap_words(wl:strip($content), $wrapping)" />
174 </xsl:template>
175
176 <xsl:template match="strofa">
177 <xsl:text>
178 </xsl:text>
179     <xsl:choose>
180         <xsl:when test="count(br) > 0">
181             <xsl:call-template name="verse">
182                 <xsl:with-param name="verse-content" select="br[1]/preceding-sibling::text() | br[1]/preceding-sibling::node()" />
183                 <xsl:with-param name="verse-type" select="br[1]/preceding-sibling::*[name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd'][1]" />
184             </xsl:call-template>
185             <xsl:for-each select="br">          
186                         <!-- Each BR tag "consumes" text after it -->
187                 <xsl:variable name="lnum" select="count(preceding-sibling::br)" />
188                 <xsl:call-template name="verse">
189                     <xsl:with-param name="verse-content"
190                         select="following-sibling::text()[count(preceding-sibling::br) = $lnum+1] | following-sibling::node()[count(preceding-sibling::br) = $lnum+1]" />
191                     <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]" />
192                 </xsl:call-template>
193             </xsl:for-each>
194         </xsl:when>
195         <xsl:otherwise>
196             <xsl:call-template name="verse">
197                 <xsl:with-param name="verse-content" select="text() | node()" />
198                 <xsl:with-param name="verse-type" select="wers_wciety|wers_akap|wers_cd[1]" />
199              </xsl:call-template>
200         </xsl:otherwise>
201     </xsl:choose>
202 </xsl:template>
203
204 <xsl:template name="verse">
205     <xsl:param name="verse-content" />
206     <xsl:param name="verse-type" />
207 <xsl:text>
208 </xsl:text>
209     <xsl:variable name="content">
210         <xsl:apply-templates select="$verse-content" mode="inline" />
211     </xsl:variable>
212     <xsl:choose>
213         <xsl:when test="name($verse-type) = 'wers_akap'">
214             <xsl:text>  </xsl:text>
215         </xsl:when>
216         <xsl:when test="name($verse-type) = 'wers_wciety'">
217             <xsl:choose>
218                 <xsl:when test="$verse-content/@typ">
219                     <xsl:text>    </xsl:text>
220                 </xsl:when>
221                 <xsl:otherwise>
222                     <xsl:text>  </xsl:text>
223                 </xsl:otherwise>
224             </xsl:choose>
225         </xsl:when>
226         <xsl:when test="name($verse-type) = 'wers_cd'">
227             <xsl:text>                        </xsl:text>
228         </xsl:when>
229     </xsl:choose>
230 <xsl:value-of select="wl:strip($content)" />
231 </xsl:template>
232
233 <xsl:template match="motto_podpis">
234 <xsl:apply-templates mode="inline" />
235 </xsl:template>
236
237 <xsl:template match="tabela|tabelka">
238         <xsl:text>
239
240 </xsl:text>
241 <xsl:apply-templates/>
242 <xsl:text>
243 </xsl:text>
244 </xsl:template>
245 <xsl:template match="wiersz">
246         <xsl:apply-templates />
247         <xsl:text>
248 </xsl:text>
249 </xsl:template>
250 <xsl:template match="kol">
251         <xsl:apply-templates mode="inline" />
252         <xsl:text>    </xsl:text>
253 </xsl:template>
254
255
256 <!-- ================================================ -->
257 <!-- = INLINE TAGS                                  = -->
258 <!-- = (contain other inline tags and special tags) = -->
259 <!-- ================================================ -->
260 <!-- Annotations -->
261 <xsl:template match="pa|pe|pr|pt" mode="inline" />
262
263 <!-- Other inline tags -->
264 <xsl:template match="mat" mode="inline"><xsl:apply-templates mode="inline" /></xsl:template>
265
266 <xsl:template match="didask_tekst" mode="inline"><xsl:apply-templates mode="inline" /></xsl:template>
267
268 <xsl:template match="slowo_obce" mode="inline"><xsl:apply-templates mode="inline" /></xsl:template>
269
270 <xsl:template match="tytul_dziela" mode="inline">
271 <xsl:if test="@typ = '1'">„</xsl:if><xsl:apply-templates mode="inline" /><xsl:if test="@typ = '1'">”</xsl:if>
272 </xsl:template>
273
274 <xsl:template match="wyroznienie" mode="inline">
275 <xsl:text>*</xsl:text><xsl:apply-templates mode="inline" /><xsl:text>*</xsl:text>
276 </xsl:template>
277
278 <xsl:template match="osoba" mode="inline">
279 <xsl:apply-templates mode="inline" />
280 </xsl:template>
281
282
283 <!-- ============================================== -->
284 <!-- = STANDALONE TAGS                            = -->
285 <!-- = (cannot contain any other tags)            = -->
286 <!-- ============================================== -->
287 <xsl:template match="sekcja_swiatlo">
288 <xsl:text>
289
290
291
292 </xsl:text>
293 </xsl:template>
294
295 <xsl:template match="sekcja_asterysk">
296 <xsl:text>
297
298 *
299
300 </xsl:text>
301 </xsl:template>
302
303 <xsl:template match="separator_linia">
304 <xsl:text>
305
306 ------------------------------------------------
307
308 </xsl:text>
309 </xsl:template>
310
311
312 <!-- ================ -->
313 <!-- = SPECIAL TAGS = -->
314 <!-- ================ -->
315 <!-- Themes -->
316 <xsl:template match="begin" mode="inline" />
317
318 <xsl:template match="end" mode="inline" />
319
320 <xsl:template match="begin|end" />
321
322 <xsl:template match="motyw" mode="inline" />
323
324 <xsl:template name="translators">
325     <xsl:if test="//dc:contributor.translator">
326         <text>tłum. </text>
327         <xsl:for-each select="//dc:contributor.translator/text()">
328             <xsl:if test="position() != 1">
329                 <xsl:text>, </xsl:text>
330             </xsl:if>
331             <xsl:value-of select="wl:person_name(.)" />
332         </xsl:for-each>
333         <xsl:text>
334 </xsl:text>
335     </xsl:if>
336 </xsl:template>
337
338 <xsl:template name="isbn">
339     <xsl:if test="//meta[@id='txt-id']">
340         <xsl:variable name="isbn" select="//meta[@id='txt-id']"/>
341         <text>
342 ISBN </text><xsl:value-of select="substring-after($isbn, 'ISBN-')"/>
343     </xsl:if>
344 </xsl:template>
345
346
347 <!-- ================ -->
348 <!-- = IGNORED TAGS = -->
349 <!-- ================ -->
350 <xsl:template match="extra|uwaga" />
351 <xsl:template match="extra|uwaga" mode="inline" />
352
353 <xsl:template match="nota_red" />
354 <xsl:template match="abstrakt" />
355
356 <!-- ======== -->
357 <!-- = TEXT = -->
358 <!-- ======== -->
359 <xsl:template match="text()" />
360 <xsl:template match="text()" mode="inline">
361     <xsl:value-of select="wl:substitute_entities(.)" />
362 </xsl:template>
363
364
365 </xsl:stylesheet>
366