tei2teisimple.xqm 26.6 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
183
184
185
186
187
188
189
190
191
192
193
194
                
            else if($node/@type = "verse") 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
                    ())    
                
195
196
197
            (: 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:)
198
            else if(not($node/@type = "item")) then
199
                (simpleHelpers:start-line($node),
200
                fontaneSimple:transform($node/node()))
201
                
202
203
            else if($node/@type = "item" and not($node/@xml:id)) then
                element tei:item {
204
                    fontaneSimple:transform($node/node())
205
                }
206
                
207
            else if($node/@type = "item"
208
            and simpleHelpers:is-transposed($node)) then
209
                ()
210
                
211
            else
212
                (simpleHelpers:start-line($node),
213
                fontaneSimple:transform($node/node()))
214

215
        case element(tei:handShift) return
216
            fontaneSimple:enhance-handshift($node)
217

218
219
        case element(tei:stamp) return
            ()
220

221
        case element(tei:seg) return
222
            if(count($node/*) = 1 and
223
            ($node/tei:stamp or $node/tei:metamark[@function = "caret"]))
224
225
                then
                    ()
226

MRodz's avatar
MRodz committed
227
            else if($node/@type = "heading") then
228
                fontaneSimple:make-head($node)
229
230

            else if(matches($node/@style, "underline")
231
            and not(matches($node/@style, "vertical-align"))) then
232
                fontaneSimple:transform($node/node())
233

234
            else if(simpleHelpers:has-valid-style($node)
235
            or matches($node/@rendition, "black_letter")
236
            or matches($node/@rendition, "roman")) then
237
                fontaneSimple:make-seg-with-rendition($node)
238
239
240

            else if($node/@type = "initials"
            or $node/@type = "monogram"
MRodz's avatar
MRodz committed
241
242
            or $node/@type = "multiphrase"
            or $node/@xml:lang)
243
                then
244
                    fontaneSimple:copy-element($node)
245
246

            else if($node/@type = "auction_number"
247
            or $node/@type = "cancel"
MRodz's avatar
MRodz committed
248
249
            or $node/@type = "abort"
            or $node/@function ="unknown")
250
251
                then
                    ()
252
253
254
                    
            else if($node/parent::tei:add and $node/@copyOf) then
                fontaneSimple:mark-intervention($node)
255

256
            else
257
                fontaneSimple:transform($node/node())
258

MRodz's avatar
MRodz committed
259
        case element(tei:hi) return
260
            fontaneSimple:copy-element($node)
261
262

        (: TODO if $node/@type = "highlighted" then make
263
        a hi[@type = "vertical-mark"] in the second stage of creating the
264
        simple format. use simpleHelpers:get-xml-chunk($node) for this.:)
265
266
        case element(tei:mod) return
            if($node/@type = "highlighted"
267
            and simpleHelpers:is-hand-contemporary($node/@hand)) then
268
                $node
269
270
            else
                fontaneSimple:transform($node/node())
271

272
        case element(tei:anchor) return
273
            fontaneSimple:copy-element($node)
274
275

        case element(tei:surface) return
MRodz's avatar
MRodz committed
276
            if(matches($node/@n, "cover")) then
Michelle Rodzis's avatar
Michelle Rodzis committed
277
278
279
                (fontaneSimple:make-pb-with-type($node/@n),
                fontaneSimple:transform($node/node()))
            
280
            else if(simpleHelpers:is-page($node)
MRodz's avatar
MRodz committed
281
            and $node/@type = "clipping") then
282
                (fontaneSimple:make-pb($node),
MRodz's avatar
MRodz committed
283
284
                (if(not($node/@subtype = "Kalenderblatt"
                or $node/@subtype = "Zeitungsausschnitt_Fragment")) then
285
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
286
287
                else
                    ()))
Michelle Rodzis's avatar
Michelle Rodzis committed
288
            
289
            else if(simpleHelpers:is-page($node)) then
290
                (fontaneSimple:make-pb($node),
291
                fontaneSimple:transform($node/node()))
Michelle Rodzis's avatar
Michelle Rodzis committed
292
            
293
            else if($node/@type = "label" and
294
            (contains($node/@subtype, "Fontane")
295
            or contains($node/@subtype, "Hersteller"))
296
            ) then
297
                fontaneSimple:make-div($node)
Michelle Rodzis's avatar
Michelle Rodzis committed
298
            
MRodz's avatar
MRodz committed
299
300
            else
                ()
301

MRodz's avatar
MRodz committed
302
303
304
        case element(tei:milestone) return
            if($node/@unit = "illustration") then
                ()
305
(:            else if($node/@unit = "section") then:)
306
(:                simpleHelpers:make-section($node):)
307
308
(:            else if($node/@unit = "pararaph") then:)
(:                fontaneSimple:make-paragraph($node):)
MRodz's avatar
MRodz committed
309
            else
310
                fontaneSimple:copy-element($node)
311

312
        case element(tei:gap) return
313
            fontaneSimple:copy-element($node)
314

315
        case element(tei:metamark) return
316
            if($node/@function = "integrate"
317
318
319
320
            or $node/@function = "authorial_note") then
                element tei:ab {
                    $node/@*
                }
321
            else if($node/@function = "placeholder"
322
323
324
325
326
            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
327
328
                element tei:ab {
                    attribute type {$node/@function},
329
                    fontaneSimple:transform($node/node())
330
                }
331
332
            else
                ()
333

334
        case element(tei:surplus) return
335
            fontaneSimple:mark-intervention($node)
336

MRodz's avatar
MRodz committed
337
        case element(tei:zone) return
338
            if(matches($node/@style, "border-style:solid")
MRodz's avatar
MRodz committed
339
340
341
342
            and not(matches($node/@style, "border-radius"))
            and not($node/@rend = "border-style:house")) then
                element tei:div {
                    attribute type {"frame"},
343
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
344
                }
345

MRodz's avatar
MRodz committed
346
            else if(matches($node/@rend, "border-bottom-style:brace")) then
347
                (fontaneSimple:transform($node/node()),
MRodz's avatar
MRodz committed
348
349
                element tei:ab {
                    attribute type {"bottom-brace"}
350
351
                })

MRodz's avatar
MRodz committed
352
353
            else if($node/@type = "cancel") then
                ()
354

MRodz's avatar
MRodz committed
355
356
357
358
            else if($node/@type = "marked_off") then
                element tei:seg {
                    $node/@type,
                    $node/@xml:id,
359
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
360
                }
361

MRodz's avatar
MRodz committed
362
363
            else if($node/@type = "highlighted") then
                if($node/child::tei:zone[@type = "highlighted"]) then
364
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
365
366
367
                else
                    element tei:hi {
                        attribute type {"vertical-mark"},
368
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
369
                    }
370

371
372
            else if($node/@type = "illustration"
            or $node/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
373
374
375
376
377
378
379
                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
380
                                attribute rendition {"margin-left:" || $node/@ulx
MRodz's avatar
MRodz committed
381
382
383
384
385
                                || "cm; " || "margin-top:" || $node/@uly || "cm"}
                            else
                                ()
                            )
                        ),
386
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
387
                    }
388
                else
MRodz's avatar
MRodz committed
389
                    ()
390

391
392
            else if($node/parent::tei:zone/@type = "illustration"
            or $node/parent::tei:zone/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
393
394
                element {QName("http://www.tei-c.org/ns/1.0", "seg")}{
                    attribute type {"caption"},
395
                    attribute rendition {"margin-left:" || $node/@ulx || "cm; "
MRodz's avatar
MRodz committed
396
                        || "margin-top:" || $node/@uly || "cm"},
397
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
398
                }
399

MRodz's avatar
MRodz committed
400
            else if($node/@type = "heading") then
401
                fontaneSimple:make-head($node)
402

MRodz's avatar
MRodz committed
403
404
            else if($node/@type = "list" or $node/@type = "item") then
                element {QName("http://www.tei-c.org/ns/1.0", $node/@type)}{
405
                    $node/(@* except (@type, @ulx, @uly, @lrx, @lry, @rotate)),
406
                    fontaneSimple:transform($node/node())
407
                }
Michelle Rodzis's avatar
Michelle Rodzis committed
408
409
410
411
412
413
                
            else if($node/@type = "toc") then
                element tei:list {
                    attribute type {"toc"},
                    fontaneSimple:transform($node/node())
                }
414

MRodz's avatar
MRodz committed
415
416
            else if($node/@type = "legend") then
                element {QName("http://www.tei-c.org/ns/1.0", "div")}{
417
                    (if($node/@style
418
419
420
421
422
                    or $node/@rendition) then
                        attribute rendition {simpleHelpers:filter-rendition($node)}
                    else
                        ()),
                    $node/(@* except (@rendition, @style)),
423
                    fontaneSimple:transform($node/node())
424
425
                }

426
            else if(simpleHelpers:has-valid-style($node)
427
            or matches($node/@rendition, "black_letter")
428
            or matches($node/@rendition, "roman")) then
429
                fontaneSimple:make-seg-with-rendition($node)
430

431
            else if(not($node/@xml:id)) then
432
                fontaneSimple:transform($node/node())
433

434
            else if($node/@xml:id and simpleHelpers:is-transposed($node)) then
435
                ()
436

MRodz's avatar
MRodz committed
437
            else
438
                fontaneSimple:transform($node/node())
439

MRodz's avatar
MRodz committed
440
        case element(tei:figure) return
441
            if(count($node/child::*) = 1 and $node/child::tei:figDesc) then
442
                (: genealogy lines probably shouldn't be displayed, but I still have to
443
444
445
446
                check that. in case they should be serialized, I leave the code :)
(:                if(matches($node/descendant::tei:ref, "Stammbaumverbindungslinie")) then:)
(:                    element tei:seg {:)
(:                        $node/@*,:)
447
(:                        fontaneSimple:transform($node/node()):)
448
449
450
451
452
453
(:                    }:)
(:                else if(matches($node/descendant::tei:ref, "Schlusslinie")):)
                if(matches($node/descendant::tei:ref, "Schlusslinie"))
                    then
                        element tei:ab {
                            switch ($node/descendant::tei:ref)
454
455
456
                                case "horizontale einfache Schlusslinie" return
                                    attribute type {"long-end-line"}
                                case "Schlusslinie; horizontale Halbschleife von links oben nach rechts" return
457
                                    attribute type {"long-end-line"}
458
                                case "horizontale einfache Schlusslinie (gewellt)" return
459
                                    attribute type {"long-end-line-wavy"}
460
                                case "Schlusslinien; horizontale Schleife von links oben nach rechts unten" return
461
                                    attribute type {"bottom-brace-short"}
462
463
                                default return
                                    attribute type {"end-line"}
464
465
                        }
                else if(matches($node/descendant::tei:ref, "Absatzlinie")
466
467
                (: in case of double paragraph lines the single lines are
                encoded with "oberer" resp. "unterer Teil", but we only
468
469
470
471
472
473
474
475
476
477
                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
478
479
                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
480
481
                        $node/@*,
                        fontaneSimple:transform($nodes/node())
MRodz's avatar
MRodz committed
482
                    }
483
                else
MRodz's avatar
MRodz committed
484
485
                    ()
            else
486
                fontaneSimple:copy-element($node)
487

MRodz's avatar
MRodz committed
488
        case element(tei:note) return
489
            if($node/@type = "authorial"
490
            and not($node/@subtype = "footnote")) then
MRodz's avatar
MRodz committed
491
                ()
492
            else
493
                fontaneSimple:copy-element($node)
494

MRodz's avatar
MRodz committed
495
496
497
498
499
500
        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,
501
                fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
502
            }
503

MRodz's avatar
MRodz committed
504
        case element(tei:figDesc) return
505
            fontaneSimple:copy-element($node)
506

MRodz's avatar
MRodz committed
507
        case element(tei:ref) return
508
            fontaneSimple:copy-element($node)
509

MRodz's avatar
MRodz committed
510
        case element(tei:space) return
511
            fontaneSimple:copy-element($node)
512

MRodz's avatar
MRodz committed
513
        case element(tei:choice) return
514
            fontaneSimple:copy-element($node)
515

MRodz's avatar
MRodz committed
516
        case element(tei:abbr) return
517
            fontaneSimple:copy-element($node)
518

MRodz's avatar
MRodz committed
519
        case element(tei:expan) return
520
            fontaneSimple:copy-element($node)
521
522
523
524
525
526
            
        case element(tei:sic) return
            fontaneSimple:copy-element($node)     
            
        case element(tei:corr) return
            fontaneSimple:copy-element($node)
527

MRodz's avatar
MRodz committed
528
        case element(tei:rs) return
529
            fontaneSimple:copy-element($node)
530

MRodz's avatar
MRodz committed
531
        case element(tei:date) return
532
            element {QName("http://www.tei-c.org/ns/1.0", $node/name())}{
533
534
                (if($node/@when-iso) then
                    attribute when {$node/@when-iso}
535
536
                else
                    ()),
537
538
                (if($node/@from-iso) then
                    attribute from {$node/@from-iso}
539
540
                else
                    ()),
541
542
                (if($node/@to-iso) then
                    attribute to {$node/@to-iso}
Michelle Rodzis's avatar
Michelle Rodzis committed
543
                else
544
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
545
546
                (if($node/@notAfter-iso) then
                    attribute notAfter {$node/@notAfter-iso}
547
                else
548
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
549
                $node/(@* except (@when-iso, @to-iso, @from-iso, @notAfter-iso)),
550
                fontaneSimple:transform($node/node())
551
            }
552

553
        case element(tei:ptr) return
554
            ()
555

MRodz's avatar
MRodz committed
556
        default return
557
            fontaneSimple:transform($node/node())
558
};
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623

(:~
 : 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
            ()),
        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)),
624
625
626
627
        (if($node[self::tei:line or self::tei:zone]) then
            attribute unit {$node/name()}
        else
            ()),
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
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
677
678
679
680
681
682
683
        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
                ()
        }
};
684
685


686
declare function fontaneSimple:mark-intervention($node as element(*)) 
687
688
as element(tei:seg) {
    element tei:seg {
689
690
691
692
693
694
        if($node[self::tei:lb]) then
            attribute type {"missing-hyphen"}
        else if($node[self::tei:surplus]) then
            attribute type {"surplus"}
        else
            attribute type {"reduplication"},
695
            
696
        <tei:hi xmlns="http://www.tei-c.org/ns/1.0">‹</tei:hi>,
697
        
698
699
700
701
        if($node[self::tei:lb]) then
            simpleHelpers:find-chars($node)
        else
            fontaneSimple:transform($node/node()),
702
            
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
        <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"}
733
734
    }
};