tei2teisimple.xqm 25.7 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
32
33
34
        (: TODO:An error with the index occured while building so we 
        temporarily put the file somewhere else :)
(:      (doc("/db/sade-projects/textgrid/data/xml/data/" || $file)):)
      (doc("/db/apps/SADE/resources/xml/" || $file))
MRodz's avatar
MRodz committed
35
36
37
    } catch * {
      (console:log("It was not possible to open the requested file " || $file))
    }
38

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

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

56
(:~
57
58
59
60
61
62
63
64
65
 : 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
66
 : @author Michelle Rodzis
67
 : @param $nodes the elements of the book covers and the book content
Michelle Rodzis's avatar
Michelle Rodzis committed
68
 : @return $node()* a TEI simplePrint element
MRodz's avatar
MRodz committed
69
 :)
70
declare function fontaneSimple:transform($nodes as node()*) as node()* {
MRodz's avatar
MRodz committed
71
72
73
    for $node in $nodes
      return
        typeswitch ($node)
MRodz's avatar
MRodz committed
74
        case text() return
MRodz's avatar
MRodz committed
75
76
77
78
79
80
81
            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
                ()
82

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

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

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

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

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

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

150
151
        case element(tei:addSpan) return
            if($node/@type = "edited_text") then
152
                fontaneSimple:copy-element($node)
153
            else
154
155
                ()

156
157
        case element(tei:fw) return
            ()
158

159
160
161
        case element(tei:line) return
            if(count($node/*) = 1 and $node/child::tei:fw) then
                ()
MRodz's avatar
MRodz committed
162
            else if($node/@type = "heading") then
163
                fontaneSimple:make-head($node)
164

165
            else if(simpleHelpers:has-valid-style($node)
166
            or matches($node/@rendition, "black_letter")
167
            or matches($node/@rendition, "roman")) then
168
                fontaneSimple:make-seg-with-rendition($node)
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
                
            else if($node/following::*[1][self::tei:lb[@break = "no"]]) then
                simpleHelpers:trim-last-char($node)
                
            else if ($node/preceding::*[1][self::tei:lb[@break = "no"]]) then
                simpleHelpers:trim-first-char($node)
                
            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
                    ())    
                
189
            else if(not($node/@type = "item")) then
190
                fontaneSimple:transform($node/node())
191
                
192
193
            else if($node/@type = "item" and not($node/@xml:id)) then
                element tei:item {
194
                    fontaneSimple:transform($node/node())
195
                }
196
                
197
            else if($node/@type = "item"
198
            and simpleHelpers:is-transposed($node)) then
199
                ()
200
                
201
            else
202
                fontaneSimple:transform($node/node())
203

204
        case element(tei:handShift) return
205
            fontaneSimple:enhance-handshift($node)
206

207
208
        case element(tei:stamp) return
            ()
209

210
        case element(tei:seg) return
211
            if(count($node/*) = 1 and
212
            ($node/tei:stamp or $node/tei:metamark[@function = "caret"]))
213
214
                then
                    ()
215

MRodz's avatar
MRodz committed
216
            else if($node/@type = "heading") then
217
                fontaneSimple:make-head($node)
218
219

            else if(matches($node/@style, "underline")
220
            and not(matches($node/@style, "vertical-align"))) then
221
                fontaneSimple:transform($node/node())
222

223
            else if(simpleHelpers:has-valid-style($node)
224
            or matches($node/@rendition, "black_letter")
225
            or matches($node/@rendition, "roman")) then
226
                fontaneSimple:make-seg-with-rendition($node)
227
228
229

            else if($node/@type = "initials"
            or $node/@type = "monogram"
MRodz's avatar
MRodz committed
230
231
            or $node/@type = "multiphrase"
            or $node/@xml:lang)
232
                then
233
                    fontaneSimple:copy-element($node)
234
235

            else if($node/@type = "auction_number"
236
            or $node/@type = "cancel"
MRodz's avatar
MRodz committed
237
238
            or $node/@type = "abort"
            or $node/@function ="unknown")
239
240
                then
                    ()
241
242
243
                    
            else if($node/parent::tei:add and $node/@copyOf) then
                fontaneSimple:mark-intervention($node)
244

245
            else
246
                fontaneSimple:transform($node/node())
247

MRodz's avatar
MRodz committed
248
        case element(tei:hi) return
249
            fontaneSimple:copy-element($node)
250
251

        (: TODO if $node/@type = "highlighted" then make
252
        a hi[@type = "vertical-mark"] in the second stage of creating the
253
        simple format. use simpleHelpers:get-xml-chunk($node) for this.:)
254
255
        case element(tei:mod) return
            if($node/@type = "highlighted"
256
            and simpleHelpers:is-hand-contemporary($node/@hand)) then
257
                $node
258
259
            else
                fontaneSimple:transform($node/node())
260

261
        case element(tei:anchor) return
262
            fontaneSimple:copy-element($node)
263
264

        case element(tei:surface) return
MRodz's avatar
MRodz committed
265
            if(matches($node/@n, "cover")) then
266
                fontaneSimple:make-pb-with-type($node/@n)
267
            else if(simpleHelpers:is-page($node)
MRodz's avatar
MRodz committed
268
            and $node/@type = "clipping") then
269
                (fontaneSimple:make-pb($node),
MRodz's avatar
MRodz committed
270
271
                (if(not($node/@subtype = "Kalenderblatt"
                or $node/@subtype = "Zeitungsausschnitt_Fragment")) then
272
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
273
274
                else
                    ()))
275
            else if(simpleHelpers:is-page($node)) then
276
                (fontaneSimple:make-pb($node),
277
                fontaneSimple:transform($node/node()))
278
            else if($node/@type = "label" and
279
            (contains($node/@subtype, "Fontane")
280
            or contains($node/@subtype, "Hersteller"))
281
            ) then
282
                fontaneSimple:make-div($node)
MRodz's avatar
MRodz committed
283
284
            else
                ()
285

MRodz's avatar
MRodz committed
286
287
288
        case element(tei:milestone) return
            if($node/@unit = "illustration") then
                ()
289
(:            else if($node/@unit = "section") then:)
290
(:                simpleHelpers:make-section($node):)
291
292
(:            else if($node/@unit = "pararaph") then:)
(:                fontaneSimple:make-paragraph($node):)
MRodz's avatar
MRodz committed
293
            else
294
                fontaneSimple:copy-element($node)
295

296
        case element(tei:gap) return
297
            fontaneSimple:copy-element($node)
298

299
        case element(tei:metamark) return
300
            if($node/@function = "integrate"
301
302
303
304
            or $node/@function = "authorial_note") then
                element tei:ab {
                    $node/@*
                }
305
            else if($node/@function = "placeholder"
306
307
308
309
310
            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
311
312
                element tei:ab {
                    attribute type {$node/@function},
313
                    fontaneSimple:transform($node/node())
314
                }
315
316
            else
                ()
317

318
        case element(tei:surplus) return
319
            fontaneSimple:mark-intervention($node)
320

MRodz's avatar
MRodz committed
321
        case element(tei:zone) return
322
            if(matches($node/@style, "border-style:solid")
MRodz's avatar
MRodz committed
323
324
325
326
            and not(matches($node/@style, "border-radius"))
            and not($node/@rend = "border-style:house")) then
                element tei:div {
                    attribute type {"frame"},
327
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
328
                }
329

MRodz's avatar
MRodz committed
330
            else if(matches($node/@rend, "border-bottom-style:brace")) then
331
                (fontaneSimple:transform($node/node()),
MRodz's avatar
MRodz committed
332
333
                element tei:ab {
                    attribute type {"bottom-brace"}
334
335
                })

MRodz's avatar
MRodz committed
336
337
            else if($node/@type = "cancel") then
                ()
338

MRodz's avatar
MRodz committed
339
340
341
342
            else if($node/@type = "marked_off") then
                element tei:seg {
                    $node/@type,
                    $node/@xml:id,
343
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
344
                }
345

MRodz's avatar
MRodz committed
346
347
            else if($node/@type = "highlighted") then
                if($node/child::tei:zone[@type = "highlighted"]) then
348
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
349
350
351
                else
                    element tei:hi {
                        attribute type {"vertical-mark"},
352
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
353
                    }
354

355
356
            else if($node/@type = "illustration"
            or $node/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
357
358
359
360
361
362
363
                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
364
                                attribute rendition {"margin-left:" || $node/@ulx
MRodz's avatar
MRodz committed
365
366
367
368
369
                                || "cm; " || "margin-top:" || $node/@uly || "cm"}
                            else
                                ()
                            )
                        ),
370
                        fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
371
                    }
372
                else
MRodz's avatar
MRodz committed
373
                    ()
374

375
376
            else if($node/parent::tei:zone/@type = "illustration"
            or $node/parent::tei:zone/@type = "printed_illustration") then
MRodz's avatar
MRodz committed
377
378
                element {QName("http://www.tei-c.org/ns/1.0", "seg")}{
                    attribute type {"caption"},
379
                    attribute rendition {"margin-left:" || $node/@ulx || "cm; "
MRodz's avatar
MRodz committed
380
                        || "margin-top:" || $node/@uly || "cm"},
381
                    fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
382
                }
383

MRodz's avatar
MRodz committed
384
            else if($node/@type = "heading") then
385
                fontaneSimple:make-head($node)
386

MRodz's avatar
MRodz committed
387
388
            else if($node/@type = "list" or $node/@type = "item") then
                element {QName("http://www.tei-c.org/ns/1.0", $node/@type)}{
389
                    $node/(@* except (@type, @ulx, @uly, @lrx, @lry, @rotate)),
390
                    fontaneSimple:transform($node/node())
391
392
                }

MRodz's avatar
MRodz committed
393
394
            else if($node/@type = "legend") then
                element {QName("http://www.tei-c.org/ns/1.0", "div")}{
395
                    (if($node/@style
396
397
398
399
400
                    or $node/@rendition) then
                        attribute rendition {simpleHelpers:filter-rendition($node)}
                    else
                        ()),
                    $node/(@* except (@rendition, @style)),
401
                    fontaneSimple:transform($node/node())
402
403
                }

404
            else if(simpleHelpers:has-valid-style($node)
405
            or matches($node/@rendition, "black_letter")
406
            or matches($node/@rendition, "roman")) then
407
                fontaneSimple:make-seg-with-rendition($node)
408

409
            else if(not($node/@xml:id)) then
410
                fontaneSimple:transform($node/node())
411

412
            else if($node/@xml:id and simpleHelpers:is-transposed($node)) then
413
                ()
414

MRodz's avatar
MRodz committed
415
            else
416
                fontaneSimple:transform($node/node())
417

MRodz's avatar
MRodz committed
418
        case element(tei:figure) return
419
            if(count($node/child::*) = 1 and $node/child::tei:figDesc) then
420
                (: genealogy lines probably shouldn't be displayed, but I still have to
421
422
423
424
                check that. in case they should be serialized, I leave the code :)
(:                if(matches($node/descendant::tei:ref, "Stammbaumverbindungslinie")) then:)
(:                    element tei:seg {:)
(:                        $node/@*,:)
425
(:                        fontaneSimple:transform($node/node()):)
426
427
428
429
430
431
(:                    }:)
(:                else if(matches($node/descendant::tei:ref, "Schlusslinie")):)
                if(matches($node/descendant::tei:ref, "Schlusslinie"))
                    then
                        element tei:ab {
                            switch ($node/descendant::tei:ref)
432
433
434
                                case "horizontale einfache Schlusslinie" return
                                    attribute type {"long-end-line"}
                                case "Schlusslinie; horizontale Halbschleife von links oben nach rechts" return
435
                                    attribute type {"long-end-line"}
436
                                case "horizontale einfache Schlusslinie (gewellt)" return
437
                                    attribute type {"long-end-line-wavy"}
438
                                case "Schlusslinien; horizontale Schleife von links oben nach rechts unten" return
439
                                    attribute type {"bottom-brace-short"}
440
441
                                default return
                                    attribute type {"end-line"}
442
443
                        }
                else if(matches($node/descendant::tei:ref, "Absatzlinie")
444
445
                (: in case of double paragraph lines the single lines are
                encoded with "oberer" resp. "unterer Teil", but we only
446
447
448
449
450
451
452
453
454
455
                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
456
457
                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
458
459
                        $node/@*,
                        fontaneSimple:transform($nodes/node())
MRodz's avatar
MRodz committed
460
                    }
461
                else
MRodz's avatar
MRodz committed
462
463
                    ()
            else
464
                fontaneSimple:copy-element($node)
465

MRodz's avatar
MRodz committed
466
        case element(tei:note) return
467
            if($node/@type = "authorial"
468
            and not($node/@subtype = "footnote")) then
MRodz's avatar
MRodz committed
469
                ()
470
            else
471
                fontaneSimple:copy-element($node)
472

MRodz's avatar
MRodz committed
473
474
475
476
477
478
        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,
479
                fontaneSimple:transform($node/node())
MRodz's avatar
MRodz committed
480
            }
481

MRodz's avatar
MRodz committed
482
        case element(tei:figDesc) return
483
            fontaneSimple:copy-element($node)
484

MRodz's avatar
MRodz committed
485
        case element(tei:ref) return
486
            fontaneSimple:copy-element($node)
487

MRodz's avatar
MRodz committed
488
        case element(tei:space) return
489
            fontaneSimple:copy-element($node)
490

MRodz's avatar
MRodz committed
491
        case element(tei:choice) return
492
            fontaneSimple:copy-element($node)
493

MRodz's avatar
MRodz committed
494
        case element(tei:abbr) return
495
            fontaneSimple:copy-element($node)
496

MRodz's avatar
MRodz committed
497
        case element(tei:expan) return
498
            fontaneSimple:copy-element($node)
499
500
501
502
503
504
            
        case element(tei:sic) return
            fontaneSimple:copy-element($node)     
            
        case element(tei:corr) return
            fontaneSimple:copy-element($node)
505

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

MRodz's avatar
MRodz committed
509
        case element(tei:date) return
510
            element {QName("http://www.tei-c.org/ns/1.0", $node/name())}{
511
512
                (if($node/@when-iso) then
                    attribute when {$node/@when-iso}
513
514
                else
                    ()),
515
516
                (if($node/@from-iso) then
                    attribute from {$node/@from-iso}
517
518
                else
                    ()),
519
520
                (if($node/@to-iso) then
                    attribute to {$node/@to-iso}
Michelle Rodzis's avatar
Michelle Rodzis committed
521
                else
522
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
523
524
                (if($node/@notAfter-iso) then
                    attribute notAfter {$node/@notAfter-iso}
525
                else
526
                    ()),
Michelle Rodzis's avatar
Michelle Rodzis committed
527
                $node/(@* except (@when-iso, @to-iso, @from-iso, @notAfter-iso)),
528
                fontaneSimple:transform($node/node())
529
            }
530

531
        case element(tei:ptr) return
Michelle Rodzis's avatar
Michelle Rodzis committed
532
            text{"test"}
533

MRodz's avatar
MRodz committed
534
        default return
535
            fontaneSimple:transform($node/node())
536
};
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
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
624
625
626
627
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

(:~
 : 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)),
        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
                ()
        }
};
658
659


660
declare function fontaneSimple:mark-intervention($node as element(*)) 
661
662
as element(tei:seg) {
    element tei:seg {
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
        if($node[self::tei:lb]) then
            attribute type {"missing-hyphen"}
        else if($node[self::tei:surplus]) then
            attribute type {"surplus"}
        else
            attribute type {"reduplication"},
        <tei:hi xmlns="http://www.tei-c.org/ns/1.0">‹</tei:hi>,
        if($node[self::tei:lb]) then
            simpleHelpers:find-chars($node)
        else
            fontaneSimple:transform($node/node()),
        <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"}
704
705
    }
};