xquery version "3.1";
module namespace f-misc="http://fontane-nb.dariah.eu/ns/SADE/misc";
import module namespace config="http://textgrid.de/ns/SADE/config" at "../config/config.xqm";
declare namespace tei="http://www.tei-c.org/ns/1.0";
declare namespace test="http://exist-db.org/xquery/xqsuite";
declare namespace tgmd="http://textgrid.info/namespaces/metadata/core/2010";
declare namespace xhtml="http://www.w3.org/1999/xhtml";
declare variable $f-misc:metadata-collection := collection("/db/sade-projects/textgrid/data/xml/meta");
declare
%test:setUp
function f-misc:setup(){
let $testconfig := doc("tests.xml")//testdata[@module="f-misc"]
(: prepare the collections :)
let $prepare-collections :=
for $create in $testconfig//create/collection
return
config:mkcol($create/@path)
(: prepare documents :)
let $prepare-documents :=
for $create in $testconfig//create/document
return
xmldb:store($create/@collection, $create/@name, $create/*)
return true()
};
declare
%test:tearDown
function f-misc:teardown(){
xmldb:remove("/db/sade-projects")
};
declare
%test:arg("baseUri","textgrid:16b00") %test:assertEquals("Notizbuch C7")
%test:arg("baseUri","") %test:assertEquals("")
function f-misc:get-title-by-baseUri($baseUri as xs:string)
as xs:string? {
if($baseUri = "") then () else
$f-misc:metadata-collection//tgmd:textgridUri[starts-with(string(.), $baseUri)]/ancestor::tgmd:object//tgmd:title/string()
=> replace("([A-E])0(\d)", "$1$2")
};
declare function f-misc:nb-param-to-title($node as node(), $model as map(*), $nb as xs:string?)
as xs:string? {
if(string($nb) = "")
then ""
else f-misc:get-title-by-baseUri( "textgrid:" || $nb )
};
(:~
: Translates tei:surface/@n to German
: @param $n – a valid @tei:n value
: @return the German version, e.g. outer_front_cover translates to "vordere Einbanddecke außen"
: :)
declare function f-misc:n-translate($n as xs:string)
as xs:string{
if(contains($n, 'endpaper'))
then
let $seq := tokenize($n, '_')
return
((switch($seq[1])
case "front" return 'vorderes'
case "back" return 'hinteres'
default return 'ungültiger Wert in @n')
|| ' Vorsatzblatt ' || $seq[last()])
else
switch ($n)
case "outer_front_cover" return "vordere Einbanddecke außen"
case "inner_front_cover" return "vordere Einbanddecke innen"
case "inner_back_cover" return "hintere Einbanddecke innen"
case "outer_back_cover" return "hintere Einbanddecke außen"
case "spine" return "Buchrücken"
default return $n
};
declare function f-misc:cite($node as node(), $model as map(*)) {
let $url := request:get-url(),
$res := tokenize($url, '/')[last()],
$id := request:get-parameter('id', ''),
$page := request:get-parameter('page', 'outer_front_cover'),
$page := if($page = '') then 'outer_front_cover' else $page,
$page := switch ($page)
case "outer_front_cover" return "vordere Einbanddecke außen"
case "inner_front_cover" return "vordere Einbanddecke innen"
case "inner_back_cover" return "hintere Einbanddecke außen"
case "outer_back_cover" return "hintere Einbanddecke innen"
case "spine" return "Buchrücken"
default return 'Blatt '||$page,
$doc := doc( config:get("data-dir")||$id),
$title := $doc//tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title/string(),
$version := string( ($doc//tei:TEI/tei:teiHeader/tei:revisionDesc/tei:change[last()]/text())[1] ),
$date := current-date(),
$date := day-from-date($date)||'.'||month-from-date($date)||'.'||year-from-date($date),
$url := replace($url, 'localhost:8080/exist/apps/SADE/textgrid', 'fontane-nb.dariah.eu') ||(if (request:get-query-string()) then '?' || request:get-query-string() else '')
return
switch ($res)
case 'edition.html'
return
Zitationsempfehlung
Theodor Fontane: {$title}. Hrsg. von Gabriele Radecke.
In: Theodor Fontane: Notizbücher. Digitale genetisch-kritische und kommentierte Edition.
Hrsg. von Gabriele Radecke,
Blatt {$page}.
{$url}.
{$version},
abgerufen am {$date}
case 'inhalt.html'
return
Zitationsempfehlung
Theodor Fontane: {$title} (Inhaltsverzeichnis). Hrsg. von Gabriele Radecke.
{$url},
abgerufen am: {$date}
case 'doku.html'
return
Zitationsempfehlung
Gabriele Radecke unter Mitarbeit von Martin de la Iglesia und Mathias Göbel: Editorische Gesamtdokumentation.
Editorische Assistenz: Rahel Rami und Judith Michaelis. In: Theodor Fontane: Notizbücher. Digitale
genetisch-kritische und kommentierte Edition. Hrsg. von Gabriele Radecke.
{$url}, abgerufen am {$date}
default
return
Zitationsempfehlung
Theodor Fontane: Notizbücher. Hrsg. von Gabriele Radecke.
{$url}
abgerufen am: {$date}
};
declare function f-misc:kaesten($node as node(), $model as map(*)){
let $q := request:get-parameter('n', '')
let $q := if(string-length($q) = 1) then $q||"0" else $q
let $num := if(matches($q, "\d+$")) then number(substring($q, 2, 2)) else 0
let $q := substring($q, 1, 1)
let $data-dir := config:get("data-dir")
return
(
,
{
for $kasten in (('a', 'b', 'c', 'd', 'e'))
return
if ($q = $kasten)
then
{f-misc:list( $data-dir || '/xml/meta', upper-case($kasten), $num)}
else
{f-misc:list($data-dir || '/xml/meta', upper-case($kasten), $num)}
}
)
};
declare function f-misc:list($datadir, $param, $num as xs:integer) {
let $tgnav:= doc('/db/sade-projects/textgrid/navigation-fontane.xml')
for $item at $pos in distinct-values($tgnav//object[string(@type)="text/xml"][starts-with(string(@title), 'Notizbuch ' || $param)]/string(@title))
(:
: use these lines, when more than on revision is in the database
: let $maxRev:= max($tgnav//object[@title = $item]/number(substring-after(@uri, '.'))),:)
(: $uri:= $tgnav//object[@title = $item][number(substring-after(@uri, '.')) = $maxRev]/substring-after(@uri, 'textgrid:'):)
let $uri:= $tgnav//object[string(@title) = $item]/substring-before(substring-after(@uri, 'textgrid:'), '.')
let $thisIn := upper-case(replace(request:get-parameter('n', ''), "\d", "")) || $num eq replace($item, "Notizbuch ([A-E])0(\d)", "$1$2")
return
{
let $img := "digilib/"||substring-after($item, ' ')||"_001.jpg?dh=350&mo=jpg"
return
element xhtml:img {
attribute class {"imgLazy"},
attribute src {
if ($thisIn) then $img else "/public/img/loader.svg"
},
if(not($thisIn)) then
attribute data-original {$img}
else ()
}
}
};
declare function f-misc:content($node as node(), $model as map(*), $id, $page){
{f-misc:nbTitle(request:get-parameter('id', ''), $model)}
{if(matches($page, '\d+(r|v)')) then ': '||replace($page, "-alt", "") else ()}
,
Faksimile
,
Transkription
,
XML
};
declare function f-misc:buttons($node as node(), $model as map(*)){
let $cookies := request:get-cookie-names()
let $pagenum := request:get-parameter('page', 'outer_front_cover')
let $pagenum := if ($pagenum = '') then 'outer_front_cover' else $pagenum
let $page := doc( config:get("data-dir") || request:get-parameter('id', '/xml/data/16b00.xml'))//tei:surface[@n = $pagenum]
let $entities := distinct-values($page//tei:rs/substring-before(@ref, ':'))
let $rslistItems := for $e in $entities
order by $e
return
switch($e)
case 'psn' return Personen
case 'plc' return Orte
case 'wrk' return Werke
case 'eve' return Ereignisse
case 'org' return Institutionen
default return Keine
let $datelistItems := if($page//tei:date) then for $item in distinct-values( $page//tei:date/string(@when-iso) ) return {$item} else Keine
let $reflistItems := if($page//tei:ref[not(parent::tei:figDesc)]) then for $item in distinct-values( $page//tei:ref[not(parent::tei:figDesc)]/string-join(., ' ') ) return {$item} else Keine
return
switch ( config:get('sade.develop') )
case "true" return
default return
};
declare function f-misc:mirador($node as node(), $model as map(*), $n){
let $sandbox := doc( "/db/sade-projects/textgrid/data/xml" || "/sandbox-iiif.xml" )
let $url := "https://textgridlab.org/1.0/iiif/mirador/?uri="
let $book := if(string-length($n) = 2) then substring($n, 1, 1) || "0" || substring($n, 2, 1) else $n
let $uri := string($sandbox//tgmd:title[matches(., "Notizbuch_" || $book || "-IIIF")]/ancestor::tgmd:generic//tgmd:textgridUri)
return
};
declare function f-misc:debug( $node as node(), $model as map(*) ){
};
declare function f-misc:ToolbarExtended($node as node(), $model as map(*)) {
let $develop := config:get('sade.develop')
return
switch ($develop)
case "true" return
default return
};
declare function f-misc:textgridStatus($node as node(), $model as map(*)) {
let $col := "/db/sade-projects/textgrid"
let $res := "tgstatus.xml"
let $url := "https://dariah-de.github.io/status/textgrid/repstatus.html"
let $lastMod := xmldb:last-modified($col, $res)
let $path := $col || "/" || $res
let $doc := doc( $path )
let $active := not( exists( $doc//ok ) )
let $needUpdate := not(doc-available($path)) or $lastMod < (current-dateTime() - xs:dayTimeDuration("PT6H"))
let $getStatus :=
if( $needUpdate )
then
let $status := httpclient:get(xs:anyURI($url), false(), ())//xhtml:div[contains(@class, 'repstatus')][not( contains(@class, 'ok') )]
let $status := if( exists( $status ) ) then $status else
return
(xmldb:login($col, config:get("sade.user"), config:get("sade.password")),
xmldb:store($col, $res, $status))
else if($active and $lastMod < (current-dateTime() - xs:dayTimeDuration("PT2H")))
then
let $status := httpclient:get(xs:anyURI($url), false(), ())//xhtml:div[contains(@class, 'repstatus')][not( contains(@class, 'ok') )]
let $status := if( exists( $status ) ) then $status else
return
(xmldb:login($col, config:get("sade.user"), config:get("sade.password")), xmldb:store($col, $res, $status))
else ()
let $doc := doc( $col || "/" || $res )
return
let $status := $doc/xhtml:div[@class]/tokenize(@class, '\s+')[last()]
return
if( $doc//ok ) then () else
TextGrid-Statusmeldung
Es liegt eine aktuelle Meldung zum TextGrid Repository vor. Einige
Funktionen, z.Bsp die Darstellung der Faksimiles, sind vom TextGrid
Repository abhängig und daher evtl. davon betroffen. Hier folgt die
Meldung von TextGrid.
Status: {$status}
{for $i at $pos in $doc/xhtml:div//xhtml:p[@lang="de"] return (if($pos gt 1) then
else (),$i)}
};
declare function f-misc:serverStatus($node as node(), $model as map(*)) {
let $col := "/db/sade-projects/textgrid"
let $res := "serverstatus.xml"
let $url := "https://dariah-de.github.io/status/index.html"
let $lastMod := xmldb:last-modified($col, $res)
let $path := $col || "/" || $res
let $doc := doc( $path )
let $active := not( exists( $doc//ok ) )
let $needUpdate := not(doc-available($path)) or $lastMod < (current-dateTime() - xs:dayTimeDuration("PT6H"))
let $getStatus :=
if( $needUpdate )
then
let $status := httpclient:get(xs:anyURI($url), false(), ())//*:li[contains(., "Fontane")]/ancestor::*:div[contains(@class, "alert")]
let $status := if( exists( $status ) ) then $status else
return
(xmldb:login($col, config:get("sade.user"), config:get("sade.password")),
xmldb:store($col, $res, $status))
else if($active and $lastMod < (current-dateTime() - xs:dayTimeDuration("PT2H")))
then
let $status := httpclient:get(xs:anyURI($url), false(), ())//*:li[contains(., "Fontane")]/ancestor::*:div[contains(@class, "alert")]
let $status := if( exists( $status ) ) then $status else
return
(xmldb:login($col, config:get("sade.user"), config:get("sade.password")), xmldb:store($col, $res, $status))
else ()
let $doc := doc( $col || "/" || $res )
return
let $status := $doc/*:div[@class]/tokenize(@class, '\s+')[last()]
return
if( $doc//ok ) then () else
Statusmeldung
Es liegt eine aktuelle Meldung zum Betrieb dieses Servers vor.
Status: {substring-after($status, "-")}
Datum: {string-join( ($doc//*:time/string(@datetime)), ";")}
Die vollständige Statusmeldung finden Sie unter dariah-de.github.io/status/
};
declare function f-misc:nbTitle($id as xs:string, $model as map(*)){
let $doc := doc( config:get("data-dir") || $id)
let $title := $doc//tei:teiHeader/tei:fileDesc/tei:titleStmt/tei:title/string(.)
let $beta := if(contains(($doc//tei:revisionDesc/tei:change)[last()]/text(), 'Version 0.')) then beta else ()
return (
(: {substring-before($title, ' ')},:)
{' '||substring-after($title, ' ')},
$beta
)
};
declare function f-misc:pageNav($node as node(), $model as map(*), $id as xs:string, $page as xs:string)
as element()* {
if(request:get-parameter-names() = 'page')
then
let $uri := $id => substring-after("/xml/data") => substring-before(".xml")
let $page := if($page = '') then 'outer_front_cover' else $page
let $indexFile := doc('/db/sade-projects/textgrid/data/xml/xhtml/' || $uri || "/toc.xml" )
let $pageList2 := $indexFile//@data-page/string()
let $index2 := index-of($pageList2, $page)
let $return :=
(
(
if ( $index2 gt 1 )
then
vorige Seite
else ()
)
,
(
if ( $index2 lt count($pageList2) )
then
nächste Seite
else ()
),
element script {
'$(document).keyup(function(e){
var next = jQuery.isEmptyObject( $("#navNext").attr("href") );
var prev = jQuery.isEmptyObject( $("#navPrev").attr("href") );
if ( (e.keyCode == 37) && prev == false )
{location.href = $( "#navPrev" ).attr("href"); }
else if (e.keyCode == 39 && next == false )
{location.href = $( "#navNext" ).attr("href"); }
});'
}
)
return $return
else ()
};
declare function f-misc:tocHeader($node as node(), $model as map(*)){
{f-misc:nbTitle(request:get-parameter('id', ''), $model)}
};