Skip to content
Snippets Groups Projects
config.xqm 4.25 KiB
Newer Older
  • Learn to ignore specific revisions
  • usikora's avatar
    usikora committed
    xquery version "3.0";
    
    
    (:
     : Copyright (c) 2018 Uwe Sikora
     : Copyright (c) 2018–2019 Michelle Weidling
     : Copyright (c) 2020 Stefan Hynek
     :
     : This file is part of intermediate-format.
     :
     : intermediate-format is free software: you can redistribute it and/or modify
     : it under the terms of the GNU General Public License as published by
     : the Free Software Foundation, either version 3 of the License, or
     : (at your option) any later version.
     :
     : intermediate-format is distributed in the hope that it will be useful,
     : but WITHOUT ANY WARRANTY; without even the implied warranty of
     : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     : GNU General Public License for more details.
     :
     : You should have received a copy of the GNU General Public License
     : along with intermediate-format.  If not, see <https://www.gnu.org/licenses/>.
     :)
    
    
    usikora's avatar
    usikora committed
    (:~
     : A set of helper functions to access the application context from
     : within a module.
     :)
    
    module namespace config="http://bdn-edition.de/intermediate_format/config";
    
    usikora's avatar
    usikora committed
    
    declare namespace templates="http://exist-db.org/xquery/templates";
    
    declare namespace repo="http://exist-db.org/xquery/repo";
    declare namespace expath="http://expath.org/ns/pkg";
    
    
    MRodz's avatar
    MRodz committed
    (:
    
    usikora's avatar
    usikora committed
        Determine the application root collection from the current module load path.
    :)
    
    MRodz's avatar
    MRodz committed
    declare variable $config:app-root :=
    
    usikora's avatar
    usikora committed
        let $rawPath := system:get-module-load-path()
        let $modulePath :=
            (: strip the xmldb: part :)
            if (starts-with($rawPath, "xmldb:exist://")) then
                if (starts-with($rawPath, "xmldb:exist://embedded-eXist-server")) then
                    substring($rawPath, 36)
                else
                    substring($rawPath, 15)
            else
                $rawPath
        return
            substring-before($modulePath, "/modules")
    ;
    
    declare variable $config:data-root := $config:app-root || "/data";
    
    declare variable $config:repo-descriptor := doc(concat($config:app-root, "/repo.xml"))/repo:meta;
    
    declare variable $config:expath-descriptor := doc(concat($config:app-root, "/expath-pkg.xml"))/expath:package;
    
    
    MRodz's avatar
    MRodz committed
    declare variable $config:sade := "/db/apps/sade/textgrid/";
    
    MRodz's avatar
    MRodz committed
    declare variable $config:sade-data := $config:sade || "data/";
    declare variable $config:sade-meta := $config:sade || "meta/";
    
    
    usikora's avatar
    usikora committed
    (:~
     : Resolve the given path using the current application context.
     : If the app resides in the file system,
     :)
    declare function config:resolve($relPath as xs:string) {
        if (starts-with($config:app-root, "/db")) then
            doc(concat($config:app-root, "/", $relPath))
        else
            doc(concat("file://", $config:app-root, "/", $relPath))
    };
    
    (:~
     : Returns the repo.xml descriptor for the current application.
     :)
    declare function config:repo-descriptor() as element(repo:meta) {
        $config:repo-descriptor
    };
    
    (:~
     : Returns the expath-pkg.xml descriptor for the current application.
     :)
    declare function config:expath-descriptor() as element(expath:package) {
        $config:expath-descriptor
    };
    
    declare %templates:wrap function config:app-title($node as node(), $model as map(*)) as text() {
        $config:expath-descriptor/expath:title/text()
    };
    
    declare function config:app-meta($node as node(), $model as map(*)) as element()* {
        <meta xmlns="http://www.w3.org/1999/xhtml" name="description" content="{$config:repo-descriptor/repo:description/text()}"/>,
        for $author in $config:repo-descriptor/repo:author
        return
            <meta xmlns="http://www.w3.org/1999/xhtml" name="creator" content="{$author/text()}"/>
    };
    
    (:~
     : For debugging: generates a table showing all properties defined
     : in the application descriptors.
     :)
    declare function config:app-info($node as node(), $model as map(*)) {
        let $expath := config:expath-descriptor()
        let $repo := config:repo-descriptor()
        return
            <table class="app-info">
                <tr>
                    <td>app collection:</td>
                    <td>{$config:app-root}</td>
                </tr>
                {
                    for $attr in ($expath/@*, $expath/*, $repo/*)
                    return
                        <tr>
                            <td>{node-name($attr)}:</td>
                            <td>{$attr/string()}</td>
                        </tr>
                }
                <tr>
                    <td>Controller:</td>
                    <td>{ request:get-attribute("$exist:controller") }</td>
                </tr>
            </table>
    
    MRodz's avatar
    MRodz committed
    };