From 1eb35b3d5f5f2c3a25c463cc059b9085e9514289 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 23 Apr 2013 08:16:04 +0200 Subject: [PATCH 01/48] applied patch 0a1cb79ef2034b82d4b5987ed3580388139f3ba8 --- webapp/controller.xql | 28 ++++++++++++------------ webapp/xql/modules/ajax.xqm | 40 +++++++++++++++++++---------------- webapp/xql/modules/facets.xqm | 29 +++++++++++++------------ webapp/xql/modules/wega.xqm | 14 ++++++------ 4 files changed, 58 insertions(+), 53 deletions(-) diff --git a/webapp/controller.xql b/webapp/controller.xql index e10aa9501..8ee814306 100644 --- a/webapp/controller.xql +++ b/webapp/controller.xql @@ -111,7 +111,7 @@ else if (matches($exist:path, '^/[Ii]ndex(\.(htm|html|xml)|/)?$')) then else if (matches($exist:path, '^/(en/|de/)(Index)?$')) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -146,7 +146,7 @@ else if (matches($exist:path, concat('^/', $lang,'/', $indices, '(/(', $persons, (: Editorial Guidelines :) else if (matches($exist:path, concat('^/', $lang, '/', $editorialGuidelines, '/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -160,7 +160,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', $editorialGuidelines, '/? (: Impressum :) else if ($exist:path eq '/en/About' or $exist:path eq '/de/Impressum') then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -172,7 +172,7 @@ else if ($exist:path eq '/en/About' or $exist:path eq '/de/Impressum') then (: Ausführliche Weber-Biographie :) else if ($exist:path eq '/en/Biography' or $exist:path eq '/de/Biographie') then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -186,7 +186,7 @@ else if ($exist:path eq '/en/Biography' or $exist:path eq '/de/Biographie') then (: Help :) else if (matches($exist:path, concat('^/', $lang, '/', $help, '/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -200,7 +200,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', $help, '/?$'))) then (: Project Description :) else if (matches($exist:path, concat('^/', $lang, '/', $projectDescription, '/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -214,7 +214,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', $projectDescription, '/?$ (: Kontakt :) else if (matches($exist:path, concat('^/', $lang, '/', wega:getVarURL('A070009',$lang), '/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -226,7 +226,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', wega:getVarURL('A070009', (: Editionsrichtlinien Werkausgabe :) (:else if (matches($exist:path, concat('^/', $lang, '/', wega:getVarURL('A070010',$lang), '/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -238,7 +238,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', wega:getVarURL('A070009', (: Weber-Studien Einzelansicht:) else if ($isWeberPublication and matches($exist:path, concat('^/', $lang, '/', $publications, '/', $weberStudies, '/', 'A11\d{4}/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -346,7 +346,7 @@ else if (matches($exist:path, concat('^/', $lang, '/A002068/', $diaries, '/?$')) (: Personen - Einzelansicht :) else if (matches($exist:path, concat('^/', $lang, '/A00\d{4}/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' let $person := wega:doc($exist:resource)/tei:person return if(exists($person)) then if($person/tei:ref) then ( @@ -366,7 +366,7 @@ else if (matches($exist:path, concat('^/', $lang, '/A00\d{4}/?$'))) then (: Brief - Einzelansicht :) else if (matches($exist:path, concat('^/', $lang, '/', $authorID,'/', $correspondence,'/', 'A04\d{4}/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' let $doc := wega:doc($exist:resource)/tei:TEI return if(exists($doc)) then if($doc/tei:ref) then @@ -385,7 +385,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', $authorID,'/', $correspon (: Schriften - Einzelansicht :) else if (matches($exist:path, concat('^/', $lang, '/', $authorID,'/', $writings, '/', 'A03\d{4}/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' let $doc := wega:doc($exist:resource)/tei:TEI return if(exists($doc)) then if($doc/tei:ref) then @@ -404,7 +404,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', $authorID,'/', $writings, (: Tagebuch - Einzelansicht :) else if (matches($exist:path, concat('^/', $lang, '/', 'A002068', '/', $diaries, '/', 'A06\d{4}/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' return @@ -416,7 +416,7 @@ else if (matches($exist:path, concat('^/', $lang, '/', 'A002068', '/', $diaries, (: News - Einzelansicht :) else if (matches($exist:path, concat('^/', $lang, '/', $authorID,'/', $news, '/', 'A05\d{4}/?$'))) then - let $js := if(request:parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' + let $js := if(request:get-parameter-names() = $ajaxCrawlerParameter) then 'false' else 'true' let $doc := wega:doc($exist:resource)/tei:TEI return if(exists($doc)) then if($doc/tei:ref) then diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index ce5889de3..f3381ae36 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -1,4 +1,4 @@ -xquery version "1.0" encoding "UTF-8"; +xquery version "3.0" encoding "UTF-8"; (:~ : WeGA AJAX XQuery-Module @@ -39,7 +39,7 @@ import module namespace jsonToXML="http://xqilla.sourceforge.net/Functions" at " : @param $lang the current language (de|en) : @return element :) - + declare function ajax:createHtmlListEntry($type,$persName,$letter,$sender,$addressee,$entryYear,$date,$lang) { let $isRound := (year-from-date($date) - $entryYear) mod 25 = 0 let $formatedYear := {wega:formatYear($entryYear cast as xs:int, $lang)} @@ -183,9 +183,10 @@ declare function ajax:getPersonCorrespondents($id as xs:string, $lang as xs:stri else() return for $i in $letterList - group $i as $partition by $i/@key as $key - order by count($partition) descending - return {$key, count($partition)} +(: group $i as $partition by $i/@key as $key:) + group by $key := $i/@key + order by count($i) descending + return }; (:~ @@ -210,20 +211,23 @@ declare function ajax:printCorrespondents($id as xs:string, $lang as xs:string, let $key := $x/string(@key) let $doc := wega:doc($key) let $persNameSelected := wega:getRegName($key) (:wega:cleanString($person/tei:persName[@type='reg']):) - let $persNameSelectedCount := $x cast as xs:int + let $persNameSelectedCount := $x/@count cast as xs:int order by $persNameSelectedCount descending, $persNameSelected ascending - return element a { - attribute href {wega:createLinkToDoc($doc, $lang)}, - attribute title { - if ($persNameSelectedCount gt 1) then concat($persNameSelected, ' (', $persNameSelectedCount, ' ', wega:getLanguageString('letters',$lang), ')') - else concat($persNameSelected, ' (', $persNameSelectedCount, ' ', wega:getLanguageString('letter',$lang), ')')}, - element img { - attribute src {wega:getPortraitPath($doc/tei:person, (40, 55), $lang)}, - attribute alt {$persNameSelected}, - attribute width {'40'}, - attribute height {'55'} - } - } + return + if(exists($doc)) then + element a { + attribute href {wega:createLinkToDoc($doc, $lang)}, + attribute title { + if ($persNameSelectedCount gt 1) then concat($persNameSelected, ' (', $persNameSelectedCount, ' ', wega:getLanguageString('letters',$lang), ')') + else concat($persNameSelected, ' (', $persNameSelectedCount, ' ', wega:getLanguageString('letter',$lang), ')')}, + element img { + attribute src {wega:getPortraitPath($doc/tei:person, (40, 55), $lang)}, + attribute alt {$persNameSelected}, + attribute width {'40'}, + attribute height {'55'} + } + } + else () return element div{$linkElements} }; diff --git a/webapp/xql/modules/facets.xqm b/webapp/xql/modules/facets.xqm index 07d7132fe..2284e6f5e 100644 --- a/webapp/xql/modules/facets.xqm +++ b/webapp/xql/modules/facets.xqm @@ -340,7 +340,7 @@ declare function facets:createFilter($checked as xs:string*) as element(facets:f :) declare function facets:sortColl($coll as item()*) as item()* { - if(wega:isPerson($coll[1]/string(@xml:id))) then for $i in $coll order by $i//tei:persName[@type = 'reg'] ascending return $i + if(wega:isPerson($coll[1]/string(@xml:id))) then for $i in $coll order by $i/tei:persName[@type = 'reg'] ascending return $i else if(wega:isLetter($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:dateSender/tei:date[1], false()) ascending, $i//tei:dateSender/tei:date[1]/@n ascending return $i else if(wega:isWriting($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:imprint/tei:date[1], false()) ascending return $i else if(wega:isDiary($coll[1]/string(@xml:id))) then for $i in $coll order by $i/xs:date(@n) ascending return $i @@ -514,7 +514,7 @@ declare function facets:getFirstOrLastDocumentInMonth($entriesSessionName as xs: :) declare function facets:getFirstOrLastDocumentInSeries($collIDs as xs:string*, $seriesNo as xs:int, $first as xs:boolean) as xs:string { - let $docIDs := wega:getNormDates('works')//entry[. = $seriesNo][./@docID=$collIDs] + let $docIDs := wega:getNormDates('works')//entry[. = $seriesNo][@docID=$collIDs] return if($first) then $docIDs[1]/string(@docID) else $docIDs[last()]/string(@docID) @@ -600,13 +600,13 @@ declare function facets:createChronoList($docType as xs:string, $lang as xs:stri let $coll := session:get-attribute($sessionCollName) let $normDates := wega:getNormDates($docType)//entry let $undatedKeys := - if($docType eq 'diaries') then $normDates[not(./node())][@docID = $coll//tei:ab/@xml:id]/string(@docID) (: Bei keinem Treffer wird der leere String zurückgegeben :) - else if($docType eq 'biblio') then $normDates[not(./node())][@docID = $coll//tei:biblStruct/@xml:id]/string(@docID) - else $normDates[not(./node())][@docID = $coll//tei:TEI/@xml:id]/string(@docID) + if($docType eq 'diaries') then $normDates[not(./node())][@docID = $coll/@xml:id]/string(@docID) (: Bei keinem Treffer wird der leere String zurückgegeben :) + else if($docType eq 'biblio') then $normDates[not(./node())][@docID = $coll/@xml:id]/string(@docID) + else $normDates[not(node())][@docID = $coll/@xml:id]/string(@docID) let $dated := - if($docType eq 'diaries') then $normDates[@docID = $coll//tei:ab/@xml:id][./node()] - else if($docType eq 'biblio') then $normDates[@docID = $coll//tei:biblStruct/@xml:id][./node()] - else $normDates[@docID = $coll//tei:TEI/@xml:id][./node()] + if($docType eq 'diaries') then $normDates[@docID = $coll/@xml:id][./node()] + else if($docType eq 'biblio') then $normDates[@docID = $coll/@xml:id][./node()] + else $normDates[@docID = $coll/@xml:id][./node()] let $distinctYears := for $i in distinct-values($dated/@year) return $i cast as xs:int let $saveDated := session:set-attribute($datedSessionName, $dated) let $saveUndated := session:set-attribute($undatedSessionName, $undatedKeys) @@ -712,8 +712,8 @@ declare function facets:getSeries($docType as xs:string, $lang as xs:string) as let $sessionCollName := facets:getCollName($docType, false()) let $coll := session:get-attribute($sessionCollName) let $distinctSeries := facets:getDistinctSeries($coll) - let $collIDs := $coll//mei:mei/string(@xml:id) - let $activeIDs := wega:getNormDates('works')//entry[./@docID=$collIDs]/string(@docID) + let $collIDs := $coll/string(@xml:id) + let $activeIDs := wega:getNormDates('works')//entry[@docID=$collIDs]/string(@docID) let $docType := 'works' let $category := 'series' return @@ -759,7 +759,7 @@ declare function facets:createAlphabetList($docType as xs:string, $lang as xs:st let $sessionCollName := facets:getCollName($docType, false()) let $coll := session:get-attribute($sessionCollName) let $normDates := wega:getNormDates($docType)//entry - let $persons := $normDates[@docID = $coll//tei:person/@xml:id] + let $persons := $normDates[@docID = $coll/@xml:id] let $countPersons := count($persons) let $savePersons := session:set-attribute($entriesSessionName, $persons) let $saveFromTo := session:set-attribute($fromToSessionName, (1,$countPersons)) @@ -782,20 +782,21 @@ declare function facets:createAlphabetList($docType as xs:string, $lang as xs:st :) declare function facets:createAlphabetListUl($entriesSessionName as xs:string, $fromToSessionName as xs:string, $lang as xs:string, $recusionDepth as xs:int) as element(ul) { let $maxRows := xs:int(wega:getOption('listViewMaxRows')) - let $persons := session:get-attribute($entriesSessionName)//entry + let $persons := session:get-attribute($entriesSessionName) let $from := session:get-attribute($fromToSessionName)[1] let $to := session:get-attribute($fromToSessionName)[2] let $countPersons := $to - $from +1 let $myDivisor := if (round($countPersons div $maxRows) eq 0) then 1 else xs:int(round($countPersons div $maxRows)) (: 9/7 :) let $numberOfRows := if(ceiling($countPersons div $myDivisor) gt $maxRows) then $maxRows else xs:int(ceiling($countPersons div $myDivisor)) let $threshold := 30 +(: let $log := util:log-system-out(session:get-attribute($entriesSessionName)):) return ( element ul { for $i at $count in (1 to $numberOfRows) let $fromPosition := ($i - 1) * ($myDivisor) + $from let $toPosition := if ((($i * $myDivisor + $from -1) gt $to) or ($i eq $numberOfRows)) then $to else $i * $myDivisor + $from -1 - let $startEntry := functx:substring-before-match(normalize-space($persons[$fromPosition]), '[\s,]') - let $endEntry := functx:substring-before-match(normalize-space($persons[$toPosition]), '[\s,]') + let $startEntry := functx:substring-before-match(normalize-space($persons[$fromPosition]), '[\s,]') (:'Start':) + let $endEntry := functx:substring-before-match(normalize-space($persons[$toPosition]), '[\s,]') (:'Ende':) let $countPersonsInInterval := $toPosition - $fromPosition +1 let $newFromToSessionName := concat($fromToSessionName, $count) let $saveFromTo := session:set-attribute($newFromToSessionName, ($fromPosition,$toPosition)) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 7b77f5b40..86021f7af 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -2570,7 +2570,7 @@ declare function wega:createLetterNormDates() { { attribute xml:id {$xmlID}, for $i in $coll - let $docID := $i//tei:TEI/string(@xml:id) + let $docID := $i/string(@xml:id) let $normDate := wega:getOneNormalizedDate($i//tei:dateSender/tei:date, false()) let $n := $i//tei:dateSender/tei:date/string(@n) (: let $senderID := $i//tei:sender/tei:persName[1]/string(@key):) @@ -2610,8 +2610,8 @@ declare function wega:createWritingNormDates() { { attribute xml:id {$xmlID}, for $i in $coll - let $docID := $i//tei:TEI/string(@xml:id) - let $normDate := wega:getOneNormalizedDate($i//tei:sourceDesc/tei:*/tei:monogr/tei:imprint/tei:date, false()) + let $docID := $i/string(@xml:id) + let $normDate := wega:getOneNormalizedDate($i//tei:imprint/tei:date, false()) let $n := string-join($i//tei:monogr/tei:title[@level = 'j'], '. ') order by $normDate, $n return @@ -2645,7 +2645,7 @@ declare function wega:createWorkNormDates() { { attribute xml:id {$xmlID}, for $i in $coll - let $docID := $i//mei:mei/string(@xml:id) + let $docID := $i/string(@xml:id) let $normDate := $i//mei:seriesStmt/mei:title[@level='s']/xs:int(@n) let $n := $i//mei:altId[@type = 'WeV'] let $sortCategory02 := $i//mei:altId[@type = 'WeV']/string(@subtype) @@ -2679,8 +2679,8 @@ declare function wega:createDiaryNormDates() { { attribute xml:id {$xmlID}, for $i in $coll - let $docID := $i//tei:ab/string(@xml:id) - let $normDate := $i//tei:ab/string(@n) + let $docID := $i/string(@xml:id) + let $normDate := $i/string(@n) order by $normDate return element entry { @@ -2712,7 +2712,7 @@ declare function wega:createNewsNormDates() { { attribute xml:id {$xmlID}, for $i in $coll - let $docID := $i//tei:TEI/string(@xml:id) + let $docID := $i/string(@xml:id) let $normDate := datetime:date-from-dateTime($i//tei:publicationStmt/tei:date/xs:dateTime(@when)) (:let $log := util:log-system-out($normDate):) order by $normDate descending From 762b64e516d84f00e3a6db9a151581cea7a5d76e Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 5 Aug 2013 18:03:50 +0200 Subject: [PATCH 02/48] fixed the creation of writings normdates (part 2) --- webapp/xql/modules/facets.xqm | 2 +- webapp/xql/modules/wega.xqm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/xql/modules/facets.xqm b/webapp/xql/modules/facets.xqm index 2284e6f5e..1b9aafcde 100644 --- a/webapp/xql/modules/facets.xqm +++ b/webapp/xql/modules/facets.xqm @@ -342,7 +342,7 @@ declare function facets:createFilter($checked as xs:string*) as element(facets:f declare function facets:sortColl($coll as item()*) as item()* { if(wega:isPerson($coll[1]/string(@xml:id))) then for $i in $coll order by $i/tei:persName[@type = 'reg'] ascending return $i else if(wega:isLetter($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:dateSender/tei:date[1], false()) ascending, $i//tei:dateSender/tei:date[1]/@n ascending return $i - else if(wega:isWriting($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:imprint/tei:date[1], false()) ascending return $i + else if(wega:isWriting($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:sourceDesc/tei:*/tei:monogr/tei:imprint/tei:date[1], false()) ascending return $i else if(wega:isDiary($coll[1]/string(@xml:id))) then for $i in $coll order by $i/xs:date(@n) ascending return $i else if(wega:isWork($coll[1]/string(@xml:id))) then for $i in $coll order by $i//mei:seriesStmt/mei:title[@level='s']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string(@subtype) ascending, $i//mei:altId[@type = 'WeV']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string() ascending return $i else if(wega:isNews($coll[1]/string(@xml:id))) then for $i in $coll order by $i//tei:publicationStmt/tei:date/xs:dateTime(@when) descending return $i diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 86021f7af..caf1f5230 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -2611,7 +2611,7 @@ declare function wega:createWritingNormDates() { attribute xml:id {$xmlID}, for $i in $coll let $docID := $i/string(@xml:id) - let $normDate := wega:getOneNormalizedDate($i//tei:imprint/tei:date, false()) + let $normDate := wega:getOneNormalizedDate($i//tei:sourceDesc/tei:*/tei:monogr/tei:imprint/tei:date[1], false()) let $n := string-join($i//tei:monogr/tei:title[@level = 'j'], '. ') order by $normDate, $n return From 73d4a6e58241f0feae676aed1dbc3db354115383 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 5 Aug 2013 22:00:37 +0200 Subject: [PATCH 03/48] outsourced parsing of JSON to the expath package xqjson --- webapp/xql/modules/ajax.xqm | 39 ++--- webapp/xql/modules/jsonToXML.xqm | 242 ------------------------------- webapp/xql/modules/wega.xqm | 2 +- 3 files changed, 21 insertions(+), 262 deletions(-) delete mode 100644 webapp/xql/modules/jsonToXML.xqm diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index f3381ae36..9bd0ddce6 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -19,10 +19,10 @@ declare namespace cache = "http://exist-db.org/xquery/cache"; declare namespace util="http://exist-db.org/xquery/util"; declare namespace request="http://exist-db.org/xquery/request"; declare namespace httpclient = "http://exist-db.org/xquery/httpclient"; +import module namespace xqjson="http://xqilla.sourceforge.net/lib/xqjson"; import module namespace functx="http://www.functx.com" at "xmldb:exist:///db/webapp/xql/modules/functx.xqm"; import module namespace wega="http://xquery.weber-gesamtausgabe.de/webapp/xql/modules/wega" at "xmldb:exist:///db/webapp/xql/modules/wega.xqm"; import module namespace facets="http://xquery.weber-gesamtausgabe.de/webapp/xql/modules/facets" at "xmldb:exist:///db/webapp/xql/modules/facets.xqm"; -import module namespace jsonToXML="http://xqilla.sourceforge.net/Functions" at "xmldb:exist:///db/webapp/xql/modules/jsonToXML.xqm"; (:~ : Creates HTML list entry @@ -415,29 +415,30 @@ declare function ajax:getDNB($pnd as xs:string, $lang as xs:string) as element(d : @return element :) -declare function ajax:getPNDBeacons($pnd as xs:string, $name as xs:string, $lang as xs:string) as element() { - let $findbuchResponse := wega:grabExternalResource('beacon', $pnd, (), true()) - let $jxml := if(exists($findbuchResponse)) then jsonToXML:parse-json(util:binary-to-string($findbuchResponse)) else () +declare function ajax:getPNDBeacons($pnd as xs:string, $name as xs:string, $lang as xs:string) as element(div) { + let $findbuchResponse := util:binary-to-string(wega:grabExternalResource('beacon', $pnd, (), true())) + let $jxml := + if(exists($findbuchResponse)) then xqjson:parse-json($findbuchResponse) + else () let $list :=
    { - for $i in 1 to count($jxml//json/item[2]//item) - let $link := data($jxml//json/item[4]/item[$i]) - let $title := data($jxml//json/item[3]/item[$i]) - let $text := data($jxml//json/item[2]/item[$i]) + for $i in 1 to count($jxml/item[2]/item) + let $link := normalize-space($jxml/item[4]/item[$i]) + let $title := normalize-space($jxml/item[3]/item[$i]) + let $text := normalize-space($jxml/item[2]/item[$i]) return - if(data($jxml//json/item[4]/item[$i])!="" and not(matches($link,"weber-gesamtausgabe.de"))) - then
  • {$text}
  • - else() + if(starts-with($link,"weber-gesamtausgabe.de")) then () + else
  • {$text}
  • }
- return if (exists($list/li)) then -
-

{wega:getLanguageString('beaconLinks', ($name,$pnd), $lang)}

- {$list - (:$findbuchQuery//p:)} - -
- else {wega:getLanguageString('noBeaconsFound', $lang)} + return +
{ + if (exists($list/li)) then ( +

{wega:getLanguageString('beaconLinks', ($name,$pnd), $lang)}

, + $list + ) + else {wega:getLanguageString('noBeaconsFound', $lang)} + }
}; (:~ diff --git a/webapp/xql/modules/jsonToXML.xqm b/webapp/xql/modules/jsonToXML.xqm deleted file mode 100644 index ba30a9927..000000000 --- a/webapp/xql/modules/jsonToXML.xqm +++ /dev/null @@ -1,242 +0,0 @@ -xquery version "1.0" encoding "UTF-8"; -module namespace jsonToXML="http://xqilla.sourceforge.net/Functions"; -(:----------------------------------------------------------------------------------------------------:) -(: JSON parsing :) - -declare function jsonToXML:parse-json($json as xs:string) as element()? { - let $res := jsonToXML:parseValue(jsonToXML:tokenize($json)) - return - if(exists(remove($res,1))) then jsonToXML:parseError($res[2]) - else element json { - $res[1]/@*, - $res[1]/node() - } -}; - -declare function jsonToXML:parseValue($tokens as element(token)*) -{ - let $token := $tokens[1] - let $tokens := remove($tokens,1) - return - if($token/@t = "lbrace") then ( - let $res := jsonToXML:parseObject($tokens) - let $tokens := remove($res,1) - return ( - element res { - attribute type { "object" }, - $res[1]/node() - }, - $tokens - ) - ) else if ($token/@t = "lsquare") then ( - let $res := jsonToXML:parseArray($tokens) - let $tokens := remove($res,1) - return ( - element res { - attribute type { "array" }, - $res[1]/node() - }, - $tokens - ) - ) else if ($token/@t = "number") then ( - element res { - attribute type { "number" }, - text { $token } - }, - $tokens - ) else if ($token/@t = "string") then ( - element res { - attribute type { "string" }, - text { jsonToXML:unescape-json-string($token) } - }, - $tokens - ) else if ($token/@t = "true" or $token/@t = "false") then ( - element res { - attribute type { "boolean" }, - text { $token } - }, - $tokens - ) else if ($token/@t = "null") then ( - element res { - attribute type { "null" } - }, - $tokens - ) else jsonToXML:parseError($token) -}; - -declare function jsonToXML:parseObject($tokens as element(token)*) -{ - let $token1 := $tokens[1] - let $tokens := remove($tokens,1) - return - if(not($token1/@t = "string")) then jsonToXML:parseError($token1) else - let $token2 := $tokens[1] - let $tokens := remove($tokens,1) - return - if(not($token2/@t = "colon")) then jsonToXML:parseError($token2) else - let $res := jsonToXML:parseValue($tokens) - let $tokens := remove($res,1) - let $pair := element pair { - attribute name { $token1 }, - $res[1]/@*, - $res[1]/node() - } - let $token := $tokens[1] - let $tokens := remove($tokens,1) - return - if($token/@t = "comma") then ( - let $res := jsonToXML:parseObject($tokens) - let $tokens := remove($res,1) - return ( - element res { - $pair, - $res[1]/node() - }, - $tokens - ) - ) else if($token/@t = "rbrace") then ( - element res { - $pair - }, - $tokens - ) else jsonToXML:parseError($token) -}; - -declare function jsonToXML:parseArray($tokens as element(token)*) -{ - let $res := jsonToXML:parseValue($tokens) - let $tokens := remove($res,1) - let $item := element item { - $res[1]/@*, - $res[1]/node() - } - let $token := $tokens[1] - let $tokens := remove($tokens,1) - return - if($token/@t = "comma") then ( - let $res := jsonToXML:parseArray($tokens) - let $tokens := remove($res,1) - return ( - element res { - $item, - $res[1]/node() - }, - $tokens - ) - ) else if($token/@t = "rsquare") then ( - element res { - $item - }, - $tokens - ) else jsonToXML:parseError($token) -}; - -declare function jsonToXML:parseError($token as element(token)) as empty-sequence() { - error(xs:QName("jsonToXML:PARSEJSON01"), - concat("Unexpected token: ", string($token/@t), " (""", string($token), """)")) -}; - -declare function jsonToXML:tokenize($json as xs:string) as element(token)* -{ - let $tokens := ("\{", "\}", "\[", "\]", ":", ",", "true", "false", "null", "\s+", - '"([^"\\]|\\"|\\\\|\\/|\\b|\\f|\\n|\\r|\\t|\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9])*"', - "-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?") - let $regex := string-join(for $t in $tokens return concat("(",$t,")"),"|") - for $match in jsonToXML:analyze-string($json, $regex, 14) - return - if($match/self::non-match) then jsonToXML:token("error", string($match)) - else if($match//group/@nr = 1) then jsonToXML:token("lbrace", string($match)) - else if($match//group/@nr = 2) then jsonToXML:token("rbrace", string($match)) - else if($match//group/@nr = 3) then jsonToXML:token("lsquare", string($match)) - else if($match//group/@nr = 4) then jsonToXML:token("rsquare", string($match)) - else if($match//group/@nr = 5) then jsonToXML:token("colon", string($match)) - else if($match//group/@nr = 6) then jsonToXML:token("comma", string($match)) - else if($match//group/@nr = 7) then jsonToXML:token("true", string($match)) - else if($match//group/@nr = 8) then jsonToXML:token("false", string($match)) - else if($match//group/@nr = 9) then jsonToXML:token("null", string($match)) - else if($match//group/@nr = 10) then () (: ignore whitespace :) - else if($match//group/@nr = 11) then (: Strings in JSON :) - let $v := string($match) - let $len := string-length($v) - return jsonToXML:token("string", substring($v, 2, $len - 2)) - else if($match//group/@nr = 13) then jsonToXML:token("number", string($match)) (: Numbers in JSON :) - else ()(:jsonToXML:token("error", string($match)):) -}; - -declare function jsonToXML:token($t, $value) -{ - { string($value) } -}; - -(:----------------------------------------------------------------------------------------------------:) -(: JSON unescaping :) - -declare function jsonToXML:unescape-json-string($val as xs:string) as xs:string -{ - let $tmp := normalize-space(util:unescape-uri($val,"UTF-8")) - return replace($val,"\\f"," ") - (: - string-join( - let $regex := '([^\\]+)|(\\")|(\\\\)|(\\/)|(\\b)|(\\f)|(\\n)|(\\r)|(\\t)|(\\u[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9])' - for $match in jsonToXML:analyze-string($val, $regex, 10) - return - if($match//group/@nr = 1) then """" - else if($match//group/@nr = 2) then "\" - else if($match//group/@nr = 3) then "/" - (: else if($match/*:group/@nr = 4) then "" :) - (: else if($match/*:group/@nr = 5) then " " :) - else if($match//group/@nr = 6) then " " - else if($match//group/@nr = 7) then " " - else if($match//group/@nr = 8) then " " - else if($match//group/@nr = 9) then codepoints-to-string(jsonToXML:decode-hex-string(substring($match, 3))) - else string($match) - ,"") - :) -}; - -declare function jsonToXML:decode-hex-string($val as xs:string) - as xs:integer -{ - jsonToXML:decodeHexStringHelper(string-to-codepoints($val), 0) -}; - -declare function jsonToXML:decodeHexChar($val as xs:integer) - as xs:integer -{ - let $tmp := $val - 48 (: '0' :) - let $tmp := if($tmp <= 9) then $tmp else $tmp - (65-48) (: 'A'-'0' :) - let $tmp := if($tmp <= 15) then $tmp else $tmp - (97-65) (: 'a'-'A' :) - return $tmp -}; - -declare function jsonToXML:decodeHexStringHelper($chars as xs:integer*, $acc as xs:integer) - as xs:integer -{ - if(empty($chars)) then $acc - else jsonToXML:decodeHexStringHelper(remove($chars,1), ($acc * 16) + jsonToXML:decodeHexChar($chars[1])) -}; - -declare function jsonToXML:analyze-string($string as xs:string, $regex as xs:string, $n as xs:integer) { -transform:transform - (, - - - - - - - - - - - - - - - - - - , - - ) -}; \ No newline at end of file diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index caf1f5230..721bd3782 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1751,7 +1751,7 @@ declare function wega:printSourceDesc($doc as document-node(), $lang as xs:strin : @return node :) -declare function wega:grabExternalResource($resource as xs:string, $pnd as xs:string, $lang as xs:string?, $useCache as xs:boolean) as node()? { +declare function wega:grabExternalResource($resource as xs:string, $pnd as xs:string, $lang as xs:string?, $useCache as xs:boolean) as element(httpclient:response)? { let $serverURL := if($resource eq 'wikipedia') then concat(wega:getOption($resource), $lang, '/') else wega:getOption($resource) From 12cdd4c93b635495de041cc3b70c5c28e60c2382 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 5 Aug 2013 23:44:19 +0200 Subject: [PATCH 04/48] added index for @class --- exist-indices/db/webapp/tmp/collection.xconf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exist-indices/db/webapp/tmp/collection.xconf b/exist-indices/db/webapp/tmp/collection.xconf index c76319ce6..ad5955561 100644 --- a/exist-indices/db/webapp/tmp/collection.xconf +++ b/exist-indices/db/webapp/tmp/collection.xconf @@ -11,5 +11,6 @@ + - + \ No newline at end of file From c83e3da600ed6924de6fc659123dc3cbdaab5912 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 5 Aug 2013 23:44:34 +0200 Subject: [PATCH 05/48] improved permissions script --- scripts/setPermissions.xql | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/scripts/setPermissions.xql b/scripts/setPermissions.xql index d36ef8d2b..71a9a3bc1 100644 --- a/scripts/setPermissions.xql +++ b/scripts/setPermissions.xql @@ -4,17 +4,22 @@ xquery version "1.0" encoding "UTF-8"; : Set permissions for a production system : : @author Peter Stadler -: @version 1.0 +: @version 1.1 :) declare namespace exist="http://exist.sourceforge.net/NS/exist"; declare namespace util="http://exist-db.org/xquery/util"; declare namespace xmldb="http://exist-db.org/xquery/xmldb"; +declare variable $local:data-collections := ('biblio', 'diaries', 'iconography', 'letters', 'news', 'odd', 'persons', 'var', 'works', 'writings'); +declare variable $local:webapp-collection := 'webapp'; + declare function local:set-collection-permissions($collection-uri as xs:string, $user-id as xs:string, $group-id as xs:string, $permissions as xs:integer, $recursive as xs:boolean) as empty() { let $setFilePermissions := for $file in xmldb:get-child-resources($collection-uri) - return xmldb:set-resource-permissions($collection-uri, $file, $user-id, $group-id, $permissions) + return + if(ends-with($file, 'xql')) then xmldb:set-resource-permissions($collection-uri, $file, $user-id, $group-id, util:base-to-integer(755, 8)) (: make XQueries executable :) + else xmldb:set-resource-permissions($collection-uri, $file, $user-id, $group-id, $permissions) let $setCollectionPermission := xmldb:set-collection-permissions($collection-uri, $user-id, $group-id, $permissions) return if($recursive) then @@ -23,8 +28,16 @@ declare function local:set-collection-permissions($collection-uri as xs:string, else () }; -(: First, set all collections and resources recursively to admin:dba with 744 :) -local:set-collection-permissions('/db', 'admin', 'dba', util:base-to-integer(744, 8), true()), +(: set all data collections and resources recursively to admin:dba with 744 :) +for $coll in $local:data-collections return + local:set-collection-permissions(concat('/db/', $coll), 'admin', 'dba', util:base-to-integer(744, 8), true()), + +(: set webapp collection to admin:dba with 755 :) +local:set-collection-permissions(concat('/db/', $local:webapp-collection), 'admin', 'dba', util:base-to-integer(755, 8), true()), + +(: create temporary collection if not available:) +if(xmldb:collection-available(string-join(('/db', $local:webapp-collection, 'tmp'), '/'))) then () +else xmldb:create-collection(string-join(('/db', $local:webapp-collection), '/'), 'tmp'), -(: Second, set special permissions for temporary collections and resources :) +(: set special permissions for temporary collections and resources :) local:set-collection-permissions('/db/webapp/tmp', 'guest', 'guest', util:base-to-integer(744, 8), true()) From e4bee4e1b13e2fefedd48f088fcb4385f7eec530 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 6 Aug 2013 16:43:07 +0200 Subject: [PATCH 06/48] made use of new securitymanager functions --- scripts/setPermissions.xql | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/scripts/setPermissions.xql b/scripts/setPermissions.xql index 71a9a3bc1..21d8e79d1 100644 --- a/scripts/setPermissions.xql +++ b/scripts/setPermissions.xql @@ -10,17 +10,18 @@ xquery version "1.0" encoding "UTF-8"; declare namespace exist="http://exist.sourceforge.net/NS/exist"; declare namespace util="http://exist-db.org/xquery/util"; declare namespace xmldb="http://exist-db.org/xquery/xmldb"; +declare namespace sm="http://exist-db.org/xquery/securitymanager"; -declare variable $local:data-collections := ('biblio', 'diaries', 'iconography', 'letters', 'news', 'odd', 'persons', 'var', 'works', 'writings'); +declare variable $local:data-collections := ('biblio', 'diaries', 'iconography', 'letters', 'news', 'persons', 'var', 'works', 'writings'); declare variable $local:webapp-collection := 'webapp'; -declare function local:set-collection-permissions($collection-uri as xs:string, $user-id as xs:string, $group-id as xs:string, $permissions as xs:integer, $recursive as xs:boolean) as empty() { +declare function local:set-collection-permissions($collection-uri as xs:string, $user-id as xs:string, $group-id as xs:string, $permissions as xs:string, $recursive as xs:boolean) as empty() { let $setFilePermissions := for $file in xmldb:get-child-resources($collection-uri) return - if(ends-with($file, 'xql')) then xmldb:set-resource-permissions($collection-uri, $file, $user-id, $group-id, util:base-to-integer(755, 8)) (: make XQueries executable :) - else xmldb:set-resource-permissions($collection-uri, $file, $user-id, $group-id, $permissions) - let $setCollectionPermission := xmldb:set-collection-permissions($collection-uri, $user-id, $group-id, $permissions) + if(ends-with($file, 'xql')) then local:set-combined-permissions(concat($collection-uri, '/', $file), $user-id, $group-id, '755') (: make XQueries executable :) + else local:set-combined-permissions(concat($collection-uri, '/', $file), $user-id, $group-id, $permissions) + let $setCollectionPermission := local:set-combined-permissions($collection-uri, $user-id, $group-id, $permissions) return if($recursive) then for $coll in xmldb:get-child-collections($collection-uri) @@ -28,16 +29,25 @@ declare function local:set-collection-permissions($collection-uri as xs:string, else () }; +declare function local:set-combined-permissions($resource as xs:string, $user-id as xs:string, $group-id as xs:string, $permissions as xs:string) as empty() { + if($resource castable as xs:anyURI) then ( + sm:chown(xs:anyURI($resource), $user-id), + sm:chgrp(xs:anyURI($resource), $group-id), + sm:chmod(xs:anyURI($resource), sm:octal-to-mode($permissions)) + ) + else () +}; + (: set all data collections and resources recursively to admin:dba with 744 :) for $coll in $local:data-collections return - local:set-collection-permissions(concat('/db/', $coll), 'admin', 'dba', util:base-to-integer(744, 8), true()), + local:set-collection-permissions(concat('/db/', $coll), 'admin', 'dba', '744', true()), (: set webapp collection to admin:dba with 755 :) -local:set-collection-permissions(concat('/db/', $local:webapp-collection), 'admin', 'dba', util:base-to-integer(755, 8), true()), +local:set-collection-permissions(concat('/db/', $local:webapp-collection), 'admin', 'dba', '755', true()), (: create temporary collection if not available:) if(xmldb:collection-available(string-join(('/db', $local:webapp-collection, 'tmp'), '/'))) then () else xmldb:create-collection(string-join(('/db', $local:webapp-collection), '/'), 'tmp'), (: set special permissions for temporary collections and resources :) -local:set-collection-permissions('/db/webapp/tmp', 'guest', 'guest', util:base-to-integer(744, 8), true()) +local:set-collection-permissions('/db/webapp/tmp', 'guest', 'guest', '744', true()) From f26345a480ad8ea8267e8e3397679f7205c99af0 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 6 Aug 2013 17:41:41 +0200 Subject: [PATCH 07/48] made collections 'executable' --- scripts/setPermissions.xql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/setPermissions.xql b/scripts/setPermissions.xql index 21d8e79d1..5d11aa74e 100644 --- a/scripts/setPermissions.xql +++ b/scripts/setPermissions.xql @@ -16,12 +16,12 @@ declare variable $local:data-collections := ('biblio', 'diaries', 'iconography', declare variable $local:webapp-collection := 'webapp'; declare function local:set-collection-permissions($collection-uri as xs:string, $user-id as xs:string, $group-id as xs:string, $permissions as xs:string, $recursive as xs:boolean) as empty() { + let $setCollectionPermission := local:set-combined-permissions($collection-uri, $user-id, $group-id, $permissions) let $setFilePermissions := for $file in xmldb:get-child-resources($collection-uri) return - if(ends-with($file, 'xql')) then local:set-combined-permissions(concat($collection-uri, '/', $file), $user-id, $group-id, '755') (: make XQueries executable :) - else local:set-combined-permissions(concat($collection-uri, '/', $file), $user-id, $group-id, $permissions) - let $setCollectionPermission := local:set-combined-permissions($collection-uri, $user-id, $group-id, $permissions) + if(ends-with($file, 'xql')) then local:set-combined-permissions(concat($collection-uri, '/', $file), $user-id, $group-id, $permissions) (: make XQueries executable :) + else local:set-combined-permissions(concat($collection-uri, '/', $file), $user-id, $group-id, '744') return if($recursive) then for $coll in xmldb:get-child-collections($collection-uri) @@ -40,7 +40,7 @@ declare function local:set-combined-permissions($resource as xs:string, $user-id (: set all data collections and resources recursively to admin:dba with 744 :) for $coll in $local:data-collections return - local:set-collection-permissions(concat('/db/', $coll), 'admin', 'dba', '744', true()), + local:set-collection-permissions(concat('/db/', $coll), 'admin', 'dba', '755', true()), (: set webapp collection to admin:dba with 755 :) local:set-collection-permissions(concat('/db/', $local:webapp-collection), 'admin', 'dba', '755', true()), From d8203ae8a144686ad7fcf429e9c9cc42d9db7199 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 7 Aug 2013 12:43:45 +0200 Subject: [PATCH 08/48] =?UTF-8?q?permissions=20again=20=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/setPermissions.xql | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/setPermissions.xql b/scripts/setPermissions.xql index 5d11aa74e..c95a2080e 100644 --- a/scripts/setPermissions.xql +++ b/scripts/setPermissions.xql @@ -12,7 +12,7 @@ declare namespace util="http://exist-db.org/xquery/util"; declare namespace xmldb="http://exist-db.org/xquery/xmldb"; declare namespace sm="http://exist-db.org/xquery/securitymanager"; -declare variable $local:data-collections := ('biblio', 'diaries', 'iconography', 'letters', 'news', 'persons', 'var', 'works', 'writings'); +declare variable $local:data-collections := ('biblio', 'diaries', 'iconography', 'letters', 'news', 'persons', 'var', 'webapp', 'works', 'writings'); declare variable $local:webapp-collection := 'webapp'; declare function local:set-collection-permissions($collection-uri as xs:string, $user-id as xs:string, $group-id as xs:string, $permissions as xs:string, $recursive as xs:boolean) as empty() { @@ -38,13 +38,10 @@ declare function local:set-combined-permissions($resource as xs:string, $user-id else () }; -(: set all data collections and resources recursively to admin:dba with 744 :) +(: set all data collections and resources recursively to admin:dba with 755 :) for $coll in $local:data-collections return local:set-collection-permissions(concat('/db/', $coll), 'admin', 'dba', '755', true()), -(: set webapp collection to admin:dba with 755 :) -local:set-collection-permissions(concat('/db/', $local:webapp-collection), 'admin', 'dba', '755', true()), - (: create temporary collection if not available:) if(xmldb:collection-available(string-join(('/db', $local:webapp-collection, 'tmp'), '/'))) then () else xmldb:create-collection(string-join(('/db', $local:webapp-collection), '/'), 'tmp'), From 2fbc938afb74bc7a67392a5e11bd53961c1a5a5f Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 7 Aug 2013 12:45:05 +0200 Subject: [PATCH 09/48] fixed context links for diaries --- webapp/xql/modules/ajax.xqm | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index 9bd0ddce6..30466148a 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -744,28 +744,29 @@ declare function ajax:diary_printTranscription($docID as xs:string, $lang as xs: : @return element :) -declare function ajax:getDiaryContext($contextContainer as xs:string, $docID as xs:string, $lang as xs:string) { +declare function ajax:getDiaryContext($contextContainer as xs:string, $docID as xs:string, $lang as xs:string) as element(div) { let $authorID := 'A002068' - let $coll := facets:getOrCreateColl('diaries', $authorID) - let $currPos := functx:index-of-node($coll, $coll//id($docID)) + let $normDates := wega:getNormDates('diaries') + let $preceding := $normDates//entry[@docID = $docID]/preceding-sibling::entry[position() = last()] + let $following := $normDates//entry[@docID = $docID]/following-sibling::entry[1] return

{wega:getLanguageString('context', $lang)}

    { - if($currPos gt 1) - then element li { + if($preceding) then + element li { wega:getLanguageString('prevDiaryDay', $lang),
    , - wega:createDocLink($coll[$currPos - 1]/root(), wega:getNiceDate($coll[$currPos - 1]/xs:date(@n), $lang), $lang, ()) + wega:createDocLink(wega:doc($preceding/@docID), wega:getNiceDate($preceding/text() cast as xs:date, $lang), $lang, ()) } - else (), - if($currPos lt count($coll)) - then element li { + else (), + if($following) then + element li { wega:getLanguageString('nextDiaryDay', $lang),
    , - wega:createDocLink($coll[$currPos + 1]/root(), wega:getNiceDate($coll[$currPos + 1]/xs:date(@n), $lang), $lang, ()) + wega:createDocLink(wega:doc($following/@docID), wega:getNiceDate($following/text() cast as xs:date, $lang), $lang, ()) } - else () + else () }
From e4fb711a910545ede46e82ef0e0a299834e6c8cd Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 7 Aug 2013 14:06:43 +0200 Subject: [PATCH 10/48] added missing namespace prefixes --- webapp/xql/diary_singleView.xql | 6 +- webapp/xql/doc_singleView.xql | 6 +- webapp/xql/error.xql | 4 +- webapp/xql/index.xql | 21 +-- webapp/xql/letter_singleView.xql | 6 +- webapp/xql/modules/wega.xqm | 18 +- webapp/xql/modules/xho.xqm | 303 +++++++++++++++---------------- webapp/xql/news_singleView.xql | 6 +- webapp/xql/person_singleView.xql | 6 +- webapp/xql/search.xql | 4 +- webapp/xql/tools.xql | 4 +- webapp/xql/var.xql | 6 +- 12 files changed, 188 insertions(+), 202 deletions(-) diff --git a/webapp/xql/diary_singleView.xql b/webapp/xql/diary_singleView.xql index 938cfdbe6..f6f05b2b8 100644 --- a/webapp/xql/diary_singleView.xql +++ b/webapp/xql/diary_singleView.xql @@ -12,7 +12,7 @@ import module namespace ajax="http://xquery.weber-gesamtausgabe.de/webapp/xql/mo declare option exist:serialize "method=xhtml media-type=text/html indent=no omit-xml-declaration=yes encoding=utf-8 doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"; -declare function local:collectMetaData($diaryDay as node(), $authorID as xs:string, $lang as xs:string) as item() { +declare function local:collectMetaData($diaryDay as node(), $authorID as xs:string, $lang as xs:string) as element(wega:metaData) { let $name := wega:printFornameSurname(wega:getRegName($authorID)) let $dateFormat := if ($lang eq 'en') then '%A, %B %d, %Y' @@ -24,7 +24,7 @@ declare function local:collectMetaData($diaryDay as node(), $authorID as xs:stri else data($diaryDay) let $commonMetaData := xho:collectCommonMetaData($diaryDay) return - + {$pageTitle} {$commonMetaData/*} @@ -38,7 +38,7 @@ declare function local:collectMetaData($diaryDay as node(), $authorID as xs:stri - + }; let $lang := request:get-parameter('lang','de') diff --git a/webapp/xql/doc_singleView.xql b/webapp/xql/doc_singleView.xql index 3ab885d7e..36322b101 100644 --- a/webapp/xql/doc_singleView.xql +++ b/webapp/xql/doc_singleView.xql @@ -12,12 +12,12 @@ import module namespace ajax="http://xquery.weber-gesamtausgabe.de/webapp/xql/mo declare option exist:serialize "method=xhtml media-type=text/html indent=no omit-xml-declaration=yes encoding=utf-8 doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"; -declare function local:collectMetaData($doc as node(), $lang as xs:string) as item() { +declare function local:collectMetaData($doc as node(), $lang as xs:string) as element(wega:metaData) { let $pageTitle := string-join($doc//tei:fileDesc/tei:titleStmt/tei:title[@level='a'], '. ') let $pageDescription := wega:cleanString($doc//tei:note[@type='summary']) let $commonMetaData := xho:collectCommonMetaData($doc) return - + {$pageTitle} {$commonMetaData/*} @@ -29,7 +29,7 @@ declare function local:collectMetaData($doc as node(), $lang as xs:string) as it - + }; let $lang := request:get-parameter('lang','') diff --git a/webapp/xql/error.xql b/webapp/xql/error.xql index 816b1dd38..67d6b37d8 100644 --- a/webapp/xql/error.xql +++ b/webapp/xql/error.xql @@ -31,13 +31,13 @@ let $logToFile := wega:logToFile('error', $logMessage) let $setStatusCode := response:set-status-code(xs:int($errorCode)) let $startID := 'A002068' let $metaData := - + Error 404 – Carl-Maria-von-Weber-Gesamtausgabe {xho:collectCommonMetaData(())/*} - + return diff --git a/webapp/xql/index.xql b/webapp/xql/index.xql index 046848c71..586d7c147 100644 --- a/webapp/xql/index.xql +++ b/webapp/xql/index.xql @@ -49,28 +49,13 @@ declare function local:createNewsTeaser($newsID as xs:string, $lang as xs:string ) }; -(:declare function local:createDevelopmentLinks($baseHref as xs:string, $lang as xs:string) as element() { - element div { - attribute id {'developmentTools'}, - element h1 {wega:getLanguageString('development', $lang)}, - element ul { - element li { - element a { - attribute href {string-join(($baseHref, $lang, wega:getLanguageString('tools', $lang)), '/')}, - 'Tools' - } - } - } - } -};:) - -declare function local:collectMetaData($lang as xs:string) as item() { +declare function local:collectMetaData($lang as xs:string) as element(wega:metaData) { let $pageTitle := concat('Carl-Maria-von-Weber-Gesamtausgabe', ' – ', wega:getLanguageString('home', $lang)) let $pageDescription := wega:getLanguageString('metaDescriptionIndex', $lang) let $commonMetaData := xho:collectCommonMetaData(()) let $subject := string-join(('Carl Maria von Weber', 'Edition', 'Social Network', wega:getLanguageString('gesamtausgabe', $lang)), '; ') return - + {$pageTitle} {$commonMetaData/*} @@ -83,7 +68,7 @@ declare function local:collectMetaData($lang as xs:string) as item() { - + }; let $lang := request:get-parameter('lang','') diff --git a/webapp/xql/letter_singleView.xql b/webapp/xql/letter_singleView.xql index 131292ca9..6180b42c8 100644 --- a/webapp/xql/letter_singleView.xql +++ b/webapp/xql/letter_singleView.xql @@ -13,12 +13,12 @@ import module namespace ajax="http://xquery.weber-gesamtausgabe.de/webapp/xql/mo declare option exist:serialize "method=xhtml media-type=text/html indent=no omit-xml-declaration=yes encoding=utf-8 doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"; -declare function local:collectMetaData($doc as node(), $lang as xs:string) as item() { +declare function local:collectMetaData($doc as node(), $lang as xs:string) as element(wega:metaData) { let $pageTitle := string-join(wega:getLetterHead($doc, $lang), '. ') let $pageDescription := wega:cleanString($doc//tei:note[@type='summary']) let $commonMetaData := xho:collectCommonMetaData($doc) return - + {$pageTitle} {$commonMetaData/*} @@ -30,7 +30,7 @@ declare function local:collectMetaData($doc as node(), $lang as xs:string) as it - + }; let $lang := request:get-parameter('lang','') diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 721bd3782..bcc4b8f7a 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1401,8 +1401,8 @@ declare function wega:printCorrespondentName($persName as element(), $lang as xs if(exists($persName/@key)) then wega:createPersonLink($persName/string(@key), $lang, $order) else if (exists($persName//text())) - then {normalize-space($persName)} - else {wega:getLanguageString('unknown',$lang)} + then {normalize-space($persName)} + else {wega:getLanguageString('unknown',$lang)} }; (:~ @@ -1421,10 +1421,10 @@ declare function wega:createPersonLink($id as xs:string, $lang as xs:string, $or else wega:getRegName($id) return if($name != '') then - - {$name} - - else {wega:getLanguageString('unknown',$lang)} + + {$name} + + else {wega:getLanguageString('unknown',$lang)} }; (:~ @@ -1949,7 +1949,9 @@ declare function wega:getPicMetadata($localPicURL as xs:string) as node()? { 140px 185px - else let $metadataFile := collection('/db/iconography')//tei:graphic[data(@url) = functx:substring-after-last($localPicURL, '/')] + else + let $picFile := functx:substring-after-last($localPicURL, '/') + let $metadataFile := collection('/db/iconography')//tei:graphic[@url = $picFile] return {$localPicURL} @@ -2825,7 +2827,7 @@ declare function wega:createNormDates($docType as xs:string) as item()? { : @return item? :) -declare function wega:getNormDates($docType as xs:string) as item()? { +declare function wega:getNormDates($docType as xs:string) as document-node()? { let $normDatesFileName := if($docType eq 'persons') then wega:getOption('persNamesFile') else if($docType eq 'works') then wega:getOption('worksNormSeriesFile') diff --git a/webapp/xql/modules/xho.xqm b/webapp/xql/modules/xho.xqm index bb6bd87c2..1610997f4 100644 --- a/webapp/xql/modules/xho.xqm +++ b/webapp/xql/modules/xho.xqm @@ -46,26 +46,26 @@ declare function xho:createHeadContainer($lang as xs:string) as element()* { then replace(wega:translateLanguageString(replace($i, '_', ' '), $lang, 'de'), '\s', '_') (: Ersetzen von Leerzeichen durch Unterstriche in der URL :) else replace(wega:translateLanguageString(replace($i, '_', ' '), $lang, 'en'), '\s', '_') let $switchLanguage := if($lang eq 'en') - then germanFlag - else englishFlag + then + else return ( - element div { + element xhtml:div { attribute id {"headContainer"}, if(wega:getOption('environment') eq 'development') then attribute class {'dev'} else if(wega:getOption('environment') eq 'release') then attribute class {'rel'} else (), -

Carl Maria von Weber Gesamtausgabe

, - + Carl Maria von Weber Gesamtausgabe, + + {wega:getLanguageString('search',$lang)} + {wega:getLanguageString('home',$lang)} + {wega:getLanguageString('about',$lang)} + {wega:getLanguageString('help',$lang)} + {$switchLanguage} + }, - , - , - + {wega:getLanguageString('noscript', $lang)}, + , + if(navigator.userAgent.indexOf('MSIE 6') != -1) $('IE6').show() ) }; @@ -79,7 +79,7 @@ declare function xho:createHeadContainer($lang as xs:string) as element()* { : @return XHTML element :) -declare function xho:createFooter($lang as xs:string, $docPath as xs:string) as element() { +declare function xho:createFooter($lang as xs:string, $docPath as xs:string) as element(xhtml:div) { let $docHash := util:hash($docPath, 'md5') (: let $log := util:log-system-out($docPath):) let $entry := doc(wega:getOption('svnChangeHistoryFile'))//id(concat('_',$docHash)) @@ -96,19 +96,19 @@ declare function xho:createFooter($lang as xs:string, $docPath as xs:string) as let $encryptedBugEmail := wega:encryptString(wega:getOption('bugEmail'), ()) return if(exists($author) and exists($date)) then - + else xho:createFooter() }; @@ -120,8 +120,8 @@ declare function xho:createFooter($lang as xs:string, $docPath as xs:string) as : @return XHTML element :) -declare function xho:createFooter() as element() { - +declare function xho:createFooter() as element(xhtml:div) { + {xho:createCommonFooter()} }; (:~ @@ -137,7 +137,7 @@ declare function xho:createCommonFooter() as item()* { let $piwikTrackingCode := if(wega:getOption('environment') eq 'production') then ( , - , + , , , - , + , ) else () return ( -
- Valid XHTML 1.1 - powered by eXist - Staatsbibliothek zu Berlin - Preußischer Kulturbesitz - Akademie der Wissenschaften und der Literatur Mainz - Powered by TEI -
- Universität Paderborn - Hochschule für Musik Detmold -
, + + + + + + + + + + , $piwikTrackingCode ) }; @@ -184,36 +184,36 @@ declare function xho:createCommonFooter() as item()* { : @return XHTML element :) -declare function xho:createHtmlHead($stylesheets as xs:string*, $jscripts as xs:string*, $metaData as item(), $domLoaded as node()?, $additionalJScripts as node()?) as element() { +declare function xho:createHtmlHead($stylesheets as xs:string*, $jscripts as xs:string*, $metaData as element(wega:metaData), $domLoaded as node()?, $additionalJScripts as node()?) as element(xhtml:head) { let $html_pixDir := wega:getOption('html_pixDir') let $commonStylesheets := ('main.css', 'tei_common.css', 'ajaxtabs.css', 'lytebox.css', 'xmlPrettyPrint.css') let $commonJscripts := ('text_common.js', 'ajaxtabs.js', 'prototype_min.js', 'lytebox_min.js', 'wz_tooltip/wz_tooltip_min.js') let $baseHref := wega:getOption('baseHref') return - - - - + + + + }; @@ -226,7 +226,7 @@ declare function xho:createHtmlHead($stylesheets as xs:string*, $jscripts as xs: : @return XHTML (div) :) -declare function xho:createBreadCrumb($doc as item(), $lang as xs:string) as element() { +declare function xho:createBreadCrumb($doc as item(), $lang as xs:string) as element(xhtml:div) { let $docID := $doc/root()/*/@xml:id cast as xs:string let $baseHref := wega:getOption('baseHref') let $isDiary := starts-with($docID, 'A06') (: Diverse Sonderbehandlungen fürs Tagebuch :) @@ -236,27 +236,27 @@ declare function xho:createBreadCrumb($doc as item(), $lang as xs:string) as ele let $authorsCount := count($authors) let $docStatus := wega:getRevisionStatus($doc) return ( - + ) }; @@ -270,12 +270,12 @@ declare function xho:createBreadCrumb($doc as item(), $lang as xs:string) as ele : @return XHTML (div) :) -declare function xho:createBreadCrumb($id as xs:string, $docType as xs:string, $lang as xs:string) as element() { +declare function xho:createBreadCrumb($id as xs:string, $docType as xs:string, $lang as xs:string) as element(xhtml:div) { let $author := wega:createPersonLink($id, $lang, 'fs') return - + }; @@ -288,7 +288,7 @@ declare function xho:createBreadCrumb($id as xs:string, $docType as xs:string, $ : @return element :) -declare function xho:createWorksDocumentsUL($id as xs:string, $lang as xs:string) as element() { +declare function xho:createWorksDocumentsUL($id as xs:string, $lang as xs:string) as element(xhtml:div) { let $persName := wega:getRegName($id) let $baseHref := wega:getOption('baseHref') let $listItems := @@ -303,16 +303,15 @@ declare function xho:createWorksDocumentsUL($id as xs:string, $lang as xs:string then wega:getLanguageString('correspondence', $lang) else wega:getLanguageString($i, $lang) return if(exists($coll) and ($i ne 'diaries' or $id eq 'A002068')) (: Tagebuch nur bei Weber anzeigen :) - then
  • {$linkText}
  • - else
  • {$linkText}
  • + then {$linkText} + else {$linkText} return ( -
    -

    {wega:getLanguageString('worksDocuments',$lang)}

    -
      + + {wega:getLanguageString('worksDocuments',$lang)} + {$listItems} - -
    -
    + + ) }; @@ -325,26 +324,26 @@ declare function xho:createWorksDocumentsUL($id as xs:string, $lang as xs:string : @return item of meta data :) -declare function xho:collectCommonMetaData($doc as node()?) as item() { +declare function xho:collectCommonMetaData($doc as node()?) as element(wega:metaData) { let $docPath := if(exists($doc)) then document-uri($doc/root()) else () let $contributors := - if(exists($doc//tei:fileDesc/tei:titleStmt/(tei:author | tei:editor))) then for $i in $doc//tei:fileDesc/tei:titleStmt/(tei:author | tei:editor) return - else (,) + if(exists($doc//tei:fileDesc/tei:titleStmt/(tei:author | tei:editor))) then for $i in $doc//tei:fileDesc/tei:titleStmt/(tei:author | tei:editor) return + else (,) return - - - + + + {if(exists($docPath)) then ( - , - ) + , + ) else () } - - - + + + {$contributors} - - + + }; (:~ @@ -355,24 +354,24 @@ declare function xho:collectCommonMetaData($doc as node()?) as item() { : @return element with popup-data in list-view :) -declare function xho:createPopupContainer($lang as xs:string) as element() { - +declare function xho:createPopupContainer($lang as xs:string) as element(xhtml:div) { + }; @@ -385,7 +384,7 @@ declare function xho:createPopupContainer($lang as xs:string) as element() { : @return a xhtml element ul :) -declare function xho:createTabsUL($curDocType as xs:string, $menuID as xs:string, $lang as xs:string) as element() { +declare function xho:createTabsUL($curDocType as xs:string, $menuID as xs:string, $lang as xs:string) as element(xhtml:ul) { let $baseHref := wega:getOption('baseHref') let $isPerson := wega:isPerson($menuID) let $menuNode := @@ -401,9 +400,9 @@ declare function xho:createTabsUL($curDocType as xs:string, $menuID as xs:string let $url := string-join(($urlPart1, encode-for-uri($title)), '/') (: let $log := util:log-system-out(string-join(($i/docType, $curDocType), ' ;; ')):) return ( -
  • { + { if(exists($coll) and ($i/docType ne 'diaries' or $menuID eq 'A002068' or $menuID eq 'indices')) (: Tagebuch nur bei Weber anzeigen :) - then element a { + then element xhtml:a { attribute href {$url}, attribute title {$title}, if($curDocType = $i/docType) @@ -411,18 +410,18 @@ declare function xho:createTabsUL($curDocType as xs:string, $menuID as xs:string else (), $title } - else element span { + else element xhtml:span { attribute title {$title}, attribute class {'notAvailable'}, $title } } -
  • + ) return -
      + {$listItems} -
    + }; (:~ @@ -435,7 +434,7 @@ declare function xho:createTabsUL($curDocType as xs:string, $menuID as xs:string : @return : a container for html:title and html:meta elements :) -declare function xho:collectMetaData($docType as xs:string, $menuID as xs:string, $lang as xs:string) as item() { +declare function xho:collectMetaData($docType as xs:string, $menuID as xs:string, $lang as xs:string) as element(wega:metadata) { let $menuNode := if(wega:isPerson($menuID)) then doc(wega:getOption('menusFile'))//id('persons')/entry[./docType eq $docType] else doc(wega:getOption('menusFile'))//id($menuID)/entry[./docType eq $docType] @@ -449,16 +448,16 @@ declare function xho:collectMetaData($docType as xs:string, $menuID as xs:string let $commonMetaData := xho:collectCommonMetaData(()) let $subject := wega:getLanguageString($menuNode/displayName/text(), $lang) return - - {$pageTitle} + + {$pageTitle} {$commonMetaData/*} - - - - - - - + + + + + + + }; (:~ @@ -470,20 +469,20 @@ declare function xho:collectMetaData($docType as xs:string, $menuID as xs:string : @return html:div :) -declare function xho:printEditionLinks($startID as xs:string, $lang as xs:string) as element() { +declare function xho:printEditionLinks($startID as xs:string, $lang as xs:string) as element(xhtml:div) { let $baseHref := wega:getOption('baseHref') return - + + {wega:getLanguageString('digitalEdition', $lang)} + + Weber Person + Weber {wega:getLanguageString('correspondence', $lang)} + Weber {wega:getLanguageString('diaries', $lang)} + Weber {wega:getLanguageString('writings', $lang)} + Weber {wega:getLanguageString('works', $lang)} + {wega:getLanguageString('indices', $lang)} + + }; (:~ @@ -494,20 +493,20 @@ declare function xho:printEditionLinks($startID as xs:string, $lang as xs:string : @return html:div :) -declare function xho:printProjectLinks($lang as xs:string) as element() { +declare function xho:printProjectLinks($lang as xs:string) as element(xhtml:div) { let $baseHref := wega:getOption('baseHref') return - + + {wega:getLanguageString('aboutTheProject', $lang)} + + {wega:getLanguageString('news', $lang)} + {wega:getLanguageString('editorialGuidelines', $lang)} + {wega:getLanguageString('projectDescription', $lang)} + {wega:getLanguageString('publications', $lang)} + {wega:getLanguageString('bibliography', $lang)} + {wega:getLanguageString('contact', $lang)} + + }; (:~ @@ -518,19 +517,19 @@ declare function xho:printProjectLinks($lang as xs:string) as element() { : @return html:div :) -declare function xho:printDevelopmentLinks($lang) { +declare function xho:printDevelopmentLinks($lang as xs:string) as element(xhtml:div) { let $baseHref := wega:getOption('baseHref') return - element div { + element xhtml:div { attribute id {'developmentTools'}, - element h1 {wega:getLanguageString('development', $lang)}, - element ul { - element li { - element a { + element xhtml:h1 {wega:getLanguageString('development', $lang)}, + element xhtml:ul { + element xhtml:li { + element xhtml:a { attribute href {string-join(($baseHref, $lang, wega:getLanguageString('tools', $lang)), '/')}, 'Tools' } } } } -}; \ No newline at end of file +}; diff --git a/webapp/xql/news_singleView.xql b/webapp/xql/news_singleView.xql index d9325aa15..30bf83445 100644 --- a/webapp/xql/news_singleView.xql +++ b/webapp/xql/news_singleView.xql @@ -12,13 +12,13 @@ import module namespace ajax="http://xquery.weber-gesamtausgabe.de/webapp/xql/mo declare option exist:serialize "method=xhtml media-type=text/html indent=no omit-xml-declaration=yes encoding=utf-8 doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"; -declare function local:collectMetaData($doc as node(), $lang as xs:string) as item() { +declare function local:collectMetaData($doc as node(), $lang as xs:string) as element(wega:metaData) { let $pageTitle := wega:cleanString($doc//tei:fileDesc/tei:titleStmt/tei:title[@level='a']) let $pageDescription := concat(substring(normalize-space($doc//tei:text), 1, 200), '…') let $commonMetaData := xho:collectCommonMetaData($doc) let $subject := string-join($doc//tei:keywords/tei:term, '; ') return - + {$pageTitle} {$commonMetaData/*} @@ -30,7 +30,7 @@ declare function local:collectMetaData($doc as node(), $lang as xs:string) as it - + }; let $lang := request:get-parameter('lang','de') diff --git a/webapp/xql/person_singleView.xql b/webapp/xql/person_singleView.xql index 580bf2609..959e5966a 100755 --- a/webapp/xql/person_singleView.xql +++ b/webapp/xql/person_singleView.xql @@ -14,7 +14,7 @@ import module namespace ajax="http://xquery.weber-gesamtausgabe.de/webapp/xql/mo declare option exist:serialize "method=xhtml media-type=text/html indent=no omit-xml-declaration=yes encoding=utf-8 doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"; -declare function local:collectMetaData($person as node(), $lang as xs:string) as item() { +declare function local:collectMetaData($person as node(), $lang as xs:string) as element(wega:metaData) { let $personID := $person/string(@xml:id) let $name := wega:printFornameSurname($person/tei:persName[@type='reg']) let $pageTitle := concat($name, ' – ', wega:getLanguageString('tabTitle_bio', $lang)) @@ -34,7 +34,7 @@ declare function local:collectMetaData($person as node(), $lang as xs:string) as let $commonMetaData := xho:collectCommonMetaData($person) let $noimageindex := if(exists(collection('/db/iconography')//tei:figure[.//tei:person[@corresp = $personID]][@n = 'portrait'][1][./tei:graphic])) then () else return - + {$pageTitle} {$commonMetaData/*} @@ -47,7 +47,7 @@ declare function local:collectMetaData($person as node(), $lang as xs:string) as {$noimageindex} - + }; let $lang := request:get-parameter('lang','') diff --git a/webapp/xql/search.xql b/webapp/xql/search.xql index 68937d43c..a5ceae812 100644 --- a/webapp/xql/search.xql +++ b/webapp/xql/search.xql @@ -15,12 +15,12 @@ let $sOpts := wega:getSetSearchOptions('0') (:let $lastSearch := session:get-attribute('historyStack') let $sessionVar := session:set-attribute('historyStack',wega:pop($lastSearch)):) let $metaData := - + {wega:getLanguageString('search',$lang)} {xho:collectCommonMetaData(())/*} - + let $domLoaded := diff --git a/webapp/xql/tools.xql b/webapp/xql/tools.xql index 8242761b3..d40d6563e 100644 --- a/webapp/xql/tools.xql +++ b/webapp/xql/tools.xql @@ -43,12 +43,12 @@ declare function local:createTabsUL($containerID as xs:string, $lang as xs:strin let $lang := request:get-parameter('lang','de') let $containerID := wega:getOption('containerID') let $metaData := - + {wega:getLanguageString('tools', $lang)} {xho:collectCommonMetaData(())/*} - + return diff --git a/webapp/xql/var.xql b/webapp/xql/var.xql index 50f2dbea9..7a72cfaf0 100644 --- a/webapp/xql/var.xql +++ b/webapp/xql/var.xql @@ -57,7 +57,7 @@ declare function local:createNameListSidebar($docID as xs:string, $withJS as xs: } }; -declare function local:collectMetaData($doc as document-node(), $lang as xs:string) as item() { +declare function local:collectMetaData($doc as document-node(), $lang as xs:string) as element(wega:metaData) { let $pageTitle := wega:cleanString($doc//tei:fileDesc/tei:titleStmt/tei:title[@level='a'][@xml:lang = $lang]) let $pageDescription := if(wega:isBiblio($doc/tei:TEI/string(@xml:id))) then string-join($doc//tei:biblStruct[1]//tei:title, '. ') @@ -68,7 +68,7 @@ declare function local:collectMetaData($doc as document-node(), $lang as xs:stri if($doc//tei:idno[@type='isbn-13']) then else () return - + {$pageTitle} {$commonMetaData/*} @@ -78,7 +78,7 @@ declare function local:collectMetaData($doc as document-node(), $lang as xs:stri - + }; From 1504caedb93720de052c6d45292010a1823fc872 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 7 Aug 2013 15:51:29 +0200 Subject: [PATCH 11/48] suppressed processing of text nodes --- webapp/xsl/diary_tableRight.xsl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/webapp/xsl/diary_tableRight.xsl b/webapp/xsl/diary_tableRight.xsl index 7ab2711d5..d6f150b8b 100644 --- a/webapp/xsl/diary_tableRight.xsl +++ b/webapp/xsl/diary_tableRight.xsl @@ -1,4 +1,7 @@ - + + @@ -10,7 +13,7 @@ | - + From 2d8c7bf3deab4a312e81674bdf9bcf39ef20996c Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 7 Aug 2013 15:52:21 +0200 Subject: [PATCH 12/48] eliminated superfluous whitespace --- webapp/xsl/diary_tableLeft.xsl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapp/xsl/diary_tableLeft.xsl b/webapp/xsl/diary_tableLeft.xsl index db19b8008..9df0c8267 100644 --- a/webapp/xsl/diary_tableLeft.xsl +++ b/webapp/xsl/diary_tableLeft.xsl @@ -1,3 +1,4 @@ + - + Date: Thu, 8 Aug 2013 10:59:43 +0200 Subject: [PATCH 13/48] workaround for bug in the image module, fixes #15 --- webapp/xql/modules/wega.xqm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index bcc4b8f7a..fc4acd90d 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1910,9 +1910,9 @@ declare function wega:retrievePicture($picURL as xs:string, $localName as xs:str declare function wega:storePicMetadata($pathToLocalFile as xs:string, $origURL as xs:string) as xs:string? { let $localDbCollection := functx:substring-before-last($pathToLocalFile, '/') let $localFileName := functx:substring-after-last($pathToLocalFile, '/') - let $pic := util:binary-doc($pathToLocalFile) - let $picWidth := util:catch('*', image:get-width($pic), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) - let $picHeight := util:catch('*', image:get-height($pic), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) + (:let $pic := util:binary-doc($pathToLocalFile):) + let $picHeight := util:catch('*', image:get-height(util:binary-doc($pathToLocalFile)), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) + let $picWidth := util:catch('*', image:get-width(util:binary-doc($pathToLocalFile)), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) let $metadata := {$pathToLocalFile} @@ -1920,7 +1920,7 @@ declare function wega:storePicMetadata($pathToLocalFile as xs:string, $origURL a {concat($picWidth, 'px')} {concat($picHeight, 'px')} - return if(exists($pic) and $picWidth castable as xs:int and $picHeight castable as xs:int) + return if($picWidth instance of xs:integer and $picHeight instance of xs:integer) then util:catch('*', xmldb:store($localDbCollection, concat(functx:substring-before-last($localFileName, '.'), '.xml'), $metadata), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) else () }; @@ -1977,8 +1977,6 @@ declare function wega:createDigilibURL($localPicURL as xs:string, $dimensions as let $pixDir := wega:getOption('pixDir') let $imagesDir := wega:getOption('imagesDir') let $digilibDir := wega:getOption('digilibDir') - let $pic := util:binary-doc($localPicURL) - (:let $log := util:log-system-out($picMetadata):) let $picHeight := if(exists($picMetadata/height)) then xs:int(substring-before($picMetadata/height, 'px')) else 1 let $picWidth := if(exists($picMetadata/width)) then xs:int(substring-before($picMetadata/width, 'px')) else 1 let $dw := $dimensions[1] From 55f27b53f83f93492a012724a6dbcb6066e20e79 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 11:54:59 +0200 Subject: [PATCH 14/48] performance improvements --- exist-indices/db/works/collection.xconf | 5 ++-- webapp/xql/modules/facets.xqm | 35 ++++++++++++++----------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/exist-indices/db/works/collection.xconf b/exist-indices/db/works/collection.xconf index ff420da8b..c7454b2bc 100644 --- a/exist-indices/db/works/collection.xconf +++ b/exist-indices/db/works/collection.xconf @@ -1,13 +1,12 @@ - - - + + diff --git a/webapp/xql/modules/facets.xqm b/webapp/xql/modules/facets.xqm index 1b9aafcde..57dfc666f 100644 --- a/webapp/xql/modules/facets.xqm +++ b/webapp/xql/modules/facets.xqm @@ -1,4 +1,4 @@ -xquery version "1.0" encoding "UTF-8"; +xquery version "3.0" encoding "UTF-8"; (:~ : WeGA facets XQuery-Modul @@ -339,11 +339,11 @@ declare function facets:createFilter($checked as xs:string*) as element(facets:f : @return item* :) -declare function facets:sortColl($coll as item()*) as item()* { +declare function facets:sortColl($coll as element()*) as element()* { if(wega:isPerson($coll[1]/string(@xml:id))) then for $i in $coll order by $i/tei:persName[@type = 'reg'] ascending return $i else if(wega:isLetter($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:dateSender/tei:date[1], false()) ascending, $i//tei:dateSender/tei:date[1]/@n ascending return $i else if(wega:isWriting($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:sourceDesc/tei:*/tei:monogr/tei:imprint/tei:date[1], false()) ascending return $i - else if(wega:isDiary($coll[1]/string(@xml:id))) then for $i in $coll order by $i/xs:date(@n) ascending return $i + else if(wega:isDiary($coll[1]/string(@xml:id))) then for $i in $coll order by $i/@n cast as xs:date ascending return $i else if(wega:isWork($coll[1]/string(@xml:id))) then for $i in $coll order by $i//mei:seriesStmt/mei:title[@level='s']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string(@subtype) ascending, $i//mei:altId[@type = 'WeV']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string() ascending return $i else if(wega:isNews($coll[1]/string(@xml:id))) then for $i in $coll order by $i//tei:publicationStmt/tei:date/xs:dateTime(@when) descending return $i else if(wega:isBiblio($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:imprint/tei:date, false()) descending return $i @@ -497,7 +497,7 @@ declare function facets:getIndexOfFirstOrLastDocumentInYear($entriesSessionName declare function facets:getFirstOrLastDocumentInMonth($entriesSessionName as xs:string, $year as xs:string, $month as xs:string, $first as xs:boolean) as xs:integer* { let $entries := session:get-attribute($entriesSessionName) - let $docsInYearAndMonth := $entries[@year = $year][@month = $month] + let $docsInYearAndMonth := $entries[@year = $year][@month = $month] (: kein Index mehr drauf !! :) return if($first) then functx:index-of-node($entries, $docsInYearAndMonth[1]) else functx:index-of-node($entries, $docsInYearAndMonth[last()]) @@ -528,8 +528,11 @@ declare function facets:getFirstOrLastDocumentInSeries($collIDs as xs:string*, $ : @return item* :) -declare function facets:getDistinctSeries($coll as item()+) as item()* { - for $title in functx:distinct-deep($coll//mei:seriesStmt/mei:title[@level='s']) order by $title/xs:int(@n) return $title +declare function facets:getDistinctSeries($coll as item()+) as element(mei:title)* { + for $series in $coll//mei:seriesStmt[@n='WeGA'] + group by $title := $series/mei:title[@level='s'] + order by $title/xs:int(@n) + return $title }; (:~ @@ -597,16 +600,16 @@ declare function facets:createChronoList($docType as xs:string, $lang as xs:stri let $datedSessionName := concat('dated', $docType) let $undatedSessionName := concat('undated', $docType) let $yearsSessionName := concat('years', $docType) - let $coll := session:get-attribute($sessionCollName) - let $normDates := wega:getNormDates($docType)//entry + let $coll-ids := session:get-attribute($sessionCollName)/@xml:id + let $normDates := wega:getNormDates($docType) let $undatedKeys := - if($docType eq 'diaries') then $normDates[not(./node())][@docID = $coll/@xml:id]/string(@docID) (: Bei keinem Treffer wird der leere String zurückgegeben :) - else if($docType eq 'biblio') then $normDates[not(./node())][@docID = $coll/@xml:id]/string(@docID) - else $normDates[not(node())][@docID = $coll/@xml:id]/string(@docID) + if($docType eq 'diaries') then $normDates//entry[not(./node())][@docID = $coll-ids]/string(@docID) (: Bei keinem Treffer wird der leere String zurückgegeben :) + else if($docType eq 'biblio') then $normDates//entry[not(./node())][@docID = $coll-ids]/string(@docID) + else $normDates//entry[not(node())][@docID = $coll-ids]/string(@docID) let $dated := - if($docType eq 'diaries') then $normDates[@docID = $coll/@xml:id][./node()] - else if($docType eq 'biblio') then $normDates[@docID = $coll/@xml:id][./node()] - else $normDates[@docID = $coll/@xml:id][./node()] + if($docType eq 'diaries') then $normDates//entry[@docID = $coll-ids][./node()] + else if($docType eq 'biblio') then $normDates//entry[@docID = $coll-ids][./node()] + else $normDates//entry[@docID = $coll-ids][./node()] let $distinctYears := for $i in distinct-values($dated/@year) return $i cast as xs:int let $saveDated := session:set-attribute($datedSessionName, $dated) let $saveUndated := session:set-attribute($undatedSessionName, $undatedKeys) @@ -657,7 +660,7 @@ declare function facets:createYearAndMonthUl($entriesSessionName as xs:string, $ let $yearsInInterval := (: news werden umgekehrt angeführt, also latest->first und nicht first->latest :) if(xs:int($distinctYears[$fromYearPosition]) lt xs:int($distinctYears[$toYearPosition])) then $distinctYears[. = (xs:int($distinctYears[$fromYearPosition]) to xs:int($distinctYears[$toYearPosition]))] else $distinctYears[. = (xs:int($distinctYears[$toYearPosition]) to xs:int($distinctYears[$fromYearPosition]))] - let $countDocsInInterval := count($entries[@year = $yearsInInterval]) + let $countDocsInInterval := count($entries[@year = $yearsInInterval]) (: kein Index mehr drauf !! :) let $isOneYear := $distinctYears[$fromYearPosition] eq $distinctYears[$toYearPosition] let $nestedMenu := ($countDocsInInterval gt 12 and not($showYearsOnly)) or (not($isOneYear) and $showYearsOnly) return @@ -684,7 +687,7 @@ declare function facets:createYearAndMonthUl($entriesSessionName as xs:string, $ else
      { let $months := $entries[@year = $distinctYears]/@month return for $i in distinct-values($months) - let $countMonth := count($entries[@year = $distinctYears][@month = $i]) + let $countMonth := count($entries[@year = $distinctYears][@month = $i]) (: kein Index mehr drauf !! :) let $startPosition := facets:getFirstOrLastDocumentInMonth($entriesSessionName, $distinctYears cast as xs:string, $i, true()) let $endPosition := facets:getFirstOrLastDocumentInMonth($entriesSessionName, $distinctYears cast as xs:string, $i, false()) let $onclick := concat('javascript:', wega:printJavascriptFunction(showEntriesthis{$startPosition}{$endPosition}{$lang}{replace($entriesSessionName, 'dated', 'sessionColl')})) From 0f4dd7d1eecd4690502a099c8c3631b00c699576 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 12:29:24 +0200 Subject: [PATCH 15/48] set cache-control header for getJavaScriptOptions.xql --- webapp/controller.xql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapp/controller.xql b/webapp/controller.xql index 8ee814306..8777d444d 100644 --- a/webapp/controller.xql +++ b/webapp/controller.xql @@ -73,6 +73,8 @@ return ( if($isFunc) then + {if($exist:resource = 'getJavaScriptOptions.xql') then + else ()} From 3408bfbc666a12df32566846c99e581d903adbe1 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 17:13:15 +0200 Subject: [PATCH 16/48] some rewriting for better index use --- webapp/xml/facets.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/webapp/xml/facets.xml b/webapp/xml/facets.xml index af9607fb9..72236a0ac 100644 --- a/webapp/xml/facets.xml +++ b/webapp/xml/facets.xml @@ -1,7 +1,7 @@ persons - //tei:residence/tei:settlement + //tei:settlement[parent::tei:residence] persons @@ -9,23 +9,23 @@ persons - //@source + /@source letters - //tei:sender/tei:persName/@key + //tei:persName[parent::tei:sender]/@key letters - //tei:addressee/tei:persName/@key + //tei:persName[parent::tei:addressee]/@key letters - //tei:placeSender/tei:placeName + //tei:placeName[parent::tei:placeSender] letters - //tei:placeAddressee/tei:placeName + //tei:placeName[parent::tei:placeAddressee] writings @@ -66,7 +66,7 @@ works - //mei:seriesStmt/mei:title[@level='s']/@n + //mei:title[@level='s'][parent::mei:seriesStmt]/@n biblio @@ -84,4 +84,4 @@ biblio /@status - \ No newline at end of file + From f64d71d9dea27687f7c03bd8dda4df1b5d4c9da6 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 17:13:56 +0200 Subject: [PATCH 17/48] unused index entries removed --- exist-indices/db/persons/collection.xconf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/exist-indices/db/persons/collection.xconf b/exist-indices/db/persons/collection.xconf index 82e56aa73..1d590a1dc 100644 --- a/exist-indices/db/persons/collection.xconf +++ b/exist-indices/db/persons/collection.xconf @@ -1,10 +1,7 @@ - - - @@ -28,4 +25,4 @@ - + \ No newline at end of file From cd01461085b4a8186b0a490842b8e5bba649690b Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 17:14:18 +0200 Subject: [PATCH 18/48] some code tidying --- webapp/xql/search.xql | 72 ++----------------------------------------- 1 file changed, 2 insertions(+), 70 deletions(-) diff --git a/webapp/xql/search.xql b/webapp/xql/search.xql index a5ceae812..6c1cd4d89 100644 --- a/webapp/xql/search.xql +++ b/webapp/xql/search.xql @@ -33,7 +33,6 @@ let $domLoaded := initializeRSH - let $additionalJScripts := @@ -41,10 +40,8 @@ let $additionalJScripts := create_RSH -return (:'rsh_functions.js', 'rsh.js', 'autocomplete.js' - initializeAutoComplete - {$lang} - :) +return + {xho:createHtmlHead('search.css', ('rsh_functions.js', 'rsh.js','search_functions.js', 'infinite_scroll.js'), $metaData, $domLoaded, $additionalJScripts)} @@ -52,34 +49,6 @@ return (:'rsh_functions.js', 'rsh.js', 'autocomplete.js' {xho:createHeadContainer($lang)}
      -
      {wega:getLanguageString('advancedSearch',$lang)} @@ -106,43 +75,6 @@ return (:'rsh_functions.js', 'rsh.js', 'autocomplete.js'
      -
      From 6d401715144c053f3dc1170122e6b7e15f3c722d Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 17:16:36 +0200 Subject: [PATCH 19/48] fixed wrong XPaths; closes #16 --- webapp/xql/functions/search_getResults.xql | 37 ++++++++-------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/webapp/xql/functions/search_getResults.xql b/webapp/xql/functions/search_getResults.xql index 43a8bfa85..37e47f5c6 100644 --- a/webapp/xql/functions/search_getResults.xql +++ b/webapp/xql/functions/search_getResults.xql @@ -17,22 +17,11 @@ declare option exist:serialize "method=xhtml media-type=text/html indent=no omit declare variable $local:docTypesForSearch := ('persons','letters','writings','diaries','works','news','biblio','var'); -declare function local:getCollection($docType as xs:string, $useCache as xs:boolean) { - if($useCache) - then facets:getOrCreateColl($docType,'indices') +declare function local:getCollection($docType as xs:string, $useCache as xs:boolean) as element()* { + if($useCache) then facets:getOrCreateColl($docType,'indices') else facets:createColl($docType,'indices') - (: if($docType eq 'persons') then collection(wega:getOption('persons'))//tei:person[not(./tei:ref)] (\: exclude duplicates :\) - else if($docType eq 'letters') then collection(wega:getOption('letters'))//tei:TEI[not(./tei:ref)] - else if($docType eq 'diaries') then collection(wega:getOption('diaries'))//tei:ab - else if($docType eq 'works') then collection(wega:getOption('works'))//mei:mei - else if($docType eq 'news') then collection(wega:getOption('news'))//tei:TEI - else if($docType eq 'writings') then collection(wega:getOption('writings'))//tei:TEI[not(./tei:ref)] - else if($docType eq 'biblio') then collection(wega:getOption('biblio'))/tei:TEI | collection(wega:getOption('biblio'))/tei:biblStruct - else if($docType eq 'var') then collection(wega:getOption('var'))//tei:TEI - else():) }; - (:~ : Creates the query-element for a lucene search. For example: : @@ -46,9 +35,9 @@ declare function local:getCollection($docType as xs:string, $useCache as xs:bool : @return the query as XML or () :) -declare function local:buildQuery($searchString,$type) { - if($searchString = '') then '' - else +declare function local:buildQuery($searchString as xs:string, $type as xs:string) as item() { + (:if($searchString = '') then '' + else:) (: wird schon vorher abgefangen :) let $hasWildcards := matches($searchString, '.(\*|\?).') let $hasQuotationMarks := matches($searchString,'".+"') or matches($searchString,"'.+'") let $hasHyphen := matches($searchString, '-') @@ -199,15 +188,15 @@ declare function local:searchForPersName($coll,$query,$docType) { declare function local:searchFullText($coll,$query,$docType) { let $result := - if($docType='persons') then $coll//tei:person[ft:query(., $query)] | $coll//tei:persName[@type][ft:query(., $query)] + if($docType='persons') then $coll[ft:query(., $query)] | $coll//tei:persName[@type][ft:query(., $query)] else if($docType='letters') then $coll//tei:body[ft:query(., $query)] | $coll//tei:correspDesc[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] | $coll//tei:incipit[ft:query(., $query)] | $coll//tei:note[ft:query(.[@type eq 'summary'], $query)] - else if($docType='diaries') then $coll//tei:ab[ft:query(., $query)] - else if($docType='writings') then $coll//tei:body[ft:query(., $query)]/ancestor::tei:TEI | $coll//tei:title[ft:query(., $query)]/ancestor::tei:TEI - else if($docType='works') then $coll//mei:mei[ft:query(., $query)] | $coll//mei:title[ft:query(., $query)] - else if($docType='news') then $coll//tei:body[ft:query(., $query)]/ancestor::tei:TEI | $coll//tei:title[ft:query(., $query)]/ancestor::tei:TEI + else if($docType='diaries') then $coll[ft:query(., $query)] + else if($docType='writings') then $coll//tei:body[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] + else if($docType='works') then $coll[ft:query(., $query)] | $coll//mei:title[ft:query(., $query)] + else if($docType='news') then $coll//tei:body[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] else if($docType='biblio') then $coll//tei:text[ft:query(., $query)] | $coll//tei:biblStruct[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] | $coll//tei:author[ft:query(., $query)] | $coll//tei:editor[ft:query(., $query)] - else if($docType='var') then collection('/db/var')//tei:body[ft:query(.,$query)]/ancestor::tei:TEI | collection('/db/var')//tei:title[ft:query(.,$query)]/ancestor::tei:TEI + else if($docType='var') then collection('/db/var')//tei:body[ft:query(.,$query)] | collection('/db/var')//tei:title[ft:query(.,$query)] else() return local:getRootNode($result,$docType) }; @@ -222,7 +211,7 @@ declare function local:searchFullText($coll,$query,$docType) { : @return the resulting sequence of documents :) declare function local:createSearchField($docType,$searchFilter,$query) { - let $coll := local:getCollection($docType,true()) + let $coll := local:getCollection($docType,false()) (:let $log := util:log-system-out(concat('#',$query)):) return if($searchFilter='fullText') then local:searchFullText($coll,$query,$docType) @@ -302,7 +291,7 @@ declare function local:intersectOtherResults($result, $docType, $searchFilter, $ :) declare function local:getResults($docType as xs:string) as element()* { - if(request:get-parameter('searchString','')='') then local:getCollection($docType,true()) + if(request:get-parameter('searchString','') eq '') then local:getCollection($docType,true()) else let $result := local:intersectLuceneResults((), $docType, 'fullText', local:buildQuery(request:get-parameter('fullText',''),'fullText')) let $result := local:intersectLuceneResults($result, $docType, 'persName', local:buildQuery(request:get-parameter('persName',''),'persName')) From 9139d8aff3881f8f6323c64329fe5cd239d4f4e6 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 18:37:31 +0200 Subject: [PATCH 20/48] corrected creation of news context --- webapp/xql/modules/ajax.xqm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index 30466148a..d1797ef82 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -784,26 +784,26 @@ declare function ajax:getDiaryContext($contextContainer as xs:string, $docID as :) declare function ajax:getNewsContext($contextContainer as xs:string, $docID as xs:string, $lang as xs:string) { -(: let $authorID := 'A002068':) - let $coll := facets:getOrCreateColl('news', 'indices') - let $currPos := functx:index-of-node($coll, $coll//id($docID)) + let $normDates := wega:getNormDates('news') + let $following := $normDates//entry[@docID = $docID]/preceding-sibling::entry[position() = last()] + let $preceding := $normDates//entry[@docID = $docID]/following-sibling::entry[1] let $baseHref := wega:getOption('baseHref') return

      {wega:getLanguageString('context', $lang)}

        { - if($currPos lt count($coll)) (: Absteigende Sortierung! :) + if($preceding) (: Absteigende Sortierung! :) then element li { wega:getLanguageString('prevDiaryDay', $lang),
        , - wega:createDocLink($coll[$currPos + 1]/root(), $coll[$currPos + 1]/string(@xml:id), $lang, ()) (: Absteigende Sortierung! :) + wega:createDocLink(wega:doc($preceding/@docID), wega:getNiceDate($preceding/text() cast as xs:date, $lang), $lang, ()) (: Absteigende Sortierung! :) } else (), - if($currPos gt 1) (: Absteigende Sortierung! :) + if($following) (: Absteigende Sortierung! :) then element li { wega:getLanguageString('nextDiaryDay', $lang),
        , - wega:createDocLink($coll[$currPos - 1]/root(), $coll[$currPos - 1]/string(@xml:id), $lang, ()) (: Absteigende Sortierung! :) + wega:createDocLink(wega:doc($following/@docID), wega:getNiceDate($following/text() cast as xs:date, $lang), $lang, ()) (: Absteigende Sortierung! :) } else (), element li { From f7f4e8a0456201d7ce48eed5e0bff42bc7408b81 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 18:40:12 +0200 Subject: [PATCH 21/48] changed facets:getOrCreateColl to return document-node()* and modified other funcs accordingly --- webapp/xml/facets.xml | 6 +- webapp/xml/wegaOptions.xml | 30 ++++----- webapp/xql/functions/search_getResults.xql | 9 +-- webapp/xql/functions/updateFilterNColl.xql | 2 +- webapp/xql/index.xql | 10 ++- webapp/xql/modules/facets.xqm | 78 +++++----------------- webapp/xql/modules/wega.xqm | 1 + webapp/xql/modules/xho.xqm | 4 +- webapp/xql/register.xql | 2 +- webapp/xql/utilities/createSiteMap.xql | 2 +- 10 files changed, 49 insertions(+), 95 deletions(-) diff --git a/webapp/xml/facets.xml b/webapp/xml/facets.xml index 72236a0ac..768f68721 100644 --- a/webapp/xml/facets.xml +++ b/webapp/xml/facets.xml @@ -9,7 +9,7 @@ persons - /@source + /*/@source letters @@ -82,6 +82,6 @@ diaries persons biblio - /@status + /*/@status - + \ No newline at end of file diff --git a/webapp/xml/wegaOptions.xml b/webapp/xml/wegaOptions.xml index def241c53..46ca3741e 100644 --- a/webapp/xml/wegaOptions.xml +++ b/webapp/xml/wegaOptions.xml @@ -9,23 +9,23 @@ /db/works /db/var /db/biblio - /db/biblio +
      - //tei:TEI[(.//tei:sender/tei:persName/@key = '%1', .//tei:addressee/tei:persName/@key = '%1')][not(./tei:ref)] - //tei:TEI[.//tei:fileDesc//tei:author/@key = '%1'][not(./tei:ref)] - //tei:TEI[.//tei:fileDesc//tei:author/@key = '%1'][not(./tei:ref)] - //tei:ab - //mei:mei[.//mei:fileDesc/mei:titleStmt/mei:respStmt/mei:persName[@role=('cmp', 'lbt', 'lyr')]/@dbkey = '%1'] + [(.//tei:sender/tei:persName/@key = '%1', .//tei:addressee/tei:persName/@key = '%1')][not(*/tei:ref)] + [.//tei:fileDesc//tei:author/@key = '%1'][not(*/tei:ref)] + [.//tei:fileDesc//tei:author/@key = '%1'][not(*/tei:ref)] + + [.//mei:fileDesc/mei:titleStmt/mei:respStmt/mei:persName[@role=('cmp', 'lbt', 'lyr')]/@dbkey = '%1'] //tei:figure[.//tei:person[@corresp = '%1']][@n = 'portrait'][1] - //tei:TEI[not(./tei:ref)] - //tei:TEI[not(./tei:ref)] - //tei:TEI[not(./tei:ref)] - //tei:ab - //tei:person[not(./tei:ref)] - //mei:mei - //tei:biblStruct[not(./tei:ref)] - //tei:TEI[not(./tei:ref)] + [not(*/tei:ref)] + [not(*/tei:ref)] + [not(*/tei:ref)] + + [not(*/tei:ref)] + + [not(*/tei:ref)] +
      7 @@ -90,4 +90,4 @@ http://d-nb.info/gnd/ http://beacon.findbuch.de/seealso/pnd-aks?format=seealso&id=
      - \ No newline at end of file + diff --git a/webapp/xql/functions/search_getResults.xql b/webapp/xql/functions/search_getResults.xql index 37e47f5c6..8843288be 100644 --- a/webapp/xql/functions/search_getResults.xql +++ b/webapp/xql/functions/search_getResults.xql @@ -17,10 +17,11 @@ declare option exist:serialize "method=xhtml media-type=text/html indent=no omit declare variable $local:docTypesForSearch := ('persons','letters','writings','diaries','works','news','biblio','var'); +(: declare function local:getCollection($docType as xs:string, $useCache as xs:boolean) as element()* { if($useCache) then facets:getOrCreateColl($docType,'indices') else facets:createColl($docType,'indices') -}; +};:) (:~ : Creates the query-element for a lucene search. For example: @@ -211,7 +212,7 @@ declare function local:searchFullText($coll,$query,$docType) { : @return the resulting sequence of documents :) declare function local:createSearchField($docType,$searchFilter,$query) { - let $coll := local:getCollection($docType,false()) + let $coll := (:local:getCollection($docType,false()):) facets:getOrCreateColl($docType, 'indices', false()) (:let $log := util:log-system-out(concat('#',$query)):) return if($searchFilter='fullText') then local:searchFullText($coll,$query,$docType) @@ -291,7 +292,7 @@ declare function local:intersectOtherResults($result, $docType, $searchFilter, $ :) declare function local:getResults($docType as xs:string) as element()* { - if(request:get-parameter('searchString','') eq '') then local:getCollection($docType,true()) + if(request:get-parameter('searchString','') eq '') then facets:getOrCreateColl($docType, 'indices', true()) else let $result := local:intersectLuceneResults((), $docType, 'fullText', local:buildQuery(request:get-parameter('fullText',''),'fullText')) let $result := local:intersectLuceneResults($result, $docType, 'persName', local:buildQuery(request:get-parameter('persName',''),'persName')) @@ -332,7 +333,7 @@ declare function local:getOnlyOneDateResults($searchString,$docType) { let $queryTo := local:buildQueryTo($query,$nextMonth) let $queryTo := if($queryTo) then xs:date($queryTo) else() let $query := if(string-length($query) = 4) then concat($query,'-01-01') else if(string-length($query) = 7) then concat($query,'-01') else $query - let $coll := local:getCollection($docType,true()) + let $coll := (:local:getCollection($docType,true()):) facets:getOrCreateColl($docType, 'indices', false()) let $coll1 := if(exists($queryTo)) diff --git a/webapp/xql/functions/updateFilterNColl.xql b/webapp/xql/functions/updateFilterNColl.xql index 39f9074b2..2d007f5c6 100644 --- a/webapp/xql/functions/updateFilterNColl.xql +++ b/webapp/xql/functions/updateFilterNColl.xql @@ -17,7 +17,7 @@ let $checked := request:get-parameter('checked', ()) let $sessionCollName := facets:getCollName($docType, false()) let $filter := facets:createFilter($checked) (:let $log := util:log-system-out($filter):) -let $collOrg := facets:getOrCreateColl($docType, $cacheKey) +let $collOrg := facets:getOrCreateColl($docType, $cacheKey, true()) let $collNew := (:$collOrg:) facets:updateColl($collOrg, $filter) (:let $log := util:log-system-out(concat('updateFilterNColl: ', count($collNew))):) let $storeSessionAttributes := (session:set-attribute($sessionCollName, $collNew), session:set-attribute($sessionFilterName, $filter)) diff --git a/webapp/xql/index.xql b/webapp/xql/index.xql index 586d7c147..cfac959dc 100644 --- a/webapp/xql/index.xql +++ b/webapp/xql/index.xql @@ -16,11 +16,9 @@ import module namespace functx="http://www.functx.com" at "xmldb:exist:///db/web declare option exist:serialize "method=xhtml media-type=text/html indent=no omit-xml-declaration=yes encoding=utf-8 doctype-public=-//W3C//DTD XHTML 1.0 Strict//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"; -declare function local:createNewsTeaser($newsID as xs:string, $lang as xs:string) as element()* { - let $news := wega:doc($newsID) +declare function local:createNewsTeaser($news as document-node(), $lang as xs:string) as element()* { let $newsTeaserDate := $news//tei:fileDesc//tei:date/xs:dateTime(@when) let $authorID := data($news//tei:titleStmt/tei:author[1]/@key) -(: let $log := util:log-system-out(concat('ID: ', $newsID)):) let $dateFormat := if ($lang = 'en') then '%A, %B %d, %Y' else '%A, %d. %B %Y' @@ -82,15 +80,15 @@ let $minNews := xs:integer(wega:getOption('minNews')) let $maxNewsDays := xs:integer(wega:getOption('maxNewsDays')) let $newsTeaser := - let $newsColl := subsequence(facets:getOrCreateColl('news', 'indices')[days-from-duration($date - xs:date(.//tei:publicationStmt/tei:date/xs:dateTime(@when))) le $maxNewsDays], 1, $maxNews) - let $newsColl := if(count($newsColl) lt $minNews) then subsequence(facets:getOrCreateColl('news', 'indices'), 1, $minNews) + let $newsColl := subsequence(facets:getOrCreateColl('news', 'indices', true())[days-from-duration($date - xs:date(.//tei:publicationStmt/tei:date/xs:dateTime(@when))) le $maxNewsDays], 1, $maxNews) + let $newsColl := if(count($newsColl) lt $minNews) then subsequence(facets:getOrCreateColl('news', 'indices', true()), 1, $minNews) else $newsColl return (

      {wega:getLanguageString('news', $lang)}

      , for $news at $i in $newsColl return ( - local:createNewsTeaser($news/data(@xml:id), $lang), + local:createNewsTeaser($news, $lang), if($i ne count($newsColl)) then
      else () ) diff --git a/webapp/xql/modules/facets.xqm b/webapp/xql/modules/facets.xqm index 57dfc666f..cbde6c98d 100644 --- a/webapp/xql/modules/facets.xqm +++ b/webapp/xql/modules/facets.xqm @@ -339,14 +339,14 @@ declare function facets:createFilter($checked as xs:string*) as element(facets:f : @return item* :) -declare function facets:sortColl($coll as element()*) as element()* { - if(wega:isPerson($coll[1]/string(@xml:id))) then for $i in $coll order by $i/tei:persName[@type = 'reg'] ascending return $i - else if(wega:isLetter($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:dateSender/tei:date[1], false()) ascending, $i//tei:dateSender/tei:date[1]/@n ascending return $i - else if(wega:isWriting($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:sourceDesc/tei:*/tei:monogr/tei:imprint/tei:date[1], false()) ascending return $i - else if(wega:isDiary($coll[1]/string(@xml:id))) then for $i in $coll order by $i/@n cast as xs:date ascending return $i - else if(wega:isWork($coll[1]/string(@xml:id))) then for $i in $coll order by $i//mei:seriesStmt/mei:title[@level='s']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string(@subtype) ascending, $i//mei:altId[@type = 'WeV']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string() ascending return $i - else if(wega:isNews($coll[1]/string(@xml:id))) then for $i in $coll order by $i//tei:publicationStmt/tei:date/xs:dateTime(@when) descending return $i - else if(wega:isBiblio($coll[1]/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:imprint/tei:date, false()) descending return $i +declare function facets:sortColl($coll as document-node()*) as document-node()* { + if(wega:isPerson($coll[1]/*/string(@xml:id))) then for $i in $coll order by $i//tei:persName[@type = 'reg'] ascending return $i + else if(wega:isLetter($coll[1]/*/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:date[parent::tei:dateSender][1], false()) ascending, $i//tei:date[parent::tei:dateSender][1]/@n ascending return $i + else if(wega:isWriting($coll[1]/*/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:sourceDesc/tei:*/tei:monogr/tei:imprint/tei:date[1], false()) ascending return $i + else if(wega:isDiary($coll[1]/*/string(@xml:id))) then for $i in $coll order by $i/*/@n cast as xs:date ascending return $i + else if(wega:isWork($coll[1]/*/string(@xml:id))) then for $i in $coll order by $i//mei:seriesStmt/mei:title[@level='s']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string(@subtype) ascending, $i//mei:altId[@type = 'WeV']/xs:int(@n) ascending, $i//mei:altId[@type = 'WeV']/string() ascending return $i + else if(wega:isNews($coll[1]/*/string(@xml:id))) then for $i in $coll order by $i//tei:publicationStmt/tei:date/xs:dateTime(@when) descending return $i + else if(wega:isBiblio($coll[1]/*/string(@xml:id))) then for $i in $coll order by wega:getOneNormalizedDate($i//tei:imprint/tei:date, false()) descending return $i else $coll }; @@ -372,67 +372,21 @@ declare function facets:updateColl($coll as node()*, $filter as element()) as it return facets:sortColl($newColl) }; -(:~ - : Returns collection (from cache, if possible) DEPRECATED - : - : @author Peter Stadler - : @param $collName - : @param $cacheKey - : @return node* - :) - -(:declare function facets:getOrCreateCollOld($collName as xs:string, $cacheKey as xs:string(\:, $useCache as xs:boolean:\)) as node()* { - let $collPath := wega:getOption($collName) - let $lastModKey := 'lastModDateTime' - let $dateTimeOfCache := cache:get($collName, $lastModKey) - let $collCached := -(\:if($useCache) then:\) cache:get($collName, $cacheKey) (\:else():\) -(\: let $log := util:log-system-out(concat($collName, ': ', count(cache:get($collName, $cacheKey)))):\) - let $predicates := - if(wega:isPerson($cacheKey)) then wega:getOption(concat($collName, 'Pred'), $cacheKey) - else wega:getOption(concat($collName, 'PredIndices')) - let $collPathExists := xmldb:collection-available($collPath) and ($collPath ne '') and ($cacheKey ne '') - let $isSupportedDiary := if($collName eq 'diaries') then $cacheKey eq 'indices' or $cacheKey eq 'A002068' else true() - (\:let $log := if($collPathExists) - then util:log-system-out(concat($collName, ': si')) - else util:log-system-out(concat($collName, ': no')):\) - return if($collPathExists and $isSupportedDiary) - then if(exists($collCached) and $predicates ne '' and not(wega:eXistDbWasUpdatedAfterwards($dateTimeOfCache))) - then - (\:let $log := util:log-system-out(concat('cached: ', $collName)) - return:\) typeswitch($collCached) - case $s as xs:string return () - default return $collCached - else ( -(\: let $log := util:log-system-out(concat('created new: ', $collName)):\) - let $newColl := util:eval(concat('collection("', $collPath, '")', $predicates)) - let $sortedColl := facets:sortColl($newColl) - let $setCache := (cache:put($collName, $lastModKey, current-dateTime()), - if(exists($newColl)) then cache:put($collName, $cacheKey, $sortedColl) - else cache:put($collName, $cacheKey, 'empty')) - let $logMessage := concat('facets:getOrCreateColl(): created collection cache (',$cacheKey,') for ', $collName, ' (', count($newColl), ' items)') - let $logToFile := wega:logToFile('info', $logMessage) - return $sortedColl - ) - else () -};:) - - (:~ : Returns collection (from cache, if possible) : : @author Peter Stadler : @param $collName : @param $cacheKey + : @param $useCache as boolean. true() tries to make use of caches while false() will bypass caches : @return node* :) - -declare function facets:getOrCreateColl($collName as xs:string, $cacheKey as xs:string(:, $useCache as xs:boolean:)) as node()* { +declare function facets:getOrCreateColl($collName as xs:string, $cacheKey as xs:string, $useCache as xs:boolean) as document-node()* { let $lastModKey := 'lastModDateTime' let $dateTimeOfCache := cache:get($collName, $lastModKey) let $collCached := cache:get($collName, $cacheKey) return - if(exists($collCached) and not(wega:eXistDbWasUpdatedAfterwards($dateTimeOfCache))) + if(exists($collCached) and not(wega:eXistDbWasUpdatedAfterwards($dateTimeOfCache)) and $useCache) then typeswitch($collCached) case xs:string return () @@ -449,7 +403,7 @@ declare function facets:getOrCreateColl($collName as xs:string, $cacheKey as xs: }; (:~ - : helper function for facets:getOrCreateColl and search_getResults.xql + : helper function for facets:getOrCreateColl : : @author Peter Stadler : @param $collName @@ -457,13 +411,13 @@ declare function facets:getOrCreateColl($collName as xs:string, $cacheKey as xs: : @return node* :) -declare function facets:createColl($collName as xs:string, $cacheKey as xs:string) as node()* { +declare %private function facets:createColl($collName as xs:string, $cacheKey as xs:string) as document-node()* { let $collPath := wega:getOption($collName) let $collPathExists := xmldb:collection-available($collPath) and ($collPath ne '') and ($cacheKey ne '') let $isSupportedDiary := if($collName eq 'diaries') then $cacheKey eq 'indices' or $cacheKey eq 'A002068' else true() let $predicates := if(wega:isPerson($cacheKey)) then wega:getOption(concat($collName, 'Pred'), $cacheKey) else wega:getOption(concat($collName, 'PredIndices')) - return if ($predicates ne '' and $collPathExists and $isSupportedDiary) then util:eval(concat('collection("', $collPath, '")', $predicates)) else() + return if ($collPathExists and $isSupportedDiary) then util:eval(concat('collection("', $collPath, '")', $predicates)) else() }; (:~ @@ -600,7 +554,7 @@ declare function facets:createChronoList($docType as xs:string, $lang as xs:stri let $datedSessionName := concat('dated', $docType) let $undatedSessionName := concat('undated', $docType) let $yearsSessionName := concat('years', $docType) - let $coll-ids := session:get-attribute($sessionCollName)/@xml:id + let $coll-ids := session:get-attribute($sessionCollName)/*/@xml:id let $normDates := wega:getNormDates($docType) let $undatedKeys := if($docType eq 'diaries') then $normDates//entry[not(./node())][@docID = $coll-ids]/string(@docID) (: Bei keinem Treffer wird der leere String zurückgegeben :) @@ -762,7 +716,7 @@ declare function facets:createAlphabetList($docType as xs:string, $lang as xs:st let $sessionCollName := facets:getCollName($docType, false()) let $coll := session:get-attribute($sessionCollName) let $normDates := wega:getNormDates($docType)//entry - let $persons := $normDates[@docID = $coll/@xml:id] + let $persons := $normDates[@docID = $coll/*/@xml:id] let $countPersons := count($persons) let $savePersons := session:set-attribute($entriesSessionName, $persons) let $saveFromTo := session:set-attribute($fromToSessionName, (1,$countPersons)) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index fc4acd90d..557a67575 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -2862,6 +2862,7 @@ declare function wega:getNormDates($docType as xs:string) as document-node()? { declare function wega:logToFile($priority as xs:string, $message as xs:string) as empty() { let $file := wega:getOption('errorLogFile') let $message := concat($message, ' (rev. ', wega:getCurrentSvnRev(), ')') + let $log := if(wega:getOption('environment') eq 'development') then util:log-system-out($message) else () return util:log-app($priority, $file, $message) }; diff --git a/webapp/xql/modules/xho.xqm b/webapp/xql/modules/xho.xqm index 1610997f4..82c160b91 100644 --- a/webapp/xql/modules/xho.xqm +++ b/webapp/xql/modules/xho.xqm @@ -294,7 +294,7 @@ declare function xho:createWorksDocumentsUL($id as xs:string, $lang as xs:string let $listItems := for $i in ('letters', 'writings', 'diaries', 'works') (: let $log := util:log-system-out($i):) - let $coll := facets:getOrCreateColl($i, $id) + let $coll := facets:getOrCreateColl($i, $id, true()) let $title := wega:getLanguageString(concat($i,'TableTitle'), wega:printFornameSurname($persName), $lang) let $href := if($i eq 'letters') then string-join(($baseHref, $lang, $id, wega:getLanguageString('correspondence', $lang)), '/') @@ -395,7 +395,7 @@ declare function xho:createTabsUL($curDocType as xs:string, $menuID as xs:string else string-join(($baseHref, $lang, wega:getLanguageString($menuNode/pageName, $lang)), '/') let $listItems := for $i in $menuNode/entry - let $coll := facets:getOrCreateColl($i/docType, $menuID) + let $coll := facets:getOrCreateColl($i/docType, $menuID, true()) let $title := wega:getLanguageString($i/displayName, $lang) let $url := string-join(($urlPart1, encode-for-uri($title)), '/') (: let $log := util:log-system-out(string-join(($i/docType, $curDocType), ' ;; ')):) diff --git a/webapp/xql/register.xql b/webapp/xql/register.xql index 82e27d0bf..c8ef9aff2 100644 --- a/webapp/xql/register.xql +++ b/webapp/xql/register.xql @@ -20,7 +20,7 @@ let $docType := request:get-parameter('docType','letters') let $sessionFilterName := facets:getFilterName($docType) let $sessionCollName := facets:getCollName($docType, false()) let $clearFilter := session:remove-attribute($sessionFilterName) -let $coll := facets:getOrCreateColl($docType, $id) +let $coll := facets:getOrCreateColl($docType, $id, true()) let $createSessionColl := session:set-attribute($sessionCollName, $coll) (:let $log := util:log-system-out($docType):) (:let $log := util:log-system-out(count($coll)):) diff --git a/webapp/xql/utilities/createSiteMap.xql b/webapp/xql/utilities/createSiteMap.xql index 208d5eb44..c506bfcfc 100644 --- a/webapp/xql/utilities/createSiteMap.xql +++ b/webapp/xql/utilities/createSiteMap.xql @@ -18,7 +18,7 @@ declare variable $local:standardEntries := ('index', 'search', 'help', 'projectD declare variable $local:databaseEntries := ('persons', 'letters', 'writings', 'diaries', (:'works',:) 'news'(:, 'biblio':)); declare function local:getUrlList($type as xs:string, $lang as xs:string) as item()* { - for $x in facets:getOrCreateColl($type, 'indices')/root() + for $x in facets:getOrCreateColl($type, 'indices', true()) let $lastmod := wega:getLastModifyDateOfDocument(document-uri($x)) let $loc := wega:createLinkToDoc($x, $lang) return From 76a58506a8d3a531c48ee0df168b171f7d5ecc5b Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 19:10:17 +0200 Subject: [PATCH 22/48] fixed XPaths (part 2) --- webapp/xql/functions/search_getResults.xql | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/webapp/xql/functions/search_getResults.xql b/webapp/xql/functions/search_getResults.xql index 8843288be..7668a562c 100644 --- a/webapp/xql/functions/search_getResults.xql +++ b/webapp/xql/functions/search_getResults.xql @@ -17,12 +17,6 @@ declare option exist:serialize "method=xhtml media-type=text/html indent=no omit declare variable $local:docTypesForSearch := ('persons','letters','writings','diaries','works','news','biblio','var'); -(: -declare function local:getCollection($docType as xs:string, $useCache as xs:boolean) as element()* { - if($useCache) then facets:getOrCreateColl($docType,'indices') - else facets:createColl($docType,'indices') -};:) - (:~ : Creates the query-element for a lucene search. For example: : @@ -187,14 +181,14 @@ declare function local:searchForPersName($coll,$query,$docType) { return local:getRootNode($result,$docType) }; -declare function local:searchFullText($coll,$query,$docType) { +declare function local:searchFullText($coll,$query,$docType) as element()* { let $result := - if($docType='persons') then $coll[ft:query(., $query)] | $coll//tei:persName[@type][ft:query(., $query)] + if($docType='persons') then $coll/tei:person[ft:query(., $query)] | $coll//tei:persName[@type][ft:query(., $query)] else if($docType='letters') then $coll//tei:body[ft:query(., $query)] | $coll//tei:correspDesc[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] | $coll//tei:incipit[ft:query(., $query)] | $coll//tei:note[ft:query(.[@type eq 'summary'], $query)] - else if($docType='diaries') then $coll[ft:query(., $query)] + else if($docType='diaries') then $coll/tei:ab[ft:query(., $query)] else if($docType='writings') then $coll//tei:body[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] - else if($docType='works') then $coll[ft:query(., $query)] | $coll//mei:title[ft:query(., $query)] + else if($docType='works') then $coll/mei:mei[ft:query(., $query)] | $coll//mei:title[ft:query(., $query)] else if($docType='news') then $coll//tei:body[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] else if($docType='biblio') then $coll//tei:text[ft:query(., $query)] | $coll//tei:biblStruct[ft:query(., $query)] | $coll//tei:title[ft:query(., $query)] | $coll//tei:author[ft:query(., $query)] | $coll//tei:editor[ft:query(., $query)] else if($docType='var') then collection('/db/var')//tei:body[ft:query(.,$query)] | collection('/db/var')//tei:title[ft:query(.,$query)] @@ -212,8 +206,7 @@ declare function local:searchFullText($coll,$query,$docType) { : @return the resulting sequence of documents :) declare function local:createSearchField($docType,$searchFilter,$query) { - let $coll := (:local:getCollection($docType,false()):) facets:getOrCreateColl($docType, 'indices', false()) - (:let $log := util:log-system-out(concat('#',$query)):) + let $coll := facets:getOrCreateColl($docType, 'indices', false()) return if($searchFilter='fullText') then local:searchFullText($coll,$query,$docType) else if($searchFilter='persName') then local:searchForPersName($coll,$query,$docType) From f6a3ae206f91971345f6227d444480e25a02a902 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 19:10:48 +0200 Subject: [PATCH 23/48] bypassed sorting and creation of new caches for facets:getOrCreateColl() --- webapp/xql/modules/facets.xqm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapp/xql/modules/facets.xqm b/webapp/xql/modules/facets.xqm index cbde6c98d..5c1f12393 100644 --- a/webapp/xql/modules/facets.xqm +++ b/webapp/xql/modules/facets.xqm @@ -378,7 +378,7 @@ declare function facets:updateColl($coll as node()*, $filter as element()) as it : @author Peter Stadler : @param $collName : @param $cacheKey - : @param $useCache as boolean. true() tries to make use of caches while false() will bypass caches + : @param $useCache as boolean. true() tries to make use of caches while false() will bypass caches. false() will also avoid sorting and creation of new caches : @return node* :) declare function facets:getOrCreateColl($collName as xs:string, $cacheKey as xs:string, $useCache as xs:boolean) as document-node()* { @@ -386,12 +386,11 @@ declare function facets:getOrCreateColl($collName as xs:string, $cacheKey as xs: let $dateTimeOfCache := cache:get($collName, $lastModKey) let $collCached := cache:get($collName, $cacheKey) return - if(exists($collCached) and not(wega:eXistDbWasUpdatedAfterwards($dateTimeOfCache)) and $useCache) - then + if(exists($collCached) and not(wega:eXistDbWasUpdatedAfterwards($dateTimeOfCache)) and $useCache) then typeswitch($collCached) case xs:string return () default return $collCached - else + else if($useCache) then let $newColl := facets:createColl($collName,$cacheKey) let $sortedColl := facets:sortColl($newColl) let $setCache := (cache:put($collName, $lastModKey, current-dateTime()), @@ -400,6 +399,7 @@ declare function facets:getOrCreateColl($collName as xs:string, $cacheKey as xs: let $logMessage := concat('facets:getOrCreateColl(): created collection cache (',$cacheKey,') for ', $collName, ' (', count($newColl), ' items)') let $logToFile := wega:logToFile('info', $logMessage) return $sortedColl + else facets:createColl($collName,$cacheKey) }; (:~ From 7f1a6e8e994def929dcc43c188735645fe7386c9 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 8 Aug 2013 19:41:41 +0200 Subject: [PATCH 24/48] minor fix --- webapp/xql/functions/search_getResults.xql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/xql/functions/search_getResults.xql b/webapp/xql/functions/search_getResults.xql index 7668a562c..0ab16d254 100644 --- a/webapp/xql/functions/search_getResults.xql +++ b/webapp/xql/functions/search_getResults.xql @@ -285,7 +285,7 @@ declare function local:intersectOtherResults($result, $docType, $searchFilter, $ :) declare function local:getResults($docType as xs:string) as element()* { - if(request:get-parameter('searchString','') eq '') then facets:getOrCreateColl($docType, 'indices', true()) + if(request:get-parameter('searchString','') eq '') then facets:getOrCreateColl($docType, 'indices', true())/* else let $result := local:intersectLuceneResults((), $docType, 'fullText', local:buildQuery(request:get-parameter('fullText',''),'fullText')) let $result := local:intersectLuceneResults($result, $docType, 'persName', local:buildQuery(request:get-parameter('persName',''),'persName')) From a590ecf1b60e406b089adf86e3125ec5dd0181c4 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Fri, 9 Aug 2013 15:13:03 +0200 Subject: [PATCH 25/48] small fix to supress our own beacon link --- webapp/xql/modules/ajax.xqm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index d1797ef82..104d45594 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -427,7 +427,7 @@ declare function ajax:getPNDBeacons($pnd as xs:string, $name as xs:string, $lang let $title := normalize-space($jxml/item[3]/item[$i]) let $text := normalize-space($jxml/item[2]/item[$i]) return - if(starts-with($link,"weber-gesamtausgabe.de")) then () + if(matches($link,"weber-gesamtausgabe.de")) then () else
    • {$text}
    • }
    From b3a6025b9a174b4e662b4d2b73c83797af1e3ab8 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Fri, 9 Aug 2013 17:11:47 +0200 Subject: [PATCH 26/48] news teaser now cut off at word boundary --- webapp/xql/index.xql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/xql/index.xql b/webapp/xql/index.xql index cfac959dc..fb21570e9 100644 --- a/webapp/xql/index.xql +++ b/webapp/xql/index.xql @@ -35,8 +35,8 @@ declare function local:createNewsTeaser($news as document-node(), $lang as xs:st } }, element p { - substring($news//tei:body, 1, 400), - ' … ', + wega:printPreview(string($news//tei:body), 400), + ' ', element a{ attribute href {wega:createLinkToDoc($news, $lang)}, attribute title {wega:getLanguageString('more', $lang)}, From c18b326f26005b8377c0c27e90f400879e836c4e Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 12 Aug 2013 16:09:43 +0200 Subject: [PATCH 27/48] small fix --- webapp/xql/modules/facets.xqm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapp/xql/modules/facets.xqm b/webapp/xql/modules/facets.xqm index 5c1f12393..6beca3ae7 100644 --- a/webapp/xql/modules/facets.xqm +++ b/webapp/xql/modules/facets.xqm @@ -669,7 +669,7 @@ declare function facets:getSeries($docType as xs:string, $lang as xs:string) as let $sessionCollName := facets:getCollName($docType, false()) let $coll := session:get-attribute($sessionCollName) let $distinctSeries := facets:getDistinctSeries($coll) - let $collIDs := $coll/string(@xml:id) + let $collIDs := $coll/*/string(@xml:id) let $activeIDs := wega:getNormDates('works')//entry[@docID=$collIDs]/string(@docID) let $docType := 'works' let $category := 'series' @@ -677,8 +677,8 @@ declare function facets:getSeries($docType as xs:string, $lang as xs:string) as

    {wega:getLanguageString('series', $lang)}

      { - for $i in $distinctSeries - let $seriesNo := $i/@n + for $mei-title in $distinctSeries + let $seriesNo := $mei-title/@n let $firstDoc := facets:getFirstOrLastDocumentInSeries($collIDs, xs:int($seriesNo), true()) let $lastDoc := facets:getFirstOrLastDocumentInSeries($collIDs, xs:int($seriesNo), false()) let $startPosition := index-of($activeIDs,$firstDoc) @@ -694,7 +694,7 @@ declare function facets:getSeries($docType as xs:string, $lang as xs:string) as }, element span { attribute class {'seriesTitle'}, - string($i) + string($mei-title) } } } From 2de20241fdcf0ff92aa21029afe91899633b3076 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 13 Aug 2013 16:17:04 +0200 Subject: [PATCH 28/48] fix for wrong wikipedia url --- webapp/xql/modules/ajax.xqm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index 104d45594..5a2c610c9 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -309,7 +309,7 @@ declare function ajax:getWikipedia($pnd as xs:string, $lang as xs:string) as ele let $pnd := request:get-parameter('pnd','118629662') let $lang := request:get-parameter('lang', 'de') let $wikiContent := wega:grabExternalResource('wikipedia', $pnd, $lang, true()) - let $wikiUrl := $wikiContent//xhtml:div[@class eq 'printfooter']/xhtml:a[1]/@href + let $wikiUrl := $wikiContent//xhtml:div[@class eq 'printfooter']/xhtml:a[1]/data(@href) let $xslParams := let $name := normalize-space($wikiContent//xhtml:h1[@id = 'firstHeading']) let $appendix := if($lang eq 'en') then @@ -352,7 +352,6 @@ declare function ajax:getADB($pnd as xs:string, $lang as xs:string) as element() let $pnd := request:get-parameter('pnd','118629662') let $lang := request:get-parameter('lang', 'de') let $wikiContent := wega:grabExternalResource('adb', $pnd, (), true()) - let $wikiUrl := $wikiContent//xhtml:div[@id = 'adbcite']/xhtml:a[2]/@href let $xslParams := let $name := normalize-space($wikiContent//xhtml:h1[@id = 'firstHeading']) let $appendix := transform:transform($wikiContent//xhtml:div[@id='adbcite'], doc('/db/webapp/xsl/person_wikipedia.xsl'), ) From d24f8f057d900ca7ebd76dd8983d6cbd2fee2f92 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 13 Aug 2013 16:35:40 +0200 Subject: [PATCH 29/48] added template for headlines; closes #14 --- webapp/xsl/person_wikipedia.xsl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/webapp/xsl/person_wikipedia.xsl b/webapp/xsl/person_wikipedia.xsl index 30b9c94f7..3564fd160 100644 --- a/webapp/xsl/person_wikipedia.xsl +++ b/webapp/xsl/person_wikipedia.xsl @@ -130,8 +130,7 @@ - + @@ -176,6 +175,12 @@ + + + + + + From 1602a3376810c6d17af70f9955a1d01b571c64d0 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 13 Aug 2013 18:50:08 +0200 Subject: [PATCH 30/48] revised wega:getTodaysEvents() It's now fast enough to do without caching --- webapp/css/index.css | 6 +- webapp/xql/modules/ajax.xqm | 114 +++++++++++++----------------------- webapp/xql/modules/wega.xqm | 36 ++++-------- 3 files changed, 56 insertions(+), 100 deletions(-) diff --git a/webapp/css/index.css b/webapp/css/index.css index d3cfb9946..2e104619b 100644 --- a/webapp/css/index.css +++ b/webapp/css/index.css @@ -82,4 +82,8 @@ p { background-color: #AAA; border: none; margin: 1pc auto; -} \ No newline at end of file +} + +.jubilee { + list-style-image:url('../pix/stern_gelb.gif'); +} diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index 5a2c610c9..4dbc6ab7d 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -25,90 +25,58 @@ import module namespace wega="http://xquery.weber-gesamtausgabe.de/webapp/xql/mo import module namespace facets="http://xquery.weber-gesamtausgabe.de/webapp/xql/modules/facets" at "xmldb:exist:///db/webapp/xql/modules/facets.xqm"; (:~ - : Creates HTML list entry + : Creates HTML list for todays events : (function for index.xql) : + : @author Peter Stadler : @author Christian Epp - : @param $type of entry - : @param $persName - : @param $letter - : @param $sender - : @param $addressee - : @param $entryYear - : @param $date + : @param $date todays date : @param $lang the current language (de|en) : @return element :) - -declare function ajax:createHtmlListEntry($type,$persName,$letter,$sender,$addressee,$entryYear,$date,$lang) { - let $isRound := (year-from-date($date) - $entryYear) mod 25 = 0 - let $formatedYear := {wega:formatYear($entryYear cast as xs:int, $lang)} - let $content := - if($type eq 'letter') then ($formatedYear, ': ', $sender, ' ', wega:getLanguageString('writesTo', $lang), ' ', $addressee, - if(ends-with($addressee, '.')) then ' ' else '. ', wega:createDocLink($letter, - concat('[', wega:getLanguageString('readOnLetter', $lang), ']'), $lang, ('class=readOn', 'foo=bar'))) - else if($type eq 'birth') then ($formatedYear, ': ', $persName, ' ', wega:getLanguageString('isBorn', $lang)) - else if($type eq 'baptism') then ($formatedYear, ': ', $persName, ' ', wega:getLanguageString('isBaptised', $lang)) - else if($type eq 'death') then ($formatedYear, ': ', $persName, ' ', wega:getLanguageString('dies', $lang)) - else if($type eq 'funeral') then ($formatedYear, ': ', $persName, ' ', wega:getLanguageString('wasBuried', $lang)) - else() - let $class := - if($type eq 'letter') then "eventLetter" - else if($type eq 'birth' or $type eq 'baptism') then "eventBirth" - else if($type eq 'death' or $type eq 'funeral') then "eventDeath" - else () - return - if($isRound) - then
    • {$content}
    • - else
    • {$content}
    • + +declare function ajax:getTodaysEvents($date as xs:date, $lang as xs:string) as element(ul) { +
        { + for $teiDate in wega:getTodaysEvents($date) + let $isJubilee := (year-from-date($date) - $teiDate/year-from-date(@when)) mod 25 = 0 + let $typeOfEvent := + if($teiDate/ancestor::tei:correspDesc) then 'letter' + else if($teiDate/parent::tei:birth[@type='baptism']) then 'isBaptised' + else if($teiDate/parent::tei:birth) then 'isBorn' + else if($teiDate/parent::tei:death[@type='funeral']) then 'wasBuried' + else if($teiDate/parent::tei:death) then 'dies' + else () + order by $teiDate/xs:date(@when) ascending + return + element li { + if($isJubilee) then ( + attribute class {'jubilee'}, + attribute title {wega:getLanguageString('roundYearsAgo',xs:string(year-from-date($date) - $teiDate/year-from-date(@when)), $lang)} + ) + else (), + concat(wega:formatYear($teiDate/year-from-date(@when) cast as xs:int, $lang), ': '), + if($typeOfEvent eq 'letter') then ajax:createLetterLink($teiDate, $lang) + else (wega:createPersonLink($teiDate/root()/*/string(@xml:id), $lang, 'fs'), ' ', wega:getLanguageString($typeOfEvent, $lang)) + } + }
      }; (:~ - : Creates HTML list for todays events - : (function for index.xql) + : Helper function for ajax:createHtmlList : : @author Peter Stadler - : @author Christian Epp - : @param $date todays date - : @param $lang the current language (de|en) - : @return element :) - -declare function ajax:createHtmlList($date as xs:date, $lang as xs:string) as element() { -
        { - for $entry in wega:getTodaysEvents($date)//entry - let $personID := if($entry/@type eq 'birth' or $entry/@type eq 'baptism' or $entry/@type eq 'death' or $entry/@type eq 'funeral') - then data($entry/@id) - else() - let $persName := if($entry/@type eq 'birth' or $entry/@type eq 'baptism' or $entry/@type eq 'death' or $entry/@type eq 'funeral') - then wega:createPersonLink($personID, $lang, 'fs') - else () - let $letter := if($entry/@type eq 'letter') - then wega:doc($entry/@id) - else() - let $senderID := if($entry/@type eq 'letter') - then $letter//tei:sender[1]/tei:persName/@key - else() - let $addresseeID := if($entry/@type eq 'letter') - then $letter//tei:addressee[1]/tei:persName/@key - else() - let $sender := if($entry/@type eq 'letter') - then wega:printCorrespondentName($letter//tei:sender[1]/*[1], $lang, 'fs') - else if (exists($letter//tei:sender/tei:persName/text())) - then {data($letter//tei:sender/tei:persName)} - else {wega:getLanguageString('unknown',$lang)} - let $addressee := if($entry/@type eq 'letter') - then wega:printCorrespondentName($letter//tei:addressee[1]/*[1], $lang, 'fs') - else if (exists($letter//tei:addressee/tei:persName/text())) - then {data($letter//tei:addressee/tei:persName)} - else {wega:getLanguageString('unknown',$lang)} - order by $entry/number(@year) ascending - return - ajax:createHtmlListEntry($entry/@type,$persName,$letter,$sender,$addressee,$entry/@year,$date,$lang) - } -
      +declare %private function ajax:createLetterLink($teiDate as element(tei:date)?, $lang as xs:string) as item()* { + let $sender := wega:printCorrespondentName($teiDate/ancestor::tei:correspDesc/tei:sender[1]/*[1], $lang, 'fs') + let $addressee := wega:printCorrespondentName($teiDate/ancestor::tei:correspDesc/tei:addressee[1]/*[1], $lang, 'fs') + return ( + $sender, ' ', wega:getLanguageString('writesTo', $lang), ' ', $addressee, + if(ends-with($addressee, '.')) then ' ' else '. ', + wega:createDocLink($teiDate/root(), concat('[', wega:getLanguageString('readOnLetter', $lang), ']'), $lang, ('class=readOn')) + ) }; + (:~ : Returns a list of the todays events : (function for index.xql) @@ -119,16 +87,16 @@ declare function ajax:createHtmlList($date as xs:date, $lang as xs:string) as el : @return element :) -declare function ajax:getTodaysEvents($date as xs:date?,$lang as xs:string) as document-node() { +(:declare function ajax:getTodaysEvents($date as xs:date?,$lang as xs:string) as document-node() { let $date := if(exists($date)) then $date else util:system-date() let $tmpDir := wega:getOption('tmpDir') let $todaysEventsFileName := concat('todaysEventsFile_', $lang, '.xml') let $todaysEventsFile := doc(concat($tmpDir, $todaysEventsFileName)) return - if(xs:date($date) eq $todaysEventsFile/ul/xs:date(@class) and xmldb:last-modified($tmpDir, $todaysEventsFileName) gt wega:getDateTimeOfLastDBUpdate()) then $todaysEventsFile + if(xs:date($date) eq $todaysEventsFile/ul/xs:date(@class) and xmldb:last-modified($tmpDir, $todaysEventsFileName) gt wega:getDateTimeOfLastDBUpdate() and false()) then $todaysEventsFile else doc(xmldb:store($tmpDir, concat('todaysEventsFile_', $lang, '.xml'), ajax:createHtmlList($date, $lang))) }; - +:) (:~ : Returns correspondents by a person : (functions for person_singleView.xql) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 557a67575..2c4d4af3c 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1337,37 +1337,21 @@ declare function wega:getWorkMetaData($doc as document-node(), $lang as xs:strin ) }; -(:~ - : Hilfsfunktion für wega:getTodaysEvents() - : @author Christian Epp - : @param $i single document - : @param $type - : @return node - :) - -declare function wega:getTodaysEventsEntry($i,$type) as node()? { - -}; - (:~ : Gets events of the day for a certain date : : @author Peter Stadler : @param $date todays date - : @return HTML node - :) - -declare function wega:getTodaysEvents($date as xs:date) as node()? { - let $day := day-from-date($date) - let $month := month-from-date($date) - let $letter := collection(wega:getOption('letters'))//tei:dateSender/tei:date[@when castable as xs:date][day-from-date(@when) eq $day][month-from-date(@when) eq $month] - let $birth := collection(wega:getOption('persons'))//tei:birth/tei:date[@when castable as xs:date][day-from-date(@when) eq $day ][ month-from-date(@when) eq $month] - let $death := collection(wega:getOption('persons'))//tei:death/tei:date[@when castable as xs:date][day-from-date(@when) eq $day ][ month-from-date(@when) eq $month] - return - {for $i in $letter return wega:getTodaysEventsEntry($i,'letter')} - {for $i in $birth return wega:getTodaysEventsEntry($i,if($i/@type eq 'baptism') then 'baptism' else 'birth')} - {for $i in $death return wega:getTodaysEventsEntry($i,if($i/@type eq 'funeral') then 'funeral' else 'death')} - + : @return tei:date* tei:date elements that match given day and month of $date + :) + +declare function wega:getTodaysEvents($date as xs:date) as element(tei:date)* { + let $day := functx:pad-integer-to-length(day-from-date($date), 2) + let $month := functx:pad-integer-to-length(month-from-date($date), 2) + let $date-regex := concat('^', string-join(('\d{4}',$month,$day),'-'), '$') + return + collection(wega:getOption('letters'))//tei:dateSender/tei:date[matches(@when, $date-regex)] union + collection(wega:getOption('persons'))//tei:date[matches(@when, $date-regex)][parent::tei:birth or parent::tei:death] }; (:~ From 06924e9cf5e25dc70c17ce272b9345edce661131 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 13 Aug 2013 21:47:35 +0200 Subject: [PATCH 31/48] fixed and improved search for invalid ids and duplicate pnds --- webapp/xql/modules/dev.xqm | 41 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/webapp/xql/modules/dev.xqm b/webapp/xql/modules/dev.xqm index 445d4a6bf..6546d4cb1 100644 --- a/webapp/xql/modules/dev.xqm +++ b/webapp/xql/modules/dev.xqm @@ -20,6 +20,7 @@ declare namespace util="http://exist-db.org/xquery/util"; declare namespace request="http://exist-db.org/xquery/request"; import module namespace functx="http://www.functx.com" at "xmldb:exist:///db/webapp/xql/modules/functx.xqm"; import module namespace wega="http://xquery.weber-gesamtausgabe.de/webapp/xql/modules/wega" at "xmldb:exist:///db/webapp/xql/modules/wega.xqm"; +import module namespace facets="http://xquery.weber-gesamtausgabe.de/webapp/xql/modules/facets" at "xmldb:exist:///db/webapp/xql/modules/facets.xqm"; (:~ : Show tools tab @@ -116,14 +117,10 @@ declare function dev:createNewID($docType as xs:string) as xs:string { let $IDFile := if(not(doc-available(concat($tmpDir, $IDFileName)))) then doc(xmldb:store($tmpDir, $IDFileName, )) else doc(concat($tmpDir, $IDFileName)) - let $coll1 := collection(wega:getOption($docType))/*/@xml:id + let $coll1 := collection(wega:getOption($docType))/*/data(@xml:id) (: facets:getOrCreateColl() geht nicht, da hier auch die Dubletten mit berücksichtigt werden müssen! :) let $coll2 := $IDFile//entry/substring(@xml:id, 2) let $removeOldTempIDS := dev:removeOldEntries($IDFile) - let $maxID := - let $maxTemp := count($coll1) + count($coll2) + 200 - return - if ($docType eq 'persons') then max(($maxTemp,9000)) - else $maxTemp + let $maxID := count($coll1) + count($coll2) + 200 let $newID := if ($maxID lt 9999) then dev:addFffiEntry($IDFile, concat('_', dev:getNewID($maxID, $coll1, $coll2))) else '_kein Eintrag verfügbar' @@ -139,24 +136,27 @@ declare function dev:createNewID($docType as xs:string) as xs:string { : @return element :) -declare function dev:validateIDs($docType as xs:string) as element() { - let $goodKeys := util:eval(concat('collection("', wega:getOption($docType), '")', wega:getOption(concat($docType, 'PredIndices')), '/data(@xml:id)')) - let $duplicateKeys := util:eval(concat('collection("', wega:getOption($docType), '")', replace(wega:getOption(concat($docType, 'PredIndices')), '\[not\((.+)\)\]', '[$1]'), '/data(@xml:id)')) +declare function dev:validateIDs($docType as xs:string) as element(div) { + let $goodKeys := facets:getOrCreateColl($docType, 'indices', true())(:/*/data(@xml:id):) let $col := collection('/db') let $elements := - if($docType eq 'persons') then ($col//tei:persName/@key | $col//tei:rs[matches(@type,'person')]/@key | $col//mei:persName/@dbkey) - else if($docType eq 'letters') then ($col//tei:rs[matches(@type,'letter')]/@key) - else if($docType eq 'works') then ($col//tei:workName/@key | $col//tei:rs[matches(@type,'work')]/@key) + if($docType eq 'persons') then ($col//tei:persName[@key] | $col//tei:editor[@key] | $col//tei:author[@key] | $col//tei:rs[matches(@type,'person')][@key] | $col//mei:persName[@dbkey]) + else if($docType eq 'letters') then ($col//tei:rs[matches(@type,'letter')][@key]) + else if($docType eq 'works') then ($col//tei:workName[@key] | $col//tei:rs[matches(@type,'work')][@key]) + else if($docType eq 'diaries') then ($col//tei:rs[matches(@type,'diary')][@key]) + else if($docType eq 'news') then ($col//tei:rs[matches(@type,'news')][@key]) + else if($docType eq 'writings') then ($col//tei:rs[matches(@type,'writing')][@key]) else () (: return element div {count(distinct-values($elements))}:) return element div { - for $element in distinct-values($elements) + for $element in distinct-values($elements/@key | $elements/@dbkey) for $key in tokenize($element, '\s') return ( - if ($key = $goodKeys) then () - else(let $docIDs := $elements[. = $element]/root()/*/@xml:id | $elements[. = $key]/root()/*/@xml:id + if ($goodKeys//id($key)) then () + else ( + let $docIDs := $elements[matches(@key, $element)]/root()/*/@xml:id | $elements[matches(@dbkey, $element)]/root()/*/@xml:id return element li {concat('Falscher Key: ', $key, ' (in: ', string-join($docIDs, ', '), ')')}) ) } @@ -170,14 +170,13 @@ declare function dev:validateIDs($docType as xs:string) as element() { : @return element :) -declare function dev:validatePNDs($docType as xs:string) as element() { - let $pnds := collection(wega:getOption('persons'))//tei:idno[@type='gnd'] +declare function dev:validatePNDs($docType as xs:string) as element(div) { + let $coll := facets:getOrCreateColl('persons', 'indices', true()) return element div { - for $pnd in distinct-values($pnds) + for $pnd in distinct-values($coll//tei:idno[@type='gnd']) return ( - if (count($pnds[. = $pnd]) gt 1) then ( -(: let $docIDs := $elements[. = $element]/root()/*/@xml:id | $elements[. = $key]/root()/*/@xml:id :) - element li {concat('Doppelte PND: ', $pnd(:, ' (in: ', string-join($docIDs, ', '), ')':))} + if ($coll//tei:idno[. = $pnd][@type='gnd'][2]) then ( + element li {concat('Doppelte PND: ', $pnd)} ) else() ) From 718a72604d0d9b79c6db2c1c2b0dc7a3667f76bf Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 14 Aug 2013 17:21:18 +0200 Subject: [PATCH 32/48] deactivated rsh for register.xql --- webapp/xql/register.xql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/xql/register.xql b/webapp/xql/register.xql index c8ef9aff2..ffada97cd 100644 --- a/webapp/xql/register.xql +++ b/webapp/xql/register.xql @@ -45,9 +45,9 @@ let $domLoaded := scrollToTop - + let $additionalJScripts := @@ -59,7 +59,7 @@ let $additionalJScripts := return - {xho:createHtmlHead('listView.css', ('list_functions.js', 'infinite_scroll.js', 'rsh_functions.js', 'rsh.js'), xho:collectMetaData($docType, $id, $lang), $domLoaded, $additionalJScripts)} + {xho:createHtmlHead('listView.css', ('list_functions.js', 'infinite_scroll.js'(:, 'rsh_functions.js', 'rsh.js':)), xho:collectMetaData($docType, $id, $lang), $domLoaded, $additionalJScripts)}
      {xho:createHeadContainer($lang)} From f7628d7dd3d92b720b3e959abc355b99f4222af9 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 15 Aug 2013 14:52:14 +0200 Subject: [PATCH 33/48] fix for diary ids not showing up --- webapp/xql/modules/wega.xqm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 2c4d4af3c..054bfe76e 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -982,7 +982,7 @@ declare function wega:getDiaryMetaData($doc as document-node(), $lang as xs:stri else '%A, %d. %B %Y' let $xslParams := let $date := xs:date($diaryEntry/@n) - let $id := $diaryEntry//tei:ab/@xml:id + let $id := $diaryEntry/@xml:id return ( element div { From 5c1ed3c11642259d7c8157c70e496944c143070f Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Fri, 16 Aug 2013 16:08:24 +0200 Subject: [PATCH 34/48] removed another RSH component, cf. 718a72604d0d9b79c6db2c1c2b0dc7a3667f76bf --- webapp/xql/register.xql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/xql/register.xql b/webapp/xql/register.xql index ffada97cd..6d29bc331 100644 --- a/webapp/xql/register.xql +++ b/webapp/xql/register.xql @@ -49,12 +49,12 @@ let $domLoaded := initializeRSH --> -let $additionalJScripts := - +let $additionalJScripts := () + (: create_RSH - + :) return From 13e819cf495d692995b6fc3bbdb0c581499247c0 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 19 Aug 2013 21:38:24 +0200 Subject: [PATCH 35/48] hanged from httpclient xquery module to the expath http client --- webapp/xql/modules/ajax.xqm | 3 ++- webapp/xql/modules/wega.xqm | 41 ++++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/webapp/xql/modules/ajax.xqm b/webapp/xql/modules/ajax.xqm index 4dbc6ab7d..2fbb7c1f5 100644 --- a/webapp/xql/modules/ajax.xqm +++ b/webapp/xql/modules/ajax.xqm @@ -383,7 +383,8 @@ declare function ajax:getDNB($pnd as xs:string, $lang as xs:string) as element(d :) declare function ajax:getPNDBeacons($pnd as xs:string, $name as xs:string, $lang as xs:string) as element(div) { - let $findbuchResponse := util:binary-to-string(wega:grabExternalResource('beacon', $pnd, (), true())) + let $findbuchResponse := wega:grabExternalResource('beacon', $pnd, (), true()) + (:util:binary-to-string(wega:grabExternalResource('beacon', $pnd, (), true())):) let $jxml := if(exists($findbuchResponse)) then xqjson:parse-json($findbuchResponse) else () diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 054bfe76e..58f06f816 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1,4 +1,4 @@ -xquery version "1.0" encoding "UTF-8"; +xquery version "3.0" encoding "UTF-8"; (:~ : Collected xQuery functions @@ -21,6 +21,7 @@ declare namespace cache = "http://exist-db.org/xquery/cache"; declare namespace util = "http://exist-db.org/xquery/util"; declare namespace httpclient = "http://exist-db.org/xquery/httpclient"; import module namespace functx="http://www.functx.com" at "xmldb:exist:///db/webapp/xql/modules/functx.xqm"; +import module namespace http = "http://expath.org/ns/http-client"; declare variable $wega:optionsFile as xs:string := '/db/webapp/xml/wegaOptions.xml'; declare variable $wega:romanNums as xs:integer* := (1000,900,500,400,100,90,50,40,10,9,5,4,1); @@ -1734,8 +1735,7 @@ declare function wega:printSourceDesc($doc as document-node(), $lang as xs:strin : @param $useCache use cached version or force a reload of the external resource : @return node :) - -declare function wega:grabExternalResource($resource as xs:string, $pnd as xs:string, $lang as xs:string?, $useCache as xs:boolean) as element(httpclient:response)? { + declare function wega:grabExternalResource($resource as xs:string, $pnd as xs:string, $lang as xs:string?, $useCache as xs:boolean) as element(httpclient:response)? { let $serverURL := if($resource eq 'wikipedia') then concat(wega:getOption($resource), $lang, '/') else wega:getOption($resource) @@ -1748,7 +1748,7 @@ declare function wega:grabExternalResource($resource as xs:string, $pnd as xs:st $cachedResource/httpclient:response ) else - let $responseOrg := httpclient:get(xs:anyURI(concat($serverURL, $pnd)),true(), ()) + (:let $responseOrg := httpclient:get(xs:anyURI(concat($serverURL, $pnd)),true(), ()) let $modifiedResponse := if($responseOrg/httpclient:body[matches(@mimetype,"text/html")]) then wega:changeNamespace($responseOrg,'http://www.w3.org/1999/xhtml', 'http://exist-db.org/xquery/httpclient') else $responseOrg @@ -1757,12 +1757,43 @@ declare function wega:grabExternalResource($resource as xs:string, $pnd as xs:st {$modifiedResponse} let $storeFile := wega:storeFileInTmpCollection($resource, $fileName, $responseFrame) - return $modifiedResponse + return $modifiedResponse:) + let $update := wega:http-get(xs:anyURI(concat($serverURL, $pnd))) + let $storeFile := wega:storeFileInTmpCollection($resource, $fileName, $update) + return $update/httpclient:response return if($response/@statusCode eq '200') then $response else () }; + +(:~ + : Helper function for wega:grabExternalResource() + : + : @author Peter Stadler + : @param $url the URL as xs:anyURI + : @return element wega:externalResource, a wrapper around httpclient:response + :) +declare %private function wega:http-get($url as xs:anyURI) as element(wega:externalResource) { + let $req := + let $response := + try { http:send-request($req) } + catch * {wega:logToFile('error', string-join(('wega:http-get', $err:code, $err:description), ' ;; '))} + let $statusCode := $response[1]/data(@status) + return + + + { + for $header in $response[1]//http:header + return element httpclient:header {$header/@*} + } + + {$response[2]} + + + +}; + (:~ : Store some content as file in the webapp tmp collection : From f398460f6652192887a5d3cd93512d65a7de35e6 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 20 Aug 2013 17:11:30 +0200 Subject: [PATCH 36/48] fixes issue with missing whitespace --- webapp/xql/modules/wega.xqm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 58f06f816..ff72454ec 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -152,7 +152,7 @@ declare function wega:printDate($date as element(tei:date)?, $lang as xs:string) : @return element :) -declare function wega:printDatesOfBirthOrDeath($birthOrDeath as element(), $lang as xs:string) as element()* { +declare function wega:printDatesOfBirthOrDeath($birthOrDeath as element(), $lang as xs:string) as element(p)+ { let $place := wega:printPlaceOfBirthOrDeath($birthOrDeath/tei:placeName, $lang) return if(exists($birthOrDeath/tei:date/@*[name() != 'cert'])) then (: leere ausschliessen :) @@ -172,7 +172,7 @@ declare function wega:printDatesOfBirthOrDeath($birthOrDeath as element(), $lang ) return wega:datesOfBirthOrDeathTemplate($myType, $content, $lang) else - let $content := ($place, ({wega:getLanguageString('dateUnknown',$lang)})) + let $content := ($place, ' ', ({wega:getLanguageString('dateUnknown',$lang)})) return wega:datesOfBirthOrDeathTemplate($birthOrDeath/local-name(), $content, $lang) }; @@ -186,7 +186,7 @@ declare function wega:printDatesOfBirthOrDeath($birthOrDeath as element(), $lang : @return (html) element p :) -declare function wega:datesOfBirthOrDeathTemplate($myType as xs:string, $content as item()*, $lang as xs:string) as element() { +declare function wega:datesOfBirthOrDeathTemplate($myType as xs:string, $content as item()*, $lang as xs:string) as element(p) { let $html_pixDir := wega:getOption('html_pixDir') let $baseHref := wega:getOption('baseHref') let $iconPath := string-join(($baseHref, $html_pixDir, concat($myType,'.png')), '/') From be34d33e0e5bcaccf1987a8f117601f821b8b699 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 20 Aug 2013 18:18:30 +0200 Subject: [PATCH 37/48] added default rule for tei:date to avoid trailing whitespace --- webapp/xsl/common_main.xsl | 9 +++++++++ webapp/xsl/doc_text.xsl | 2 +- webapp/xsl/letter_text.xsl | 2 +- webapp/xsl/news.xsl | 2 +- webapp/xsl/person_singleView.xsl | 2 +- webapp/xsl/var.xsl | 2 +- 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/webapp/xsl/common_main.xsl b/webapp/xsl/common_main.xsl index 1441a4cf1..afa55933d 100644 --- a/webapp/xsl/common_main.xsl +++ b/webapp/xsl/common_main.xsl @@ -1009,5 +1009,14 @@ + + + + + + + + + diff --git a/webapp/xsl/doc_text.xsl b/webapp/xsl/doc_text.xsl index 8e3b26568..d8719cf6c 100644 --- a/webapp/xsl/doc_text.xsl +++ b/webapp/xsl/doc_text.xsl @@ -8,7 +8,7 @@ + elements="tei:item tei:cell tei:p tei:dateline tei:closer tei:opener tei:hi tei:persName tei:rs tei:workName tei:characterName tei:placeName tei:seg tei:footnote tei:head tei:date"/> diff --git a/webapp/xsl/letter_text.xsl b/webapp/xsl/letter_text.xsl index 32974ec24..b1a824119 100644 --- a/webapp/xsl/letter_text.xsl +++ b/webapp/xsl/letter_text.xsl @@ -7,7 +7,7 @@ + elements="tei:item tei:cell tei:p tei:dateline tei:closer tei:opener tei:hi tei:addrLine tei:persName tei:rs tei:workName tei:characterName tei:placeName tei:seg tei:l tei:head tei:salute tei:date"/> diff --git a/webapp/xsl/news.xsl b/webapp/xsl/news.xsl index 4d2797c8e..0a494bdbf 100644 --- a/webapp/xsl/news.xsl +++ b/webapp/xsl/news.xsl @@ -6,7 +6,7 @@ + elements="tei:item tei:cell tei:p tei:dateline tei:closer tei:opener tei:hi tei:persName tei:rs tei:workName tei:characterName tei:placeName tei:seg tei:head tei:date"/> diff --git a/webapp/xsl/person_singleView.xsl b/webapp/xsl/person_singleView.xsl index a096ba653..ec4ddd9e2 100644 --- a/webapp/xsl/person_singleView.xsl +++ b/webapp/xsl/person_singleView.xsl @@ -7,7 +7,7 @@ + elements="tei:item tei:cell tei:hi tei:persName tei:rs tei:workName tei:characterName tei:placeName tei:head tei:date"/> diff --git a/webapp/xsl/var.xsl b/webapp/xsl/var.xsl index f4416ba9d..e7781f3dc 100644 --- a/webapp/xsl/var.xsl +++ b/webapp/xsl/var.xsl @@ -10,7 +10,7 @@ + elements="tei:cell tei:p tei:hi tei:persName tei:rs tei:workName tei:characterName tei:placeName tei:code tei:eg tei:item tei:head tei:date"/> From e78f389ec16e73acf7723cb7e9bfe71cb489a657 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 21 Aug 2013 12:50:09 +0200 Subject: [PATCH 38/48] augmented http request timeout slightly due to increased errors --- webapp/xql/modules/wega.xqm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index ff72454ec..628064a66 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1775,7 +1775,7 @@ declare function wega:printSourceDesc($doc as document-node(), $lang as xs:strin : @return element wega:externalResource, a wrapper around httpclient:response :) declare %private function wega:http-get($url as xs:anyURI) as element(wega:externalResource) { - let $req := + let $req := let $response := try { http:send-request($req) } catch * {wega:logToFile('error', string-join(('wega:http-get', $err:code, $err:description), ' ;; '))} From 0133759f946fbcbc67482e20219229a83c156887 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 21 Aug 2013 12:50:58 +0200 Subject: [PATCH 39/48] made the retrieval of wikimedia images more robust --- webapp/xql/modules/wega.xqm | 51 ++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 628064a66..aaef72ca1 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1778,7 +1778,7 @@ declare %private function wega:http-get($url as xs:anyURI) as element(wega:exter let $req := let $response := try { http:send-request($req) } - catch * {wega:logToFile('error', string-join(('wega:http-get', $err:code, $err:description), ' ;; '))} + catch * {wega:logToFile('error', string-join(('wega:http-get', $err:code, $err:description, 'URL: ' || $url), ' ;; '))} let $statusCode := $response[1]/data(@status) return @@ -1861,21 +1861,23 @@ declare function wega:changeNamespace($element as element(), $targetNamespace as declare function wega:retrieveImagesFromWikipedia($pnd as xs:string, $lang as xs:string) as element(wega:wikipediaImages) { let $wikiArticle := wega:grabExternalResource('wikipedia', $pnd, $lang, true()) let $pics := $wikiArticle//xhtml:div[@class='thumbinner'] -(: let $log := util:log-system-out(($pnd, $lang)):) return { for $div in $pics let $caption := normalize-space(concat($div/xhtml:div[@class='thumbcaption'],' (', wega:getLanguageString('sourceWikipedia', $lang), ')')) let $tmpPicURI := $div//xhtml:img[@class='thumbimage']/string(@src) - let $picURI := if(starts-with($tmpPicURI, '//')) then concat('http:', $tmpPicURI) else $tmpPicURI - let $localURL := wega:retrievePicture(string($picURI), ()) - return if(exists($localURL)) then - - {$caption} - {$picURI} - {$localURL} - - else () + let $picURI := (: Achtung: in $pics landen auch andere Medien, z.B. audio. Diese erzeugen dann aber ein leeres $tmpPicURI, da natürlich kein vorhanden :) + if(starts-with($tmpPicURI, '//')) then concat('http:', $tmpPicURI) + else if(starts-with($tmpPicURI, 'http')) then $tmpPicURI + else () + let $localURL := if($picURI castable as xs:anyURI) then wega:retrievePicture(xs:anyURI($picURI), ()) else () + return if(exists($localURL)) then + + {$caption} + {$picURI} + {$localURL} + + else () } }; @@ -1888,7 +1890,7 @@ declare function wega:retrieveImagesFromWikipedia($pnd as xs:string, $lang as xs : @return xs:string the local path to the stored file :) -declare function wega:retrievePicture($picURL as xs:string, $localName as xs:string?) as xs:string? { +declare function wega:retrievePicture($picURL as xs:anyURI, $localName as xs:string?) as xs:string? { let $suffix := lower-case(functx:substring-after-last($picURL, '.')) (: let $log := util:log-system-out($picURL):) let $localFileName := if(matches($localName, '\S')) @@ -1905,9 +1907,12 @@ declare function wega:retrievePicture($picURL as xs:string, $localName as xs:str let $pathToLocalFile := concat($localDbCollection, '/', $localFileName, '.', $suffix) let $storeFile := if (util:binary-doc-available($pathToLocalFile)) then () - else util:catch('*', xmldb:store($localDbCollection, concat($localFileName, '.', $suffix), xs:anyURI($picURL)), wega:logToFile('error', string-join(('wega:retrievePicture', $util:exception, $util:exception-message), ' ;; '))) - let $storePicMetaData := wega:storePicMetadata($pathToLocalFile, $picURL) -(: let $mimeType := $pic//httpclient:body/string(@mimetype):) + else + try { xmldb:store($localDbCollection, concat($localFileName, '.', $suffix), xs:anyURI($picURL)) } + catch * { wega:logToFile('error', string-join(('wega:retrievePicture', $err:code, $err:description, 'URL: ' || $picURL), ' ;; ')) } + let $storePicMetaData := + if(wega:getPicMetadata($pathToLocalFile)) then () (: Wenn Metadaten schon vorhanden sind, brauchen sie nicht erneut angelegt werden :) + else wega:storePicMetadata($pathToLocalFile, $picURL) return if (util:binary-doc-available($pathToLocalFile) and wega:getPicMetadata($pathToLocalFile)) then $pathToLocalFile (: Datei bereits vorhanden :) else () @@ -1922,12 +1927,16 @@ declare function wega:retrievePicture($picURL as xs:string, $localName as xs:str : @return xs:string? :) -declare function wega:storePicMetadata($pathToLocalFile as xs:string, $origURL as xs:string) as xs:string? { +declare function wega:storePicMetadata($pathToLocalFile as xs:string, $origURL as xs:anyURI) as xs:string? { let $localDbCollection := functx:substring-before-last($pathToLocalFile, '/') let $localFileName := functx:substring-after-last($pathToLocalFile, '/') (:let $pic := util:binary-doc($pathToLocalFile):) - let $picHeight := util:catch('*', image:get-height(util:binary-doc($pathToLocalFile)), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) - let $picWidth := util:catch('*', image:get-width(util:binary-doc($pathToLocalFile)), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) + let $picHeight := + try { image:get-height(util:binary-doc($pathToLocalFile)) } + catch * { wega:logToFile('error', string-join(('wega:storePicMetadata', $err:code, $err:description, 'pathToLocalFile: ' || $pathToLocalFile), ' ;; ')) } + let $picWidth := + try { image:get-width(util:binary-doc($pathToLocalFile)) } + catch * { wega:logToFile('error', string-join(('wega:storePicMetadata', $err:code, $err:description, 'pathToLocalFile: ' || $pathToLocalFile), ' ;; ')) } let $metadata := {$pathToLocalFile} @@ -1936,7 +1945,9 @@ declare function wega:storePicMetadata($pathToLocalFile as xs:string, $origURL a {concat($picHeight, 'px')} return if($picWidth instance of xs:integer and $picHeight instance of xs:integer) - then util:catch('*', xmldb:store($localDbCollection, concat(functx:substring-before-last($localFileName, '.'), '.xml'), $metadata), wega:logToFile('error', string-join(('wega:storePicMetadata', $util:exception, $util:exception-message), ' ;; '))) + then + try { xmldb:store($localDbCollection, concat(functx:substring-before-last($localFileName, '.'), '.xml'), $metadata) } + catch * { wega:logToFile('error', string-join(('wega:storePicMetadata', $err:code, $err:description, 'pathToLocalFile: ' || $pathToLocalFile, 'origURL: ' || $origURL), ' ;; ')) } else () }; @@ -1949,7 +1960,7 @@ declare function wega:storePicMetadata($pathToLocalFile as xs:string, $origURL a : @return xs:string? :) -declare function wega:getPicMetadata($localPicURL as xs:string) as node()? { +declare function wega:getPicMetadata($localPicURL as xs:string) as element(picMetadata)? { let $tmpDir := wega:getOption('tmpDir') let $unknownWoman := wega:getOption('unknownWoman') let $unknownMan := wega:getOption('unknownMan') From 462e66fa45e37e56280e06029a2cd8c6aff606c9 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Wed, 21 Aug 2013 22:02:50 +0200 Subject: [PATCH 40/48] changed log level to WARN for failed http requests --- webapp/xql/modules/wega.xqm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index aaef72ca1..0ce750a53 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -1778,7 +1778,7 @@ declare %private function wega:http-get($url as xs:anyURI) as element(wega:exter let $req := let $response := try { http:send-request($req) } - catch * {wega:logToFile('error', string-join(('wega:http-get', $err:code, $err:description, 'URL: ' || $url), ' ;; '))} + catch * {wega:logToFile('warn', string-join(('wega:http-get', $err:code, $err:description, 'URL: ' || $url), ' ;; '))} let $statusCode := $response[1]/data(@status) return From 455e0667cd6ca1d89d2aa70218d6ae39898ec742 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 22 Aug 2013 11:01:14 +0200 Subject: [PATCH 41/48] adds leading and trailing whitespace to pb and cb separator sign --- webapp/xsl/common_main.xsl | 39 ++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/webapp/xsl/common_main.xsl b/webapp/xsl/common_main.xsl index afa55933d..40e935f33 100644 --- a/webapp/xsl/common_main.xsl +++ b/webapp/xsl/common_main.xsl @@ -655,26 +655,33 @@ + - - - - - - - - | - - - + + + + + + + + + + + - - + + - + - ¦ - + + + + + + + + From 93ddd60306f70bc857d0adf8b294c22b801c57a6 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Fri, 23 Aug 2013 10:54:01 +0200 Subject: [PATCH 42/48] added controller rule for zipped sitemap --- webapp/controller.xql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/controller.xql b/webapp/controller.xql index 8777d444d..00dcbbdf0 100644 --- a/webapp/controller.xql +++ b/webapp/controller.xql @@ -512,7 +512,7 @@ else if (matches($exist:path, '^/pnd_beacon.txt$')) then (: Sitemap :) -else if (matches($exist:path, '^/sitemap(/?|/index.xml)?$') or matches($exist:path, '^/sitemap/sitemap_(en|de).xml.gz$')) then +else if (matches($exist:path, '^/sitemap(/?|/index.xml)?$') or matches($exist:path, '^/sitemap/sitemap_(en|de).xml.(gz|zip)$')) then From d13de58ec234dccf68103722d0c2010345b61b7d Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Fri, 23 Aug 2013 10:56:33 +0200 Subject: [PATCH 43/48] changed sitemap compression from gzip to zip due to malfunction --- webapp/xql/utilities/createSiteMap.xql | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/webapp/xql/utilities/createSiteMap.xql b/webapp/xql/utilities/createSiteMap.xql index c506bfcfc..c5cb7a1d9 100644 --- a/webapp/xql/utilities/createSiteMap.xql +++ b/webapp/xql/utilities/createSiteMap.xql @@ -17,16 +17,16 @@ declare variable $local:languages := ('en', 'de'); declare variable $local:standardEntries := ('index', 'search', 'help', 'projectDescription', 'contact', 'editorialGuidelines'(:, 'publications':), 'bibliography'); declare variable $local:databaseEntries := ('persons', 'letters', 'writings', 'diaries', (:'works',:) 'news'(:, 'biblio':)); -declare function local:getUrlList($type as xs:string, $lang as xs:string) as item()* { +declare function local:getUrlList($type as xs:string, $lang as xs:string) as element(url)* { for $x in facets:getOrCreateColl($type, 'indices', true()) let $lastmod := wega:getLastModifyDateOfDocument(document-uri($x)) let $loc := wega:createLinkToDoc($x, $lang) return - element url { + { element loc {$loc}, if(exists($lastmod)) then element lastmod {$lastmod} else () - } + } }; declare function local:createSitemap($lang as xs:string) as element(urlset) { @@ -63,8 +63,10 @@ declare function local:getSetSitemap($fileName as xs:string) as xs:base64Binary return if(exists($newSitemap)) then ( let $serializationParameters := ('method=xml', 'media-type=application/xml', 'indent=no', 'omit-xml-declaration=no', 'encoding=utf-8') - let $compressedData := compression:gzip(util:string-to-binary(util:serialize($newSitemap, $serializationParameters))) - let $storedData := xmldb:store($folderName, $fileName, $compressedData, 'application/gzip') + let $zip := compression:zip({$newSitemap}, false()) +(: let $compressedData := compression:gzip(util:string-to-binary(util:serialize($newSitemap, $serializationParameters))):) + let $storedData := xmldb:store($folderName, $fileName, $zip, 'application/zip') + (:xmldb:store($folderName, $fileName, $compressedData, 'application/gzip'):) return util:binary-doc($storedData) ) else () @@ -74,9 +76,9 @@ declare function local:getSetSitemap($fileName as xs:string) as xs:base64Binary let $appLang := request:get-parameter('lang', 'de') let $resource := request:get-parameter('resource', '') -(:let $host := request:get-parameter('host', wega:getOption('baseHref')):) -let $properFileNames := for $lang in $local:languages return concat('sitemap_', $lang, '.xml.gz') +let $host := request:get-parameter('host', wega:getOption('baseHref')) +let $properFileNames := for $lang in $local:languages return concat('sitemap_', $lang, '.xml.zip') -return - if($properFileNames = $resource) then response:stream-binary(local:getSetSitemap($resource), 'application/x-gzip', $resource) +return + if($properFileNames = $resource) then response:stream-binary(local:getSetSitemap($resource), 'application/zip', $resource) else local:createSitemapIndex($properFileNames) From ec8202388b36974d48b04c487313a7a15d8fc4e3 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 2 Sep 2013 13:32:41 +0200 Subject: [PATCH 44/48] modified some log priorities --- webapp/xql/modules/wega.xqm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/xql/modules/wega.xqm b/webapp/xql/modules/wega.xqm index 0ce750a53..6b7df7ab8 100644 --- a/webapp/xql/modules/wega.xqm +++ b/webapp/xql/modules/wega.xqm @@ -722,7 +722,7 @@ declare function wega:getDocumentMetaData($docItem as item(), $lang as xs:string declare function wega:returnUnknownMetaData($docID as xs:string, $lang as xs:string, $usage as xs:string) as element() { let $logMessage := string-join(('wega:returnUnknownMetaData()', $docID, $lang, $usage), ';;') - let $log := wega:logToFile('error', $logMessage) + let $log := wega:logToFile('warn', $logMessage) let $cssClasses := if($usage eq 'toolTip') then 'toolTip' else if($usage eq 'listView') then 'item' @@ -2397,7 +2397,7 @@ declare function wega:isBiblioType($string as xs:string) as xs:boolean { declare function wega:number-to-roman($num as xs:integer?) as xs:string { if(not($num castable as xs:int)) then '' else if($num eq 0) then '' - else if($num gt 3999) then wega:logToFile('error', 'wega:number-to-roman(): Cannot Convert Number Larger than 3999') + else if($num gt 3999) then wega:logToFile('warn', 'wega:number-to-roman(): Cannot Convert Number Larger than 3999') else wega:recursive-roman($num,'',$wega:romanNums) }; @@ -2888,7 +2888,7 @@ declare function wega:getNormDates($docType as xs:string) as document-node()? { declare function wega:logToFile($priority as xs:string, $message as xs:string) as empty() { let $file := wega:getOption('errorLogFile') let $message := concat($message, ' (rev. ', wega:getCurrentSvnRev(), ')') - let $log := if(wega:getOption('environment') eq 'development') then util:log-system-out($message) else () + (:let $log := if(wega:getOption('environment') eq 'development') then util:log-system-out($message) else ():) return util:log-app($priority, $file, $message) }; From 280409c1b21f2f2f86dcb3ae163bebfdcfab98d2 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Mon, 2 Sep 2013 20:18:00 +0200 Subject: [PATCH 45/48] adapted readme to dev branch --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 76c684321..e9f85344f 100644 --- a/README.md +++ b/README.md @@ -18,16 +18,16 @@ Quick start guide 1. Configure eXist 2. Set up Digilib 3. Upload directory `/webapp` to the eXist database root collection -4. Upload directory `/exist-indices/db` to the eXist database `/db/system/config` collection -5. Upload directories under `/example-data` to the eXist database root collection -6. Create a database collection `tmp` under `/db/webapp` and set group and owner to "guest" +4. Copy content of `/exist-indices/db` to the eXist database `/db/system/config/db` collection +5. Upload directories from `/example-data` to the eXist database root collection +6. Make all newly created collections readable for "guest" and the XQueries executable by user "guest". Create a database collection `tmp` under `/db/webapp` and set group and owner to "guest" – or use the helper script `scripts/setPermissions.xql` 7. Direct your browser to `http://localhost:8080` Branches -------- -* `master` our stable branch, based on eXist 1.4.3 -* `develop` our development branch, based on eXist 2.1. Should be very stable by now and will become the next release. +* `master` our stable branch, based on eXist 2.1 +* `develop` our development branch * `foundation-templating-dev` a complete rework of the WeGA-WebApp which will feature a responsive web design (built with foundation) and will adhere to the eXist templating and app packaging. From cbd017b4fc8edabb123ae0bbd846e21cd015b3e9 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Tue, 3 Sep 2013 17:41:53 +0200 Subject: [PATCH 46/48] fixed double output of diary date --- webapp/xsl/diary_tableRight.xsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/xsl/diary_tableRight.xsl b/webapp/xsl/diary_tableRight.xsl index d6f150b8b..33970c5f7 100644 --- a/webapp/xsl/diary_tableRight.xsl +++ b/webapp/xsl/diary_tableRight.xsl @@ -43,7 +43,7 @@ - + From 2349526b42377881ca9b04010cbf8b48a239ea6b Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 5 Sep 2013 15:01:25 +0200 Subject: [PATCH 47/48] deactivated(?) full text index --- exist-indices/db/iconography/collection.xconf | 1 + exist-indices/db/webapp/tmp/collection.xconf | 3 ++- exist-indices/db/webapp/xml/collection.xconf | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/exist-indices/db/iconography/collection.xconf b/exist-indices/db/iconography/collection.xconf index 1c08760be..41a3d7034 100644 --- a/exist-indices/db/iconography/collection.xconf +++ b/exist-indices/db/iconography/collection.xconf @@ -8,5 +8,6 @@ + diff --git a/exist-indices/db/webapp/tmp/collection.xconf b/exist-indices/db/webapp/tmp/collection.xconf index ad5955561..6714f5660 100644 --- a/exist-indices/db/webapp/tmp/collection.xconf +++ b/exist-indices/db/webapp/tmp/collection.xconf @@ -12,5 +12,6 @@ + - \ No newline at end of file + diff --git a/exist-indices/db/webapp/xml/collection.xconf b/exist-indices/db/webapp/xml/collection.xconf index d9351ce80..eb95f5ab3 100644 --- a/exist-indices/db/webapp/xml/collection.xconf +++ b/exist-indices/db/webapp/xml/collection.xconf @@ -2,5 +2,6 @@ + From aa97778c66a0eda1278f846c64dd210d230feb58 Mon Sep 17 00:00:00 2001 From: Peter Stadler Date: Thu, 5 Sep 2013 15:04:31 +0200 Subject: [PATCH 48/48] fixed collection predicate for diaries --- webapp/xml/wegaOptions.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/xml/wegaOptions.xml b/webapp/xml/wegaOptions.xml index 46ca3741e..2c53247d1 100644 --- a/webapp/xml/wegaOptions.xml +++ b/webapp/xml/wegaOptions.xml @@ -15,13 +15,13 @@ [(.//tei:sender/tei:persName/@key = '%1', .//tei:addressee/tei:persName/@key = '%1')][not(*/tei:ref)] [.//tei:fileDesc//tei:author/@key = '%1'][not(*/tei:ref)] [.//tei:fileDesc//tei:author/@key = '%1'][not(*/tei:ref)] - + [./tei:ab] [.//mei:fileDesc/mei:titleStmt/mei:respStmt/mei:persName[@role=('cmp', 'lbt', 'lyr')]/@dbkey = '%1'] //tei:figure[.//tei:person[@corresp = '%1']][@n = 'portrait'][1] [not(*/tei:ref)] [not(*/tei:ref)] [not(*/tei:ref)] - + [./tei:ab] [not(*/tei:ref)] [not(*/tei:ref)]