(:~
 : ifweb.xql offers a simple interface for creating the website specific BdN
 : intermediate format of a given resource.
 :
 : @author Michelle Rodzis
 : @version 1.0
 :
 :)
xquery version "3.1";

module namespace ifweb="http://bdn-edition.de/intermediate_format/ifweb";

declare namespace tei = "http://www.tei-c.org/ns/1.0";

import module namespace console="http://exist-db.org/xquery/console";
import module namespace pre="http://bdn-edition.de/intermediate_format/preprocessing" at "xmldb:exist:///db/apps/interformat/modules/intermediate_format/preprocessing.xqm";
import module namespace ident = "http://bdn-edition.de/intermediate_format/identification" at "xmldb:exist:///db/apps/interformat/modules/intermediate_format/identification.xqm";
import module namespace config = "http://bdn-edition.de/intermediate_format/config" at "xmldb:exist:///db/apps/interformat/modules/config.xqm";

declare option exist:serialize "method=xml media-type=text/xml omit-xml-declaration=no indent=no";

declare variable $ifweb:replace-whitespace := true();

declare function ifweb:main($resource as xs:string) as xs:string? {
    let $doc := doc($config:sade-data || $resource)
    let $filename := substring-before($resource, '.xml') || "-if.xml"

    return ifweb:transform($doc, $filename)
};


declare function ifweb:transform($doc as node()*, $filename as xs:string)
as node()* {
    let $preprocessed-data := pre:preprocessing($doc/tei:TEI, $ifweb:replace-whitespace)
    let $intermediate-format := ident:walk($preprocessed-data, ())
    let $store := xmldb:store($config:sade-data, $filename, $intermediate-format)

    return $intermediate-format
};


declare function ifweb:transform($doc as node()*, $filename as xs:string,
$target-dir as xs:string) as node()* {
    let $preprocessed-data := pre:preprocessing($doc/tei:TEI, $ifweb:replace-whitespace)
    let $intermediate-format := ident:walk($preprocessed-data, ())
    let $store := xmldb:store($target-dir, $filename, $intermediate-format)

    return $intermediate-format
};


declare function ifweb:complete-xml($author as xs:string, $xml as node()*)
as node()* {
    let $filename := $author || "-full-if.xml"
    return ifweb:transform($xml, $filename)
};

declare function ifweb:single-xml($filename as xs:string, $src-dir as xs:string,
$target-dir as xs:string) as node()* {
    let $resource := doc($src-dir || $filename)
    return ifweb:transform($resource, $filename, $target-dir)
};

declare function ifweb:transform-split-xml($xml as node()*, $filename as xs:string,
$dir as xs:string) {
    let $preprocessed-data := pre:preprocessing($xml/*, $ifweb:replace-whitespace)
    let $intermediate-format := ident:walk($preprocessed-data, ())

    (: sometimes we have structural variance on chapter level - in these cases
    tei:app is the root element of $xml, not tei:div. for the HTML serialization
    of the structural variance to function properly we have to preserve the
    tei:app :)
    let $content :=
        if($xml[self::tei:app]) then
            element tei:app {
                $xml/@*,
                attribute id {generate-id($xml)},
                $intermediate-format
            }
        else
            ($xml/@*,
            attribute id {generate-id($xml)},
            $intermediate-format)

    let $transformed :=
            element tei:div {
                $content
            }
    let $store := xmldb:store($dir, $filename, $transformed)

    return $intermediate-format
};