-
Notifications
You must be signed in to change notification settings - Fork 0
/
votxq.xqm
99 lines (94 loc) · 3.26 KB
/
votxq.xqm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(:~
: This module was created during the retro-digitization of the Votic dictionary.
: It encapsulates a few general purpose functions sprung out from that work.
:
: @author Kristian Kankainen, MTÜ Keeleleek
: @see http://www.github.org/kristiank/votxq
: @version: 1.0
:)
module namespace keeleleek = "http://codemodules.keeleleek.ee/xquery";
(:~
: Encloses matching text with the element name given. Overlapping patterns
: are not matched -- run the function twice instead. Don't do this!
: Identical elements with same text can be created!
:
: @param $root the element to be modified
: @param $regexp the pattern to be matched
: @param $enclosing-element the name of the element
:)
declare updating
function keeleleek:enclose-matching-text(
$root as element()+,
$regexp as xs:string,
$enclosing-element as xs:QName
)
{
(: should be similar to
for $element in $root//(* except name($enclosing-element))/text()[matches(., $regexp)]/..:)
for $element in $root//text()[matches(., $regexp)]/..
return replace node $element
with copy $new-element := $element
modify (
for $text-node in $new-element/text()[matches(., $regexp)]
let $analysis := fn:analyze-string($text-node, $regexp)
return (
insert node (
for $part in $analysis/*
return
switch ($part/name())
case "fn:match" return
(:<vot:koht>{$part/text()}</vot:koht>:)
($part/fn:group[@nr=1]/text(),
element {$enclosing-element} {$part/fn:group[@nr=2]/text()},
$part/fn:group[@nr=3]/text())
case "fn:non-match" return
$part/text()
default return ()
) before $text-node,
delete node $text-node
)
)
return $new-element
};
(:~
: Encloses matching text with the element name given. Overlapping patterns
: are not matched -- run the function twice instead. Don't do this!
: Identical elements with same text can be created!
:
: @param $root the element to be modified
: @param $regexp the pattern to be matched
: @param $enclosing-element the name of the element
:)
declare
function keeleleek:enclose-matching-text-preview(
$root as element()+,
$regexp as xs:string,
$enclosing-element as xs:QName
)
{
(: should be similar to
for $element in $root//(* except name($enclosing-element))/text()[matches(., $regexp)]/..:)
for $element in $root//text()[matches(., $regexp)]/..
return copy $new-element := $element
modify (
for $text-node in $new-element/text()[matches(., $regexp)]
let $analysis := fn:analyze-string($text-node, $regexp)
return (
insert node (
for $part in $analysis/*
return
switch ($part/name())
case "fn:match" return
(:<vot:koht>{$part/text()}</vot:koht>:)
($part/fn:group[@nr=1]/text(),
element {$enclosing-element} {$part/fn:group[@nr=2]/text()},
$part/fn:group[@nr=3]/text())
case "fn:non-match" return
$part/text()
default return ()
) before $text-node,
delete node $text-node
)
)
return $new-element
};