tei2teisimple.xqm 30.3 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
164
165
        case element(tei:line) return
            if(count($node/*) = 1 and $node/child::tei:fw) then
                ()
MRodz's avatar
MRodz committed
166
            else if($node/@type = "heading") then
167
                fontaneSimple:make-head($node)
168

169
            else if(simpleHelpers:has-valid-style($node)
170
            or matches($node/@rendition, "black_letter")
171
            or matches($node/@rendition, "roman")) then
172
                fontaneSimple:make-seg-with-rendition($node)
173
174
                
            else if($node/following::*[1][self::tei:lb[@break = "no"]]) then
175
                (simpleHelpers:start-line($node),
176
                simpleHelpers:trim-last-char($node))
177
178
                
            else if ($node/preceding::*[1][self::tei:lb[@break = "no"]]) then
179
                (simpleHelpers:start-line($node),
180
                simpleHelpers:trim-first-char($node))
181
182
                
            else if($node/@type = "verse") then
MRodz's avatar
MRodz committed
183
184
185
186
187
188
189
190
191
192
193
194
195
                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 :)
196
                else
MRodz's avatar
MRodz committed
197
198
199
200
201
202
203
204
205
206
207
208
209
                    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())             
210
                
211
212
213
            (: 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:)
214
            else if(not($node/@type = "item")) then
215
                (simpleHelpers:start-line($node),
216
                fontaneSimple:transform($node/node()))
217
                
218
219
            else if($node/@type = "item" and not($node/@xml:id)) then
                element tei:item {
220
                    fontaneSimple:transform($node/node())
221
                }
222
                
223
            else if($node/@type = "item"
224
            and simpleHelpers:is-transposed($node)) then
225
                ()
226
                
227
            else
228
                (simpleHelpers:start-line($node),
229
                fontaneSimple:transform($node/node()))
230

231
        case element(tei:handShift) return
232
            fontaneSimple:enhance-handshift($node)
233

234
235
        case element(tei:stamp) return
            ()
236

237
        case element(tei:seg) return
238
            if(count($node/*) = 1 and
239
            ($node/tei:stamp or $node/tei:metamark[@function = "caret"]))
240
241
                then
                    ()
242

MRodz's avatar
MRodz committed
243
            else if($node/@type = "heading") then
MRodz's avatar
MRodz committed
244
245
246
247
248
249
250
251
252
253
254
255
256
                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())
                }
257
258

            else if(matches($node/@style, "underline")
259
            and not(matches($node/@style, "vertical-align"))) then
260
                fontaneSimple:transform($node/node())
261

262
            else if(simpleHelpers:has-valid-style($node)
263
            or matches($node/@rendition, "black_letter")
264
            or matches($node/@rendition, "roman")) then
265
                fontaneSimple:make-seg-with-rendition($node)
266
267
268

            else if($node/@type = "initials"
            or $node/@type = "monogram"
MRodz's avatar
MRodz committed
269
270
            or $node/@type = "multiphrase"
            or $node/@xml:lang)
271
                then
272
                    fontaneSimple:copy-element($node)
273
274

            else if($node/@type = "auction_number"
275
            or $node/@type = "cancel"
MRodz's avatar
MRodz committed
276
277
            or $node/@type = "abort"
            or $node/@function ="unknown")
278
279
                then
                    ()
280
281
282
                    
            else if($node/parent::tei:add and $node/@copyOf) then
                fontaneSimple:mark-intervention($node)
MRodz's avatar
MRodz committed
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
                
            else if($node/@type = "verse" and $node/@prev) then
                ()
                
            else if($node/@type = "said") then
                if($node/@next) then
(:                    let $corresp := console:log($node/following::*[matches($node/@next, @xml:id)]):)
                    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())
                    }
306

307
            else
308
                fontaneSimple:transform($node/node())
309

MRodz's avatar
MRodz committed
310
        case element(tei:hi) return
311
            fontaneSimple:copy-element($node)
312
313

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

323
        case element(tei:anchor) return
324
            fontaneSimple:copy-element($node)
325
326

        case element(tei:surface) return
MRodz's avatar
MRodz committed
327
            if(matches($node/@n, "cover")) then
Michelle Rodzis's avatar
Michelle Rodzis committed
328
329
330
                (fontaneSimple:make-pb-with-type($node/@n),
                fontaneSimple:transform($node/node()))
            
331
            else if(simpleHelpers:is-page($node)
MRodz's avatar
MRodz committed
332
            and $node/@type = "clipping") then
333
                (fontaneSimple:make-pb($node),
MRodz's avatar
MRodz committed
334
335
                (if(not($node/@subtype = "Kalenderblatt"
                or $node/@subtype = "Zeitungsausschnitt_Fragment")) then
336
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
337
338
                else
                    ()))
Michelle Rodzis's avatar
Michelle Rodzis committed
339
            
340
            else if(simpleHelpers:is-page($node)) then
341
                (fontaneSimple:make-pb($node),
342
                fontaneSimple:transform($node/node()))
Michelle Rodzis's avatar
Michelle Rodzis committed
343
            
344
            else if($node/@type = "label" and
345
            (contains($node/@subtype, "Fontane")
346
            or contains($node/@subtype, "Hersteller"))
347
            ) then
348
                fontaneSimple:make-div($node)
Michelle Rodzis's avatar
Michelle Rodzis committed
349
            
MRodz's avatar
MRodz committed
350
351
            else
                ()
352

MRodz's avatar
MRodz committed
353
354
355
        case element(tei:milestone) return
            if($node/@unit = "illustration") then
                ()
356
(:            else if($node/@unit = "section") then:)
357
(:                simpleHelpers:make-section($node):)
358
359
(:            else if($node/@unit = "pararaph") then:)
(:                fontaneSimple:make-paragraph($node):)
MRodz's avatar
MRodz committed
360
            else
361
                fontaneSimple:copy-element($node)
362

363
        case element(tei:gap) return
364
            fontaneSimple:copy-element($node)
365

366
        case element(tei:metamark) return
367
            if($node/@function = "integrate"
368
369
370
371
            or $node/@function = "authorial_note") then
                element tei:ab {
                    $node/@*
                }
372
            else if($node/@function = "placeholder"
373
374
375
376
377
            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
378
379
                element tei:ab {
                    attribute type {$node/@function},
380
                    fontaneSimple:transform($node/node())
381
                }
382
383
            else
                ()
384

385
        case element(tei:surplus) return
386
            fontaneSimple:mark-intervention($node)
387

MRodz's avatar
MRodz committed
388
        case element(tei:zone) return
389
            if(matches($node/@style, "border-style:solid")
MRodz's avatar
MRodz committed
390
391
392
393
            and not(matches($node/@style, "border-radius"))
            and not($node/@rend = "border-style:house")) then
                element tei:div {
                    attribute type {"frame"},
394
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
395
                }
396

MRodz's avatar
MRodz committed
397
            else if(matches($node/@rend, "border-bottom-style:brace")) then
398
                (fontaneSimple:transform($node/node()),
MRodz's avatar
MRodz committed
399
400
                element tei:ab {
                    attribute type {"bottom-brace"}
401
402
                })

MRodz's avatar
MRodz committed
403
404
            else if($node/@type = "cancel") then
                ()
405

MRodz's avatar
MRodz committed
406
407
408
409
            else if($node/@type = "marked_off") then
                element tei:seg {
                    $node/@type,
                    $node/@xml:id,
410
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
411
                }
412

MRodz's avatar
MRodz committed
413
414
            else if($node/@type = "highlighted") then
                if($node/child::tei:zone[@type = "highlighted"]) then
415
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
416
417
418
                else
                    element tei:hi {
                        attribute type {"vertical-mark"},
419
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
420
                    }
421

422
423
            else if($node/@type = "illustration"
            or $node/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
424
425
426
427
428
429
430
                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
431
                                attribute rendition {"margin-left:" || $node/@ulx
MRodz's avatar
MRodz committed
432
433
434
435
436
                                || "cm; " || "margin-top:" || $node/@uly || "cm"}
                            else
                                ()
                            )
                        ),
437
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
438
                    }
439
                else
MRodz's avatar
MRodz committed
440
                    ()
441

442
443
            else if($node/parent::tei:zone/@type = "illustration"
            or $node/parent::tei:zone/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
444
445
                element {QName("http://www.tei-c.org/ns/1.0", "seg")}{
                    attribute type {"caption"},
446
                    attribute rendition {"margin-left:" || $node/@ulx || "cm; "
MRodz's avatar
MRodz committed
447
                        || "margin-top:" || $node/@uly || "cm"},
448
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
449
                }
450

MRodz's avatar
MRodz committed
451
            else if($node/@type = "heading") then
452
                fontaneSimple:make-head($node)
453

MRodz's avatar
MRodz committed
454
455
            else if($node/@type = "list" or $node/@type = "item") then
                element {QName("http://www.tei-c.org/ns/1.0", $node/@type)}{
456
                    $node/(@* except (@type, @ulx, @uly, @lrx, @lry, @rotate)),
457
                    fontaneSimple:transform($node/node())
458
                }
Michelle Rodzis's avatar
Michelle Rodzis committed
459
                
MRodz's avatar
MRodz committed
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
            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
482
483
484
485
486
            else if($node/@type = "toc") then
                element tei:list {
                    attribute type {"toc"},
                    fontaneSimple:transform($node/node())
                }
487

MRodz's avatar
MRodz committed
488
489
            else if($node/@type = "legend") then
                element {QName("http://www.tei-c.org/ns/1.0", "div")}{
490
                    (if($node/@style
491
492
493
494
495
                    or $node/@rendition) then
                        attribute rendition {simpleHelpers:filter-rendition($node)}
                    else
                        ()),
                    $node/(@* except (@rendition, @style)),
496
                    fontaneSimple:transform($node/node())
497
498
                }

499
            else if(simpleHelpers:has-valid-style($node)
500
            or matches($node/@rendition, "black_letter")
501
            or matches($node/@rendition, "roman")) then
502
                fontaneSimple:make-seg-with-rendition($node)
503

504
            else if(not($node/@xml:id)) then
505
                fontaneSimple:transform($node/node())
506

507
            else if($node/@xml:id and simpleHelpers:is-transposed($node)) then
508
                ()
509

MRodz's avatar
MRodz committed
510
            else
511
                fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
512
513
514
515
516
517
518
519
520
521
522
523
                
        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
                ())
524

MRodz's avatar
MRodz committed
525
        case element(tei:figure) return
526
            if(count($node/child::*) = 1 and $node/child::tei:figDesc) then
527
                (: genealogy lines probably shouldn't be displayed, but I still have to
528
529
530
531
                check that. in case they should be serialized, I leave the code :)
(:                if(matches($node/descendant::tei:ref, "Stammbaumverbindungslinie")) then:)
(:                    element tei:seg {:)
(:                        $node/@*,:)
532
(:                        fontaneSimple:transform($node/node()):)
533
534
535
536
537
538
(:                    }:)
(:                else if(matches($node/descendant::tei:ref, "Schlusslinie")):)
                if(matches($node/descendant::tei:ref, "Schlusslinie"))
                    then
                        element tei:ab {
                            switch ($node/descendant::tei:ref)
539
540
541
                                case "horizontale einfache Schlusslinie" return
                                    attribute type {"long-end-line"}
                                case "Schlusslinie; horizontale Halbschleife von links oben nach rechts" return
542
                                    attribute type {"long-end-line"}
543
                                case "horizontale einfache Schlusslinie (gewellt)" return
544
                                    attribute type {"long-end-line-wavy"}
545
                                case "Schlusslinien; horizontale Schleife von links oben nach rechts unten" return
546
                                    attribute type {"bottom-brace-short"}
547
548
                                default return
                                    attribute type {"end-line"}
549
550
                        }
                else if(matches($node/descendant::tei:ref, "Absatzlinie")
551
552
                (: in case of double paragraph lines the single lines are
                encoded with "oberer" resp. "unterer Teil", but we only
553
554
555
556
557
558
559
560
561
562
                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
563
564
                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
565
566
                        $node/@*,
                        fontaneSimple:transform($nodes/node())
MRodz's avatar
MRodz committed
567
                    }
568
                else
MRodz's avatar
MRodz committed
569
570
                    ()
            else
571
                fontaneSimple:copy-element($node)
572

MRodz's avatar
MRodz committed
573
        case element(tei:note) return
574
            if($node/@type = "authorial"
575
            and not($node/@subtype = "footnote")) then
MRodz's avatar
MRodz committed
576
                ()
577
            else
578
                fontaneSimple:copy-element($node)
579

MRodz's avatar
MRodz committed
580
581
582
583
584
585
        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,
586
                fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
587
            }
588

MRodz's avatar
MRodz committed
589
        case element(tei:figDesc) return
590
            fontaneSimple:copy-element($node)
591

MRodz's avatar
MRodz committed
592
        case element(tei:ref) return
593
            fontaneSimple:copy-element($node)
594

MRodz's avatar
MRodz committed
595
        case element(tei:space) return
596
            fontaneSimple:copy-element($node)
597

MRodz's avatar
MRodz committed
598
        case element(tei:choice) return
599
            fontaneSimple:copy-element($node)
600

MRodz's avatar
MRodz committed
601
        case element(tei:abbr) return
602
            fontaneSimple:copy-element($node)
603

MRodz's avatar
MRodz committed
604
        case element(tei:expan) return
605
            fontaneSimple:copy-element($node)
606
607
608
609
610
611
            
        case element(tei:sic) return
            fontaneSimple:copy-element($node)     
            
        case element(tei:corr) return
            fontaneSimple:copy-element($node)
612

MRodz's avatar
MRodz committed
613
        case element(tei:rs) return
614
            fontaneSimple:copy-element($node)
615

MRodz's avatar
MRodz committed
616
        case element(tei:date) return
617
            element {QName("http://www.tei-c.org/ns/1.0", $node/name())}{
618
619
                (if($node/@when-iso) then
                    attribute when {$node/@when-iso}
620
621
                else
                    ()),
622
623
                (if($node/@from-iso) then
                    attribute from {$node/@from-iso}
624
625
                else
                    ()),
626
627
                (if($node/@to-iso) then
                    attribute to {$node/@to-iso}
Michelle Rodzis's avatar
Michelle Rodzis committed
628
                else
629
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
630
631
                (if($node/@notAfter-iso) then
                    attribute notAfter {$node/@notAfter-iso}
632
                else
633
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
634
                $node/(@* except (@when-iso, @to-iso, @from-iso, @notAfter-iso)),
635
                fontaneSimple:transform($node/node())
636
            }
637

638
        case element(tei:ptr) return
639
            ()
640

MRodz's avatar
MRodz committed
641
        default return
642
            fontaneSimple:transform($node/node())
643
};
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676

(:~
 : 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())}{
        $node/@*,
        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
677
678
679
680
681
            ()),         
        (if($node/@rend) then
            $node/@rend
        else
            ()),        
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
        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)),
713
714
715
716
        (if($node[self::tei:line or self::tei:zone]) then
            attribute unit {$node/name()}
        else
            ()),
717
718
719
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
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
        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
                ()
        }
};
773
774


775
declare function fontaneSimple:mark-intervention($node as element(*)) 
776
777
as element(tei:seg) {
    element tei:seg {
778
779
780
781
782
783
        if($node[self::tei:lb]) then
            attribute type {"missing-hyphen"}
        else if($node[self::tei:surplus]) then
            attribute type {"surplus"}
        else
            attribute type {"reduplication"},
784
            
785
        <tei:hi xmlns="http://www.tei-c.org/ns/1.0">‹</tei:hi>,
786
        
787
788
789
790
        if($node[self::tei:lb]) then
            simpleHelpers:find-chars($node)
        else
            fontaneSimple:transform($node/node()),
791
            
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
        <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"}
822
823
    }
};