xquery version "3.0";
(:
: Copyright 2006-2010 The FLWOR Foundation.
:
: Licensed under the Apache License, Version 2.0 (the "License");
: you may not use this file except in compliance with the License.
: You may obtain a copy of the License at
:
: http://www.apache.org/licenses/LICENSE-2.0
:
: Unless required by applicable law or agreed to in writing, software
: distributed under the License is distributed on an "AS IS" BASIS,
: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
: See the License for the specific language governing permissions and
: limitations under the License.
:)
(:~
: Function library provides functions for generating the XQDoc XML's for a project.
:
: @author Sorin Nasoi
: @project xqdoc
:)
module namespace pxqdoc = "http://www.zorba-xquery.com/modules/project_xqdoc";
(:~ needed for generating the XML's :)
import module namespace xqd = "http://www.zorba-xquery.com/modules/xqdoc";
(:~ needed for writing the XML's to disk:)
import module namespace file = "http://expath.org/ns/file";
import schema namespace xqdoc = "http://www.xqdoc.org/1.0";
import schema namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace an = "http://www.zorba-xquery.com/annotations";
declare namespace zm = "http://www.zorba-xquery.com/manifest";
import module namespace fetch = "http://www.zorba-xquery.com/modules/fetch";
declare namespace ver = "http://www.zorba-xquery.com/options/versioning";
import module namespace err = "http://www.zorba-xquery.com/modules/xqdoc2xhtml/error";
declare namespace werr = "http://www.w3.org/2005/xqt-errors";
declare option ver:module-version "2.0";
(:~
: The serialization parameters for XML serialization.
:)
declare variable $pxqdoc:serParamXml :=
<output:serialization-parameters>
<output:method value="xml"/>
<output:indent value="yes"/>
</output:serialization-parameters>;
(:~
: Delete the intermediary xml dir
:
: @param $xqdocPath where to generate the XQDoc XML documents.
: @return empty sequence.
:)
declare %an:sequential function pxqdoc:delete-XML-dir(
$xqdocPath as xs:string) as empty-sequence()
{
variable $xqdocXMLPath := fn:concat( $xqdocPath,
file:directory-separator(),
"xml");
(: clear the XML folder :)
if(file:exists($xqdocXMLPath)) then
file:delete($xqdocXMLPath);
else ();
};
(:~
: This function loads the ZorbaManifest.xml
:
: @param $zorbaManifestPath location of ZorbaManifest.xml.
: @return the manifest.
:)
declare %an:nondeterministic function pxqdoc:load-manifest(
$zorbaManifestPath as xs:string) as document-node()?
{
try
{
fn:parse-xml(file:read-text($zorbaManifestPath))
}
catch *
{
fn:error($err:UE004,fn:concat("The file <",$zorbaManifestPath,"> does not have the correct structure."))
}
};
(:~
: This function generates the XQDoc XML for all the modules found in build/ZorbaManifest.xml
:
: @param $zorbaManifestPath location of ZorbaManifest.xml.
: @param $xqdocPath where to generate the XQDoc XML documents.
: @return empty sequence.
:)
declare %an:sequential function pxqdoc:generate-xqdoc-XML(
$zorbaManifestPath as xs:string,
$xqdocPath as xs:string) as empty-sequence()
{
(: Note: only the modules that are configured in the Zorba version you are using will be build :)
variable $xqdocXMLPath := concat($xqdocPath, file:directory-separator(), "xml");
(: create the XML folder if it does not exist already :)
file:create-directory($xqdocXMLPath);
if(not(file:is-file($zorbaManifestPath))) then
{
variable $message := fn:concat("The file <ZorbaManifest.xml> was not found: <", $zorbaManifestPath, ">. Suggestion: run 'cmake' in your build folder such that ZorbaManifest.xml is regenerated.");
fn:error($err:UE004, $message);
}
else
{
variable $manifestXML := pxqdoc:load-manifest($zorbaManifestPath);
variable $moduleManifests := $manifestXML/zm:manifest/zm:module;
if(count($moduleManifests) eq xs:integer(0)) then ();
else
{
try
{
for $module in $moduleManifests
(: note the module version is not supported because of a bug in the fetch for the module URI ending with / :)
(:let $moduleURI := if(ends-with(data($module/zm:uri),'/')) then data($module/zm:uri)
else if(exists($module/@version)) then concat(data($module/zm:uri),"#",data($module/@version))
else data($module/zm:uri):)
(:let $moduleFetched := fetch:content(trace($moduleURI,"fetch module URI version.."), "MODULE"):)
let $moduleURI := data($module/zm:uri)
let $moduleFetched := fetch:content($moduleURI, "MODULE")
let $moduleFetched := fn:replace($moduleFetched, '&(nbsp|#160);' , codepoints-to-string(160))
let $xqdoc := xqd:xqdoc-content($moduleFetched)
let $xqdocRelFileName := pxqdoc:get-filename($moduleURI)
let $xqdocFileName := concat($xqdocXMLPath, file:directory-separator(), $xqdocRelFileName, ".xml")
return
file:write($xqdocFileName,
$xqdoc,
$pxqdoc:serParamXml)
}
catch *
{
fn:error($err:UE004,
concat("Error processing module ",
$werr:code,
" - ",
$werr:description))
}
};
}
};
(:~
: Returns the string resulting from replacing the directory-separators (i.e. / ) with '_'
:
: @param $moduleURI the path to the module URI.
: @return the string resulting from replacing the directory-separators (i.e. / ) with '_'.
:
:)
declare function pxqdoc:get-filename(
$moduleURI as xs:string) as xs:string {
let $lmodule := if(fn:ends-with($moduleURI,"/")) then fn:concat($moduleURI,"index") else $moduleURI
return
replace(
replace($lmodule, "/", "_"),
"http:__",
""
)
};