tei2teisimple.xqm 32 KB
Newer Older
MRodz's avatar
MRodz committed
1
2
xquery version "3.1";

3
(:~
Michelle Rodzis's avatar
Michelle Rodzis committed
4
5
 : This modules handles the conversion of the Fontante-TEI/XML into TEI simplePrint
 : for the edited text. The resulting TEI simplePrint is the basis for the "Editerter
6
 : Text" (edited text) view on the website and the book. It represents the latest
Michelle Rodzis's avatar
Michelle Rodzis committed
7
 : layer of text.
8
 :
MRodz's avatar
MRodz committed
9
10
 : @author Michelle Rodzis
 : @version 0.1
Michelle Rodzis's avatar
Michelle Rodzis committed
11
 : @since TODO
MRodz's avatar
MRodz committed
12
13
 :)

14
module namespace fontaneSimple="http://fontane-nb.dariah.eu/teisimple";
MRodz's avatar
MRodz committed
15
16

declare namespace tei="http://www.tei-c.org/ns/1.0";
MRodz's avatar
MRodz committed
17
declare namespace test="http://exist-db.org/xquery/xqsuite";
MRodz's avatar
MRodz committed
18
19

import module namespace console="http://exist-db.org/xquery/console";
20
import module namespace simpleHelpers="http://fontane-nb.dariah.eu/teisimplehelpers" at "teisimplehelpers.xqm";
MRodz's avatar
MRodz committed
21

22
(:~
MRodz's avatar
MRodz committed
23
 : The main function initiates the transformation of a given notebook.
24
 :
MRodz's avatar
MRodz committed
25
 : TODO: adapt to several input files?
26
 :
MRodz's avatar
MRodz committed
27
 : :)
MRodz's avatar
MRodz committed
28
declare function fontaneSimple:main($file as xs:string) as node()? {
29
  let $doc :=
MRodz's avatar
MRodz committed
30
    try {
31
      (doc("/db/sade-projects/textgrid/data/xml/data/" || $file))
MRodz's avatar
MRodz committed
32
33
34
    } catch * {
      (console:log("It was not possible to open the requested file " || $file))
    }
35

MRodz's avatar
Fix #23    
MRodz committed
36
37
    let $front-covers := $doc//tei:sourceDoc/tei:surface[contains(@n, "front_cover")]
    let $back-covers := $doc//tei:sourceDoc/tei:surface[contains(@n, "back_cover")]
38
    let $content := $doc//tei:sourceDoc/tei:surface[not(contains(@n, "cover")
MRodz's avatar
MRodz committed
39
        or matches(@n, "spine"))]
40

41
    let $tei := <TEI xmlns="http://www.tei-c.org/ns/1.0">
MRodz's avatar
MRodz committed
42
        {$doc//tei:teiHeader}
MRodz's avatar
MRodz committed
43
        <text>
44
45
46
            <front>{fontaneSimple:transform($front-covers)}</front>
            <body>{fontaneSimple:transform($content)}</body>
            <back>{fontaneSimple:transform($back-covers)}</back>
MRodz's avatar
MRodz committed
47
        </text>
MRodz's avatar
MRodz committed
48
      </TEI>
49
     let $store := xmldb:store("/db/apps/SADE/resources/xml/", "tei-simple-pre.xml", $tei)
MRodz's avatar
MRodz committed
50
    return $tei
MRodz's avatar
MRodz committed
51
52
};

53
(:~
54
55
56
57
58
59
60
61
62
 : Recursivly iterates the passed nodes and converts them according to the
 : requirements for the "Edierter Text". While it convers almost all of the
 : requirements stated in the encoding documentation (c.f.
 : https://fontane-nb.dariah.eu/doku.html), some parts of it are handled in a
 : second step (c.f. TODO) - especially the removal of tei:handShift duplicates
 : and the tei:milestone expansion to tei:div[@type = "section"] resp. tei:p -
 : because it is easier to perform these steps after the XML hierarchy has been
 : flattened a bit.
 :
MRodz's avatar
MRodz committed
63
 : @author Michelle Rodzis
64
 : @param $nodes the elements of the book covers and the book content
Michelle Rodzis's avatar
Michelle Rodzis committed
65
 : @return $node()* a TEI simplePrint element
MRodz's avatar
MRodz committed
66
 :)
67
declare function fontaneSimple:transform($nodes as node()*) as node()* {
MRodz's avatar
MRodz committed
68
69
70
    for $node in $nodes
      return
        typeswitch ($node)
MRodz's avatar
MRodz committed
71
        case text() return
MRodz's avatar
MRodz committed
72
73
74
75
76
77
78
            if($node/ancestor::tei:line
            or $node/ancestor::tei:figDesc
            or $node/ancestor::tei:desc[@type = "edited_text"]
            or $node/ancestor::tei:note[@type = "editorial"]) then
                simpleHelpers:prepare-text($node)
            else
                ()
79

MRodz's avatar
MRodz committed
80
81
82
        case element(tei:lb) return
            if($node[@break = "keepHyphen"]) then
                ()
83
84
            else if($node[@break = "no"]) then
                fontaneSimple:mark-intervention($node)
MRodz's avatar
MRodz committed
85
            else
86
                fontaneSimple:copy-element($node)
87

MRodz's avatar
MRodz committed
88
89
90
91
        case element(tei:g) return
            if($node[@ref = "#vds"]) then
                ()
            else if($node/@ref ="#rth" or $node/@ref ="#hb") then
92
                fontaneSimple:copy-element($node)
MRodz's avatar
MRodz committed
93
            else
94
                fontaneSimple:transform($node/node())
95

MRodz's avatar
MRodz committed
96
97
        case element(tei:del) return
            if($node/parent::tei:restore) then
98
                fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
99
            else if($node/descendant::tei:restore) then
100
                fontaneSimple:transform($node/descendant::tei:restore)
MRodz's avatar
MRodz committed
101
            else
MRodz's avatar
MRodz committed
102
                ()
103

MRodz's avatar
MRodz committed
104
105
106
107
108
        case element(tei:restore) return
            if(count($node/child::*) = 1 and $node/child::tei:del
            and $node/ancestor::tei:del) then
                ()
            else
109
                fontaneSimple:transform($node/node())
110

MRodz's avatar
MRodz committed
111
112
113
        case element(tei:retrace) return
            if($node/@rend) then
                element tei:seg {
Michelle Rodzis's avatar
Michelle Rodzis committed
114
                    attribute rendition {$node/@rend},
115
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
116
117
                }
            else
118
                fontaneSimple:transform($node/node())
119

120
        case element(tei:add) return
121
            if($node/@type = "edited_text"
122
            or $node/child::tei:seg[@type = "multiphrase"]) then
123
                fontaneSimple:copy-element($node)
124
125
126
127
(:                :)
(:            else if($node[matches(@copyOf, $node/preceding::tei:seg/@xml:id):)
(:                and not(@cause = "unclear")]) then:)
(:                fontaneSimple:mark-intervention($node):)
128
                
129
130
131
132
133
            
            else if($node/@cause = "unclear") then
                ()
                
            else if($node[matches(@copyOf, $node/preceding::tei:seg/@xml:id)]) then
134
                fontaneSimple:mark-intervention($node)
135
                
136
            else if($node/@cause ="catchword") then
MRodz's avatar
MRodz committed
137
                ()
138
                
MRodz's avatar
MRodz committed
139
            else if($node/@rend ="|") then
140
                fontaneSimple:transform($node/node())
141
                
142
            else if(not($node/@xml:id)) then
143
                fontaneSimple:transform($node/node())
144
                
145
            else if(simpleHelpers:is-transposed($node)) then
146
147
                let $corresp := //tei:metamark[matches(@target, $node/@xml:id)]
                return
148
149
                    (fontaneSimple:transform($corresp/node()),
                    fontaneSimple:transform($node/node()))
150
                    
151
            else
152
                fontaneSimple:transform($node/node())
153

154
155
        case element(tei:addSpan) return
            if($node/@type = "edited_text") then
156
                fontaneSimple:copy-element($node)
157
            else
158
159
                ()

160
161
        case element(tei:fw) return
            ()
162

163
        case element(tei:line) return
Michelle Rodzis's avatar
Michelle Rodzis committed
164
            if($node/@type = "heading") then
165
                fontaneSimple:make-head($node)
166

167
            else if(simpleHelpers:has-valid-style($node)
168
            or matches($node/@rendition, "black_letter")
169
            or matches($node/@rendition, "roman")) then
170
                fontaneSimple:make-seg-with-rendition($node)
171
172
                
            else if($node/following::*[1][self::tei:lb[@break = "no"]]) then
173
                (simpleHelpers:start-line($node),
174
                simpleHelpers:trim-last-char($node))
175
176
                
            else if ($node/preceding::*[1][self::tei:lb[@break = "no"]]) then
177
                (simpleHelpers:start-line($node),
178
                simpleHelpers:trim-first-char($node))
179
180
                
            else if($node/@type = "verse") then
MRodz's avatar
MRodz committed
181
182
183
184
185
186
187
188
189
190
191
192
193
                if(not($node/@next)) then
                    (if(not($node/preceding-sibling::tei:line[@type = "verse"])) then
                        fontaneSimple:mark-linegroup-beginning()
                    else
                        (),
                    element tei:l {
                            fontaneSimple:transform($node/node())
                        },
                    if(not($node/following-sibling::tei:line[@type = "verse"])) then
                        fontaneSimple:mark-linegroup-end()
                    else
                        ())  
                (: 3.8.2.2.1.3 Vers mit anderer Beschriftung in einer Zeile :)
194
                else
MRodz's avatar
MRodz committed
195
196
197
198
199
200
201
202
203
204
205
206
207
                    let $corresp := $node/following::tei:seg[@type = "verse" 
                        and matches($node/@next, @xml:id)]
                    return
                        (fontaneSimple:mark-linegroup-beginning(),
                        element tei:l {
                            fontaneSimple:transform($node/node()),
                            simpleHelpers:start-line($node),
                            fontaneSimple:transform($corresp/node())
                        },
                        fontaneSimple:mark-linegroup-end())
                    
            else if($node/parent::tei:zone[@type = "verse"]/child::*[1] = $node) then
                fontaneSimple:transform($node/node())             
208
                
209
210
211
            (: with opting for a tei:milestone we try to meet the project's
            requirements on the one hand while avoiding to run into hierarchical
            problems in the further processing on the other hand:)
212
            else if(not($node/@type = "item")) then
213
                (simpleHelpers:start-line($node),
214
                fontaneSimple:transform($node/node()))
215
                
216
217
            else if($node/@type = "item" and not($node/@xml:id)) then
                element tei:item {
Michelle Rodzis's avatar
Michelle Rodzis committed
218
219
220
221
                    if($node/@rend) then
                        attribute rendition {$node/@rend}
                    else
                        (),
222
                    fontaneSimple:transform($node/node())
223
                }
224
                
225
            else if($node/@type = "item"
226
            and simpleHelpers:is-transposed($node)) then
227
                ()
228
                
229
            else
230
                (simpleHelpers:start-line($node),
231
                fontaneSimple:transform($node/node()))
232

233
        case element(tei:handShift) return
234
            fontaneSimple:enhance-handshift($node)
235

236
        case element(tei:stamp) return
Michelle Rodzis's avatar
Michelle Rodzis committed
237
238
239
240
            if($node/ancestor::tei:surface[matches(@n, "Beilage")]) then
                fontaneSimple:copy-element($node)
            else
                ()
241

242
        case element(tei:seg) return
243
            if(count($node/*) = 1 and
Michelle Rodzis's avatar
Michelle Rodzis committed
244
245
246
            (($node/tei:stamp 
                and not($node/ancestor::tei:surface[matches(@n, "Beilage")]))
            or $node/tei:metamark[@function = "caret"]))
247
248
                then
                    ()
249

MRodz's avatar
MRodz committed
250
            else if($node/@type = "heading") then
MRodz's avatar
MRodz committed
251
252
253
254
255
256
257
258
259
260
261
262
263
                element tei:seg {
                    $node/@type,
                    $node/@subtype,
                    (if($node/@rendition) then
                        $node/@rendition
                    else
                        ()),         
                    (if($node/@rend) then
                        $node/@rend
                    else
                        ()),        
                    fontaneSimple:transform($node/node())
                }
264
265

            else if(matches($node/@style, "underline")
266
            and not(matches($node/@style, "vertical-align"))) then
267
                fontaneSimple:transform($node/node())
268

269
            else if(simpleHelpers:has-valid-style($node)
270
            or matches($node/@rendition, "black_letter")
271
            or matches($node/@rendition, "roman")) then
272
                fontaneSimple:make-seg-with-rendition($node)
273
274
275

            else if($node/@type = "initials"
            or $node/@type = "monogram"
MRodz's avatar
MRodz committed
276
277
            or $node/@type = "multiphrase"
            or $node/@xml:lang)
278
                then
279
                    fontaneSimple:copy-element($node)
280
281

            else if($node/@type = "auction_number"
282
            or $node/@type = "cancel"
MRodz's avatar
MRodz committed
283
284
            or $node/@type = "abort"
            or $node/@function ="unknown")
285
286
                then
                    ()
287
288
289
                    
            else if($node/parent::tei:add and $node/@copyOf) then
                fontaneSimple:mark-intervention($node)
MRodz's avatar
MRodz committed
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
                
            else if($node/@type = "verse" and $node/@prev) then
                ()
                
            else if($node/@type = "said") then
                if($node/@next) then
                    let $next := replace($node/@next, "#", "")
                    let $corresp := $node/following::*[@xml:id = $next]
                    return
                        (element tei:seg {
                            $node/@type,
                            fontaneSimple:transform($node/node()),
                            fontaneSimple:transform($corresp/node())
                        },
                        element tei:lb {
                            attribute type {"edited_text"}
                        })
                else
                    element tei:seg {
                        $node/@type,
                        fontaneSimple:transform($node/node())
                    }
312

313
            else
314
                fontaneSimple:transform($node/node())
315

MRodz's avatar
MRodz committed
316
        case element(tei:hi) return
317
            fontaneSimple:copy-element($node)
318
319

        (: TODO if $node/@type = "highlighted" then make
320
        a hi[@type = "vertical-mark"] in the second stage of creating the
321
        simple format. use simpleHelpers:get-xml-chunk($node) for this.:)
322
323
        case element(tei:mod) return
            if($node/@type = "highlighted"
324
            and simpleHelpers:is-hand-contemporary($node/@hand)) then
325
                $node
326
327
            else
                fontaneSimple:transform($node/node())
328

329
        case element(tei:anchor) return
330
            fontaneSimple:copy-element($node)
331
332

        case element(tei:surface) return
MRodz's avatar
MRodz committed
333
            if(matches($node/@n, "cover")) then
Michelle Rodzis's avatar
Michelle Rodzis committed
334
335
                (fontaneSimple:make-pb-with-type($node/@n),
                fontaneSimple:transform($node/node()))
Michelle Rodzis's avatar
Michelle Rodzis committed
336
337
338
339
340
341
342
343
344
345
346
347
348
                
            else if(matches($node/@n, "Beilage")) then
                element tei:div {
                    $node/@*,
                    fontaneSimple:transform($node/node())
                }
                
            else if($node/@type = "pocket") then
                (fontaneSimple:make-pb($node),
                element tei:div {
                    $node/(@* except (@n, @ulx, @uly, @lry, @lrx)),
                    fontaneSimple:transform($node/node())
                })
Michelle Rodzis's avatar
Michelle Rodzis committed
349
            
350
            else if(simpleHelpers:is-page($node)
MRodz's avatar
MRodz committed
351
            and $node/@type = "clipping") then
352
                (fontaneSimple:make-pb($node),
MRodz's avatar
MRodz committed
353
354
                (if(not($node/@subtype = "Kalenderblatt"
                or $node/@subtype = "Zeitungsausschnitt_Fragment")) then
Michelle Rodzis's avatar
Michelle Rodzis committed
355
356
357
358
                    element tei:div {
                        $node/(@* except (@n, @ulx, @uly, @lry, @lrx)),
                        fontaneSimple:transform($node/node())
                    }
MRodz's avatar
MRodz committed
359
360
                else
                    ()))
Michelle Rodzis's avatar
Michelle Rodzis committed
361
            
362
            else if(simpleHelpers:is-page($node)) then
363
                (fontaneSimple:make-pb($node),
364
                fontaneSimple:transform($node/node()))
Michelle Rodzis's avatar
Michelle Rodzis committed
365
            
366
            else if($node/@type = "label" and
367
            (contains($node/@subtype, "Fontane")
368
            or contains($node/@subtype, "Hersteller"))
369
            ) then
370
                fontaneSimple:make-div($node)
Michelle Rodzis's avatar
Michelle Rodzis committed
371
            
MRodz's avatar
MRodz committed
372
373
            else
                ()
374

MRodz's avatar
MRodz committed
375
376
377
378
        case element(tei:milestone) return
            if($node/@unit = "illustration") then
                ()
            else
379
                fontaneSimple:copy-element($node)
380

381
        case element(tei:gap) return
382
            fontaneSimple:copy-element($node)
383

384
        case element(tei:metamark) return
385
            if($node/@function = "integrate"
386
387
388
389
            or $node/@function = "authorial_note") then
                element tei:ab {
                    $node/@*
                }
390
            else if($node/@function = "placeholder"
391
392
393
394
395
            or $node/@function ="etc."
            or $node/@function ="caret"
            or $node/@function ="footnotes"
            or $node/@function ="ellipsis"
            or $node/@function = "paragraph") then
MRodz's avatar
MRodz committed
396
397
                element tei:ab {
                    attribute type {$node/@function},
398
                    fontaneSimple:transform($node/node())
399
                }
400
401
            else
                ()
402

403
        case element(tei:surplus) return
404
            fontaneSimple:mark-intervention($node)
405

MRodz's avatar
MRodz committed
406
        case element(tei:zone) return
407
            if(matches($node/@style, "border-style:solid")
MRodz's avatar
MRodz committed
408
409
410
411
            and not(matches($node/@style, "border-radius"))
            and not($node/@rend = "border-style:house")) then
                element tei:div {
                    attribute type {"frame"},
412
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
413
                }
414

MRodz's avatar
MRodz committed
415
            else if(matches($node/@rend, "border-bottom-style:brace")) then
416
                (fontaneSimple:transform($node/node()),
MRodz's avatar
MRodz committed
417
418
                element tei:ab {
                    attribute type {"bottom-brace"}
419
420
                })

MRodz's avatar
MRodz committed
421
422
            else if($node/@type = "cancel") then
                ()
423

MRodz's avatar
MRodz committed
424
425
426
427
            else if($node/@type = "marked_off") then
                element tei:seg {
                    $node/@type,
                    $node/@xml:id,
428
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
429
                }
430

MRodz's avatar
MRodz committed
431
432
            else if($node/@type = "highlighted") then
                if($node/child::tei:zone[@type = "highlighted"]) then
433
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
434
435
436
                else
                    element tei:hi {
                        attribute type {"vertical-mark"},
437
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
438
                    }
439

440
441
            else if($node/@type = "illustration"
            or $node/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
442
443
444
445
446
447
448
                if(not($node//tei:figure/parent::tei:del)) then
                    element {QName("http://www.tei-c.org/ns/1.0", "ab")}{
                        (if($node/child::tei:zone[@type = "illustration"]) then
                            attribute type {"composed-sketch"}
                        else
                            (attribute type {"sketch"},
                            if($node/parent::tei:zone[@type = "illustration"]) then
449
                                attribute rendition {"margin-left:" || $node/@ulx
MRodz's avatar
MRodz committed
450
451
452
453
454
                                || "cm; " || "margin-top:" || $node/@uly || "cm"}
                            else
                                ()
                            )
                        ),
455
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
456
                    }
457
                else
MRodz's avatar
MRodz committed
458
                    ()
459

460
461
            else if($node/parent::tei:zone/@type = "illustration"
            or $node/parent::tei:zone/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
462
463
                element {QName("http://www.tei-c.org/ns/1.0", "seg")}{
                    attribute type {"caption"},
464
                    attribute rendition {"margin-left:" || $node/@ulx || "cm; "
MRodz's avatar
MRodz committed
465
                        || "margin-top:" || $node/@uly || "cm"},
466
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
467
                }
468

MRodz's avatar
MRodz committed
469
            else if($node/@type = "heading") then
470
                fontaneSimple:make-head($node)
471

MRodz's avatar
MRodz committed
472
            else if($node/@type = "list" or $node/@type = "item") then
473
                element {QName("http://www.tei-c.org/ns/1.0", $node/@type)} {
Michelle Rodzis's avatar
Michelle Rodzis committed
474
475
476
477
478
                    $node/(@xml:id, @subtype, @rendition, @prev, @next),
                    if($node/@rend) then
                        attribute rendition {$node/@rend}
                    else
                        (),                    
479
                    fontaneSimple:transform($node/node())
480
                }
Michelle Rodzis's avatar
Michelle Rodzis committed
481
                
MRodz's avatar
MRodz committed
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
            else if($node/@type = "dialogue") then
                element tei:div {
                    $node/@type,
                    fontaneSimple:transform($node/node())
                }
                
            else if($node/@type = "verse") then
                (fontaneSimple:mark-linegroup-beginning(),
                element tei:l {
                    fontaneSimple:transform($node/node())
                },
                fontaneSimple:mark-linegroup-end())
                
            else if($node/@type = "said" and $node/@prev) then
                ()
                
            else if($node/@type = "said") then
                element tei:seg {
                    $node/@type,
                    fontaneSimple:transform($node/node())
                }
                
Michelle Rodzis's avatar
Michelle Rodzis committed
504
505
            else if($node/@type = "toc") then
                element tei:list {
506
                    $node/(@type, @subtype),
Michelle Rodzis's avatar
Michelle Rodzis committed
507
508
                    fontaneSimple:transform($node/node())
                }
509

MRodz's avatar
MRodz committed
510
511
            else if($node/@type = "legend") then
                element {QName("http://www.tei-c.org/ns/1.0", "div")}{
512
                    (if($node/@style
513
514
515
516
517
                    or $node/@rendition) then
                        attribute rendition {simpleHelpers:filter-rendition($node)}
                    else
                        ()),
                    $node/(@* except (@rendition, @style)),
518
                    fontaneSimple:transform($node/node())
519
                }
Michelle Rodzis's avatar
Michelle Rodzis committed
520
521
522
523
524
525
                
            else if($node/@type = "additional") then
                element tei:ab {
                    $node/(@* except (@ulx, @uly, @lry, @lrx)),
                    fontaneSimple:transform($node/node())
                }
526

527
            else if(simpleHelpers:has-valid-style($node)
528
            or matches($node/@rendition, "black_letter")
529
            or matches($node/@rendition, "roman")) then
530
                fontaneSimple:make-seg-with-rendition($node)
531

532
            else if(not($node/@xml:id)) then
533
                fontaneSimple:transform($node/node())
534

535
536
537
538
539
540
541
542
            else if($node/@xml:id) then
                element tei:seg {
                    $node/@xml:id,
                    $node/@prev,
                    $node/@next,
                    $node/@corresp,
                    fontaneSimple:transform($node/node())
                }
543

MRodz's avatar
MRodz committed
544
            else
545
                fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
546
547
548
549
550
551
552
553
554
555
556
557
                
        case element(tei:said) return
            (element tei:seg {
                attribute type {"said"},
                fontaneSimple:transform($node/node())
            },
            if($node/ancestor::tei:zone[@type = "dialogue"]/descendant::tei:said[position() != last()] = $node) then
                element tei:lb {
                        attribute type {"edited_text"}
                }
            else
                ())
558

MRodz's avatar
MRodz committed
559
        case element(tei:figure) return
560
            if(count($node/child::*) = 1 and $node/child::tei:figDesc) then
561
                (: genealogy lines probably shouldn't be displayed, but I still have to
562
563
564
565
                check that. in case they should be serialized, I leave the code :)
(:                if(matches($node/descendant::tei:ref, "Stammbaumverbindungslinie")) then:)
(:                    element tei:seg {:)
(:                        $node/@*,:)
566
(:                        fontaneSimple:transform($node/node()):)
567
568
569
570
571
572
(:                    }:)
(:                else if(matches($node/descendant::tei:ref, "Schlusslinie")):)
                if(matches($node/descendant::tei:ref, "Schlusslinie"))
                    then
                        element tei:ab {
                            switch ($node/descendant::tei:ref)
573
574
575
                                case "horizontale einfache Schlusslinie" return
                                    attribute type {"long-end-line"}
                                case "Schlusslinie; horizontale Halbschleife von links oben nach rechts" return
576
                                    attribute type {"long-end-line"}
577
                                case "horizontale einfache Schlusslinie (gewellt)" return
578
                                    attribute type {"long-end-line-wavy"}
579
                                case "Schlusslinien; horizontale Schleife von links oben nach rechts unten" return
580
                                    attribute type {"bottom-brace-short"}
581
582
                                default return
                                    attribute type {"end-line"}
583
584
                        }
                else if(matches($node/descendant::tei:ref, "Absatzlinie")
585
586
                (: in case of double paragraph lines the single lines are
                encoded with "oberer" resp. "unterer Teil", but we only
587
588
589
590
591
592
593
594
595
596
                serialize the encoding for the upper line :)
                and not(matches($node/descendant::tei:ref, "unterer Teil"))
                and not(matches($node/descendant::tei:figDesc, "unsicher"))) then
                    element tei:ab {
                        if(matches($node/descendant::tei:ref, "doppelt"))
                            then
                                attribute type {"short-paragraph-line-double"}
                            else
                                attribute type {"short-paragraph-line"}
                    }
MRodz's avatar
MRodz committed
597
598
                else if($node/parent::tei:zone[@type = "illustration"]) then
                    element {QName("http://www.tei-c.org/ns/1.0", $node/name())}{
Michelle Rodzis's avatar
Michelle Rodzis committed
599
600
                        $node/@*,
                        fontaneSimple:transform($nodes/node())
MRodz's avatar
MRodz committed
601
                    }
602
                else
MRodz's avatar
MRodz committed
603
604
                    ()
            else
605
                fontaneSimple:copy-element($node)
606

MRodz's avatar
MRodz committed
607
        case element(tei:note) return
608
            if($node/@type = "authorial"
609
            and not($node/@subtype = "footnote")) then
MRodz's avatar
MRodz committed
610
                ()
611
            else
612
                fontaneSimple:copy-element($node)
613

MRodz's avatar
MRodz committed
614
615
616
617
618
619
        case element(tei:certainty) return
            element {QName("http://www.tei-c.org/ns/1.0", "note")}{
                attribute type {"editorial"},
                attribute subtype {"certainty"},
                $node/@cert,
                $node/@target,
620
                fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
621
            }
622

MRodz's avatar
MRodz committed
623
        case element(tei:figDesc) return
624
            fontaneSimple:copy-element($node)
625

MRodz's avatar
MRodz committed
626
        case element(tei:ref) return
627
            fontaneSimple:copy-element($node)
628

MRodz's avatar
MRodz committed
629
        case element(tei:space) return
630
            fontaneSimple:copy-element($node)
631

MRodz's avatar
MRodz committed
632
        case element(tei:choice) return
633
            fontaneSimple:copy-element($node)
634

MRodz's avatar
MRodz committed
635
        case element(tei:abbr) return
636
            fontaneSimple:copy-element($node)
637

MRodz's avatar
MRodz committed
638
        case element(tei:expan) return
639
            fontaneSimple:copy-element($node)
640
641
642
643
644
645
            
        case element(tei:sic) return
            fontaneSimple:copy-element($node)     
            
        case element(tei:corr) return
            fontaneSimple:copy-element($node)
646

MRodz's avatar
MRodz committed
647
        case element(tei:rs) return
648
            fontaneSimple:copy-element($node)
649

MRodz's avatar
MRodz committed
650
        case element(tei:date) return
651
            element {QName("http://www.tei-c.org/ns/1.0", $node/name())}{
652
653
                (if($node/@when-iso) then
                    attribute when {$node/@when-iso}
654
655
                else
                    ()),
656
657
                (if($node/@from-iso) then
                    attribute from {$node/@from-iso}
658
659
                else
                    ()),
660
661
                (if($node/@to-iso) then
                    attribute to {$node/@to-iso}
Michelle Rodzis's avatar
Michelle Rodzis committed
662
                else
663
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
664
665
                (if($node/@notAfter-iso) then
                    attribute notAfter {$node/@notAfter-iso}
666
                else
667
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
668
                $node/(@* except (@when-iso, @to-iso, @from-iso, @notAfter-iso)),
669
                fontaneSimple:transform($node/node())
670
            }
671

672
        case element(tei:ptr) return
673
            ()
674

MRodz's avatar
MRodz committed
675
        default return
676
            fontaneSimple:transform($node/node())
677
};
678
679
680
681
682
683
684
685
686
687

(:~
 : Takes a given element over as is since it is compliant to TEI simplePrint.
 :
 : @author Michelle Rodzis
 : @param $node the current text node
 : @return node() a copy of the current node
 :)
declare function fontaneSimple:copy-element($node as node()) as node() {
    element {QName("http://www.tei-c.org/ns/1.0", $node/name())}{
Michelle Rodzis's avatar
Michelle Rodzis committed
688
689
690
691
692
        $node/(@* except @rend),
        if($node/@rend) then
            attribute rendition {$node/@rend}
        else
            (),
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
        fontaneSimple:transform($node/node())
    }
};

(:~
 : Creates a tei:head with an @rendition and a font-size, if available.
 :
 : @author Michelle Rodzis
 : @param $node the current tei:line, tei:zone or tei:seg node
 : @return element(tei:head)
 : :)
declare function fontaneSimple:make-head($node as node()) as element(tei:head) {
    element tei:head {
        (if($node/descendant::tei:seg[matches(@style, "font-size")]) then
            attribute type {simpleHelpers:get-font-size($node)}
        else
            attribute type {"default"}
        ),
        $node/@subtype,
        (if($node/@rendition) then
            $node/@rendition
        else
MRodz's avatar
MRodz committed
715
716
717
718
719
            ()),         
        (if($node/@rend) then
            $node/@rend
        else
            ()),        
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
        fontaneSimple:transform($node/node())
    }
};

(:~
 : Creates a tei:div.
 :
 : @author Michelle Rodzis
 : @param $node the current tei:surface node
 : @return element(tei:div)
 : :)
declare function fontaneSimple:make-div($node as element(tei:surface))
as element(tei:div) {
    element tei:div{
        $node/(@* except (@facs, @n, @attachment, @subtype, @ulx, @uly, @lrx, @lry, @points)),
        fontaneSimple:transform($node/node())
    }
};

(:~
 : Creates a new tei:seg with all relevant rendition information.
 :
 : @author Michelle Rodzis
 : @param $node the current tei:zone, tei:line, or tei:seg element
 : @return element(tei:seg)
 :)
declare function fontaneSimple:make-seg-with-rendition($node as element(*))
as element(tei:seg) {
    element tei:seg {
        attribute rendition {simpleHelpers:filter-rendition($node)},
        $node/(@* except (@style, @rendition)),
751
752
753
754
        (if($node[self::tei:line or self::tei:zone]) then
            attribute unit {$node/name()}
        else
            ()),
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
        fontaneSimple:transform($node/node())
    }
};


(:~
 : Creates a tei:pb.
 :
 : @author Michelle Rodzis
 : @param $node the current tei:surface node
 : @return element(tei:pb)
 :)
declare function fontaneSimple:make-pb($node as element(tei:surface))
as element(tei:pb) {
    element {QName("http://www.tei-c.org/ns/1.0", "pb")}{
        $node/@n
    }
};


(:~
 : Creates a tei:pb with a type instead of a @n representing the pagination.
 : This function is mainly used to separate the inner and outer book covers from
 : each other.
 :
 : @author Michelle Rodzis
 : @param $node the current tei:surface node
 : @return element(tei:pb)
 :)
declare function fontaneSimple:make-pb-with-type($type as xs:string)
as element(tei:pb) {
    element {QName("http://www.tei-c.org/ns/1.0", "pb")}{
        attribute type {$type}
    }
};

declare function fontaneSimple:enhance-handshift($node as element(tei:handShift))
as element(tei:handShift) {
    let $prev-hand := $node/preceding::tei:handShift[@new][1]
    return
        element tei:handShift {
            $node/@*,
            if(not($node/@new)) then
                attribute new {$prev-hand/@new}
            else
                (),
            if(not($node/@script)) then
                attribute script {""}
            else
                (),
            if(not($node/@medium)) then
                attribute medium {""}
            else
                ()
        }
};
811
812


813
declare function fontaneSimple:mark-intervention($node as element(*)) 
814
815
as element(tei:seg) {
    element tei:seg {
816
817
818
819
820
821
        if($node[self::tei:lb]) then
            attribute type {"missing-hyphen"}
        else if($node[self::tei:surplus]) then
            attribute type {"surplus"}
        else
            attribute type {"reduplication"},
822
            
823
        <tei:hi xmlns="http://www.tei-c.org/ns/1.0">‹</tei:hi>,
824
        
825
826
827
828
        if($node[self::tei:lb]) then
            simpleHelpers:find-chars($node)
        else
            fontaneSimple:transform($node/node()),
829
            
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
        <tei:hi xmlns="http://www.tei-c.org/ns/1.0">›</tei:hi>
    }
};


declare function fontaneSimple:mark-missing-hyphen($node as element(tei:lb)) as
element(tei:seg) {
    element tei:seg {
        attribute type {"missing-hyphen"},
        <tei:hi xmlns="http://www.tei-c.org/ns/1.0">‹</tei:hi>,
        simpleHelpers:find-chars($node),
        <tei:hi xmlns="http://www.tei-c.org/ns/1.0">›</tei:hi>
    }
};


(:~ In this first serialization step the beginning and end of line groups are 
 : simply marked with milestones, which are expanded to a full tei:lg in the 
 : second serialization step. :)
declare function fontaneSimple:mark-linegroup-beginning() as
element(tei:milestone) {
    element tei:milestone {
        attribute unit {"start-lg"}
    }
};

declare function fontaneSimple:mark-linegroup-end() as
element(tei:milestone) {
    element tei:milestone {
        attribute unit {"end-lg"}
860
    }
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
};

declare function fontaneSimple:has-pb-inbetween($node as node(), 
$corresp as node()*) as xs:boolean {
    if($node/following::tei:surface[. << $corresp]) then
        true()
    else
        false()
};

declare function fontaneSimple:separates-corresp-nodes($node as element(tei:surface)) 
as xs:boolean {
    some $prev in $node/preceding::*[@next]
    satisfies contains($prev/@next, $node/descendant::*/@xml:id)
        or contains($prev/@next, $node/following::*/@xml:id)
876
};