Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

include module 1 #4

Merged
merged 2 commits into from
Jan 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
449 changes: 377 additions & 72 deletions source/eXist-db/controller.xql

Large diffs are not rendered by default.

29 changes: 29 additions & 0 deletions source/xql/module1/get_MEI_file_as_XML.xql
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
xquery version "3.1";

(:
get_MEI_file_as_XML.xql

This xQuery …
:)

declare namespace xhtml="http://www.w3.org/1999/xhtml";
declare namespace mei="http://www.music-encoding.org/ns/mei";
declare namespace svg="http://www.w3.org/2000/svg";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace transform="http://exist-db.org/xquery/transform";

import module namespace config="https://api.beethovens-werkstatt.de" at "../../xqm/config.xqm";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

(: set output to XML:)
declare option output:method "xml";
declare option output:media-type "text/plain";

let $file.id := request:get-parameter('file.id','')

let $doc := collection($config:module1-root)//mei:mei[@xml:id = $file.id]

return
$doc
31 changes: 31 additions & 0 deletions source/xql/module1/get_MEI_snippet_as_XML.xql
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
xquery version "3.1";

(:
get_MEI_file_as_XML.xql

This xQuery …
:)

declare namespace xhtml="http://www.w3.org/1999/xhtml";
declare namespace mei="http://www.music-encoding.org/ns/mei";
declare namespace svg="http://www.w3.org/2000/svg";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace transform="http://exist-db.org/xquery/transform";

import module namespace config="https://api.beethovens-werkstatt.de" at "../../xqm/config.xqm";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

(: set output to XML:)
declare option output:method "xml";
declare option output:media-type "text/plain";

let $edition.id := request:get-parameter('edition.id','')
let $element.id := request:get-parameter('element.id','')

let $doc := collection($config:module1-root)//mei:mei[@xml:id = $edition.id]
let $elem := $doc/id($element.id)

return
$elem
44 changes: 44 additions & 0 deletions source/xql/module1/get_SVG_file_as_XML.xql
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
xquery version "3.1";

(:
get_SVG_file_as_XML.xql

This xQuery …
:)

declare namespace xhtml="http://www.w3.org/1999/xhtml";
declare namespace mei="http://www.music-encoding.org/ns/mei";
declare namespace svg="http://www.w3.org/2000/svg";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace transform="http://exist-db.org/xquery/transform";
declare namespace local="no:where";

import module namespace config="https://api.beethovens-werkstatt.de" at "../../xqm/config.xqm";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

(: set output to XML:)
declare option output:method "xml";
declare option output:media-type "text/plain";

(: return a deep copy of the elements and attributes without ANY namespaces :)
declare function local:remove-namespaces($element as element()) as element() {
element { local-name($element) } {
for $att in $element/@*
return
attribute {local-name($att)} {$att},
for $child in $element/node()
return
if ($child instance of element())
then local:remove-namespaces($child)
else $child
}
};

let $file.id := request:get-parameter('file.id','')

let $svg := collection($config:module1-root)//svg:svg[@id = replace($file.id,'.svg','')]

return
local:remove-namespaces($svg)
108 changes: 108 additions & 0 deletions source/xql/module1/get_all_MEI_files_from_DB_as_JSON.xql
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
xquery version "3.1";

(:
get_all_MEI_files_from_DB_as_JSON.xql

This xQuery …
:)

import module namespace config="https://api.beethovens-werkstatt.de" at "../../xqm/config.xqm";

declare namespace xhtml="http://www.w3.org/1999/xhtml";
declare namespace mei="http://www.music-encoding.org/ns/mei";
declare namespace svg="http://www.w3.org/2000/svg";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace transform="http://exist-db.org/xquery/transform";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

(: set output to JSON:)
declare option output:method "json";
declare option output:media-type "application/json";

(:
$preview.width and .height are used to specify the dimensions
of a preview image of the edition, which can be displayed as
"appetizer" for the edition. Dimensions are actually doubled
(to prepare for for retina displays)
:)
let $preview.width := 240
let $preview.height := 180

let $header-addition := response:set-header("Access-Control-Allow-Origin","*")

let $all.docs := collection($config:module1-root)//mei:mei[mei:meiHead/mei:altId[@type = 'VideApp']]
let $works := distinct-values($all.docs//mei:altId[@type = 'VideApp' and @subtype = 'work']/@label)
let $docs :=
for $work in $works
let $files := $all.docs[.//mei:altId[@type = 'VideApp' and @subtype = 'work' and @label = $work]]
let $versions := distinct-values($files//mei:altId[@type = 'VideApp' and @subtype = 'version']/@n)
let $max.level1 := max(for $version in $versions return number(tokenize($version,'\.')[1]))
let $versions.max1 := $versions[number(tokenize(.,'\.')[1]) = $max.level1]
let $max.level2 := max(for $version in $versions.max1 return number(tokenize($version,'\.')[2]))
let $versions.max2 := $versions.max1[number(tokenize(.,'\.')[2]) = $max.level2]
let $max.level3 := max(for $version in $versions.max2 return number(tokenize($version,'\.')[3]))
let $current.version := $versions.max2[number(tokenize(.,'\.')[3]) = $max.level3]
return
$files[.//mei:altId[@type = 'VideApp' and @subtype = 'version']/@n = $current.version]

let $entries :=

map:merge(
for $doc in $docs
let $filename := tokenize(document-uri($doc/root()),'/')[last()]
let $edition.id := $doc/string(@xml:id)
let $edition.title := normalize-space($doc//mei:fileDesc/mei:titleStmt/mei:title[@type = 'editionTitle'][1]/string-join(text(),' '))
let $videApp.workId := normalize-space($doc//mei:altId[@type = 'VideApp' and @subtype = 'work']/@label)
let $videApp.main := normalize-space($doc//mei:fileDesc/mei:titleStmt/mei:title[@type = 'videApp.main'][1]/string-join(text(),' '))
let $videApp.sub := normalize-space($doc//mei:fileDesc/mei:titleStmt/mei:title[@type = 'videApp.sub'][1]/string-join(text(),' '))
let $edition.desc := normalize-space(string-join($doc//mei:fileDesc/mei:notesStmt/mei:annot[@type = 'editionDesc']/mei:p/normalize-space(string-join(text(),' ')),' '))
let $preview.zone := //$doc/id($doc//mei:fileDesc/mei:notesStmt/mei:annot[@type = 'editionDesc']/replace(@plist,'#',''))
let $preview.baseURI := $preview.zone/parent::mei:surface/mei:graphic[@type = 'iiif']/@target
let $preview.zone.width := number($preview.zone/@lrx) - number($preview.zone/@ulx)
let $preview.zone.height := number($preview.zone/@lry) - number($preview.zone/@uly)
let $preview.region := $preview.zone/@ulx || ',' || $preview.zone/@uly || ',' || $preview.zone.width || ',' || $preview.zone.height || '/'
let $preview.size := string($preview.width * 2) || ',' || string($preview.height * 2) || '/'
let $supportedViews :=
for $app in $doc//mei:application[@type = 'videApp']
let $map := map {
'id': $app/string(@xml:id),
'version': $app/string(@version)
}
let $output :=
if ($app/@subtype)
then map:put($map, 'feature', $app/string(@subtype))
else $map
return $output

let $revisions :=
for $version in $all.docs[.//mei:altId[@type = 'VideApp' and @subtype = 'work' and @label = $videApp.workId]]/normalize-space(.//mei:altId[@type = 'VideApp' and @subtype = 'version']/string(@n))
return $version

return
map:entry($edition.id, map {
'id': $edition.id,
'title': $videApp.main,
'opus': $videApp.sub,
'fullTitle': $edition.title,
'desc': $edition.desc,
'revisions': array { $revisions },
'previewUri': $preview.baseURI || $preview.region || $preview.size || '0/default.jpg',
'supportedViews': array { $supportedViews}
})
(: '"' || $edition.id || '":{' ||
'"id":"' || $edition.id || '",' ||
'"title":"' || $videApp.main || '",' ||
'"opus":"' || $videApp.sub || '",' ||
'"fullTitle":"' || $edition.title || '",' ||
'"desc":"' || $edition.desc || '",' ||
'"revisions":[' || string-join($revisions,',') || '],' ||
'"previewUri":"' || $preview.baseURI || $preview.region || $preview.size || '0/default.jpg' || '",' ||
'"supportedViews":[' || string-join($supportedViews,',') || ']' ||
'}' :)
)



return $entries
71 changes: 71 additions & 0 deletions source/xql/module1/get_annotations_as_json.xql
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
xquery version "3.1";

(:
get_annotations_as_JSON.xql

This xQuery seeks to extract the exact positions of all notes, rests and similar,
trying to provide Verovio with all the information it needs to render a
diplomatic transcript
:)

declare namespace xhtml="http://www.w3.org/1999/xhtml";
declare namespace mei="http://www.music-encoding.org/ns/mei";
declare namespace svg="http://www.w3.org/2000/svg";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace transform="http://exist-db.org/xquery/transform";
declare namespace vide="http://beethovens-werkstatt.de/ns/vide";
declare namespace functx="http://www.functx.com";

import module namespace console="http://exist-db.org/xquery/console";
import module namespace config="https://api.beethovens-werkstatt.de" at "../../xqm/config.xqm";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

(: set output to JSON:)
declare option output:method "json";
declare option output:media-type "application/json";

let $edition.id := request:get-parameter('edition.id','')

let $doc := collection($config:module1-root)//mei:mei[@xml:id = $edition.id]

let $annotations :=
for $annot in $doc//mei:annot[@type = 'editorialComment']
let $id := $annot/string(@xml:id)
let $title := $annot/mei:title/text()
let $plist :=
for $p in $annot/tokenize(replace(@plist,'#',''),' ')
return $p
let $plist.strings :=
for $p in $plist
return '"' || $p || '"'
let $elements :=
for $p in $plist
return $doc/id($p)
let $facs :=
for $facs.ref in $elements//@facs/tokenize(normalize-space(replace(.,'#','')),' ')
return $facs.ref
let $pageMap := map {}

let $pages :=
map:merge(
for $page in $doc//mei:graphic[@type = 'shapes']
where (some $shape in $facs satisfies collection($config:module1-root)//svg:svg[@id = $page/@target]//svg:path[@id = $shape])
let $shapes :=
for $shape in $facs
where collection($config:module1-root)//svg:svg[@id = $page/@target]//svg:path[@id = $shape]
return $shape

return
map:entry($page/parent::mei:surface/string(@xml:id), array { $shapes })
)

return map {
'id': $id,
'title': $title,
'plist': array { $plist.strings },
'facs': $pages
}

return array { $annotations }
63 changes: 63 additions & 0 deletions source/xql/module1/get_annotations_on_page_as_json.xql
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
xquery version "3.1";

(:
get_annotations_as_JSON.xql

This xQuery seeks to extract the exact positions of all notes, rests and similar,
trying to provide Verovio with all the information it needs to render a
diplomatic transcript
:)

declare namespace xhtml="http://www.w3.org/1999/xhtml";
declare namespace mei="http://www.music-encoding.org/ns/mei";
declare namespace svg="http://www.w3.org/2000/svg";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace transform="http://exist-db.org/xquery/transform";
declare namespace vide="http://beethovens-werkstatt.de/ns/vide";
declare namespace functx="http://www.functx.com";

import module namespace config="https://api.beethovens-werkstatt.de" at "../../xqm/config.xqm";

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

(: set output to JSON:)
declare option output:method "json";
declare option output:media-type "application/json";

let $edition.id := request:get-parameter('edition.id','')
let $page.id := request:get-parameter('page.id','')

let $doc := collection($config:module1-root)//mei:mei[@xml:id = $edition.id]
let $svg.file := collection($config:module1-root)//svg:svg[@id = $doc/id($page.id)/mei:graphic[@type = 'shapes']/@target]

let $annotations :=
for $annot in $doc//mei:annot[@type = 'editorialComment']
let $id := $annot/string(@xml:id)
let $title := $annot/mei:title/text()
let $plist :=
for $p in $annot/tokenize(replace(@plist,'#',''),' ')
return $p
let $elements :=
for $p in $plist
return $doc/id($p)
let $facs :=
for $facs.ref in $elements//@facs/tokenize(normalize-space(replace(.,'#','')),' ')
return $facs.ref

let $shapes :=
for $shape in $facs
where exists($svg.file//svg:path[@id = $shape])
return $shape

where (some $shape in $facs satisfies exists($svg.file//svg:path[@id = $shape]))

return map {
'id': $id,
'page': $page.id,
'title': $title,
'plist': array { $plist },
'facs': array { $shapes }
}

return array { $annotations }
Loading
Loading