(:
Module: Dictionary menu building for the search interface.
Returns all available dictionaries and terminology collections.
:)
module namespace dictmenu="http://www.risten.no/shared/dictmenu";
declare namespace util="http://exist-db.org/xquery/util";
declare namespace xmldb="http://exist-db.org/xquery/xmldb";
(: Get ID, coll, and classification ID for all available term collections. :)
(: Availability is checked against user credentials and access permisions. :)
(: Returns an element containing a sequence of empty elements with the following structure:
...
:)
declare function dictmenu:get-termcolls($user as xs:string) as element()
{
let $groups := if ($user = "all") then
/termmeta/id/text()
else if ($user = "public") then
/termmeta[public/text() eq "yes"]/id/text()
else
xmldb:get-user-groups($user)
let $membergroups := count($groups)
return
{
for $r in /termmeta
let $coll := util:collection-name($r)
let $collgroup := xmldb:get-group($coll)
return
(: we need to lower-case the ID string - groups are always lower-case :)
if (contains( $groups, lower-case($r/id/text()) ) ) then
(: when the group is different from the Coll. ID, use the group of the collection :)
else if (contains( $groups, $collgroup ) ) then
else if (contains( $groups, $r/id/text() ) ) then (: case: the user is 'all' or 'public' ->
$groups = list of id strings :)
else ()
}
};
(: Get ID, and collection for all available dictionaries. :)
(: Availability is checked against user credentials and access permisions. :)
(: Returns an element containing a sequence of empty elements with the following structure:
...
:)
declare function dictmenu:get-dictcolls($user as xs:string) as element()
{
let $groups := if ($user = "all") then
/dictmeta/id/text()
else if ($user = "public") then
/dictmeta[public/text() eq "yes"]/id/text()
else
xmldb:get-user-groups($user)
let $membergroups := count($groups)
return
{
for $r in /dictmeta
let $coll := util:collection-name($r)
let $collgroup := xmldb:get-group($coll)
return
(: we need to lower-case the ID string - groups are always lower-case :)
if (contains( $groups, lower-case($r/id/text()) ) ) then
(: when the group is different from the Coll. ID, use the group of the collection :)
else if (contains( $groups, $collgroup ) ) then
else if (contains( $groups, $r/id/text() ) ) then (: case: the user is 'all' or 'public' ->
$groups = list of id strings :)
else ()
}
};
(: Get ID, and collection for all available classification schemes. :)
(: Availability is checked against user credentials and access permisions. :)
(: Returns an element containing a sequence of empty elements with the following structure:
...
:)
declare function dictmenu:get-classcolls($user as xs:string) as element()
{
let $groups := if ($user = "all") then
/classmeta/id/text()
else if ($user = "public") then
/classmeta[public/text() eq "yes"]/id/text()
else
xmldb:get-user-groups($user)
let $membergroups := count($groups)
return
{
for $r in /classmeta
let $coll := util:collection-name($r)
let $collgroup := xmldb:get-group($coll)
return
(: we need to lower-case the ID string - groups are always lower-case :)
if (contains( $groups, lower-case($r/id/text()) ) ) then
(: when the group is different from the Coll. ID, use the group of the collection :)
else if (contains( $groups, $collgroup ) ) then
else if (contains( $groups, $r/id/text() ) ) then (: case: the user is 'all' or 'public' ->
$groups = list of id strings :)
else ()
}
};