-
Notifications
You must be signed in to change notification settings - Fork 24
/
getMeasurePage.xql
94 lines (78 loc) · 3.34 KB
/
getMeasurePage.xql
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
xquery version "3.1";
(:
: For LICENSE-Details please refer to the LICENSE file in the root directory of this repository.
:)
(: NAMESPACE DECLARATIONS ================================================== :)
declare namespace mei = "http://www.music-encoding.org/ns/mei";
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace request = "http://exist-db.org/xquery/request";
declare namespace xlink = "http://www.w3.org/1999/xlink";
declare namespace xmldb = "http://exist-db.org/xquery/xmldb";
(: OPTION DECLARATIONS ===================================================== :)
declare option output:media-type "text/plain";
declare option output:method "text";
(: FUNCTION DECLARATIONS =================================================== :)
declare function local:findMeasure($mei, $movementId, $measureIdName) {
let $m := $mei/id($measureIdName)
return
if ($m) then
($m)
else
(($mei/id($movementId)//mei:measure[@n eq $measureIdName])[1])
};
declare function local:getMeasure($mei, $measure, $movementId) as xs:string {
let $measureId := $measure/string(@xml:id)
let $zoneId := substring-after($measure/string(@facs), '#')
let $zone := $mei/id($zoneId)
let $surface := $zone/parent::mei:surface
let $graphic := $surface/mei:graphic[@type = 'facsimile']
return
concat(
'{',
'measureId:"', $measureId, '",',
'zoneId:"', $zoneId, '",',
'pageId:"', $surface/string(@xml:id), '", ',
'movementId:"', $movementId, '",',
'path: "', $graphic/string(@target), '", ',
'width: "', $graphic/string(@width), '", ',
'height: "', $graphic/string(@height), '", ',
'ulx: "', $zone/string(@ulx), '", ',
'uly: "', $zone/string(@uly), '", ',
'lrx: "', $zone/string(@lrx), '", ',
'lry: "', $zone/string(@lry), '"',
'}'
)
};
(: QUERY BODY ============================================================== :)
let $id := request:get-parameter('id', '')
let $measureIdName := request:get-parameter('measure', '')
let $movementId := request:get-parameter('movementId', '')
let $measureCount := request:get-parameter('measureCount', '1')
let $mei := doc($id)/root()
let $measure := local:findMeasure($mei, $movementId, $measureIdName)
let $extraMeasures :=
for $i in (2 to xs:integer($measureCount))
let $m := $measure/following-sibling::mei:measure[$i - 1] (: TODO: following-sibling könnte problematisch sein, da so section-Grenzen nicht überwunden werden :)
return
if ($m) then
($m)
else
()
(: Extra measure parts :)
let $extraMeasuresParts :=
for $exm in $measure | $extraMeasures
return
$exm/following-sibling::mei:measure[(exists(@label) and @label = $exm/@label) or (not(exists(@label)) and @n = $exm/@n)]
return
concat(
'[',
string-join((
local:getMeasure($mei, $measure, $movementId),
for $m in $extraMeasures
return
local:getMeasure($mei, $m, $movementId),
for $m in $extraMeasuresParts
return
local:getMeasure($mei, $m, $movementId)
), ','),
']')