abaev-basex-htmx/xq/site/restx_main.xq
2025-03-29 23:57:33 +03:00

250 lines
No EOL
8.1 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

declare namespace site = 'http://ossetic-studies.org/ns/abaevdict-site';
declare namespace tei = "http://www.tei-c.org/ns/1.0";
import module namespace abv-m = 'http://ossetic-studies.org/ns/abaevdict-mod' at '../abv-mod.xqm';
import module namespace home = 'http://ossetic-studies.org/ns/abaevdict-site/home' at './components/home.xqm';
import module namespace entries = 'http://ossetic-studies.org/ns/abaevdict-site/entries' at './components/entries.xqm';
import module namespace index = 'http://ossetic-studies.org/ns/abaevdict-site/index' at './components/index.xqm';
import module namespace search = 'http://ossetic-studies.org/ns/abaevdict-site/search' at './components/search.xqm';
(: =============================================================== :)
(: ============================ FAVICON ========================== :)
(: =============================================================== :)
declare %rest:path("/favicon.ico")
%rest:GET
function site:favicon() {
fetch:binary('../../static/favicon.ico')
};
(: HTML HEAD :)
declare function site:head($title as xs:string) {
<head>
<title>{$title}</title>
<script src="/static/htmx.min.js"></script>
<script src="/static/plotly-3.0.1.min.js" charset="utf-8"></script>
<link rel="stylesheet" href="/static/pico.classless.min.css"/>
<link rel="stylesheet" href="/static/abaev-html.css"/>
</head>
};
(: HEADER :)
declare function site:header($lang as xs:string, $href-other as xs:string) {
<header id="abv-header">
<nav>
<ul class="abv-brand">
<li><img class="abv-logo" src="/static/Abaev_logo.png" alt="Abaevdict logo"></img>
<strong>{
switch($lang)
case 'ru' return 'ИЭСОЯ'
default return `Abaevdict`
}</strong><i> β</i></li>
<li>{
(element {if ($lang = 'ru') then 'mark' else 'a'}{
if ($lang != 'ru') then
(attribute href {`{$href-other}`}) else (),
'ru'
}, ' / ',
element {if ($lang = 'ru') then 'a' else 'mark'}{
if ($lang = 'ru') then
(attribute href {`{$href-other}`}) else (),
'en'
})
}
</li>
</ul>
<ul>
<li><a href="./home">{
switch($lang)
case 'ru' return 'Главная'
default return 'Home'
}
</a></li>
<li><a href="./dictionary">{switch($lang)
case 'ru' return 'Просмотр'
default return 'Browse'
}
</a></li>
<li><a href="./search">{switch($lang)
case 'ru' return 'Поиск'
default return 'Search'
}
</a></li>
<li><a href="./index">{switch($lang)
case 'ru' return 'Указатель'
default return 'Index'
}</a></li>
<li><a href="#">{switch($lang)
case 'ru' return 'Литература'
default return 'References'
}</a></li>
</ul>
</nav>
</header>
};
(: PATHS :)
(: ZERO PATH :)
declare %rest:path("{$lang}")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:null($lang as xs:string) {
site:home($lang)
};
declare %rest:path("/")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:null() {
site:null('en')
};
(: HOME PAGE :)
declare %rest:path("{$lang}/home")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:home($lang as xs:string) {
<html>
{
site:head(if ($lang = 'ru') then 'ИЭСОЯ В.И. Абаева — Главная'
else 'Abaevdict — Main'),
<body>
{site:header($lang,`/{abv-m:invert-lang($lang)}/home`)}
<main>
{home:content($lang)}
</main>
</body>
}
</html>
};
declare %rest:path("/home")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:home() {
site:home('en')
};
(: DICTIONARY INTERFACE :)
declare %rest:path("{$lang}/dictionary")
%rest:query-param("query", "{$query}")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:dictionary($lang as xs:string, $query as xs:string?) {
<html>
{
site:head(if($lang = 'ru') then 'ИЭСОЯ В.И. Абаева — Просмотр'
else 'Abaevdict — Browse'),
<body>
{site:header($lang,`/{abv-m:invert-lang($lang)}/dictionary`)}
{entries:sidebar($lang)}
<dialog id="modal_map"/>
<main id="abv-dict">
{entries:entries($lang,20,$query)}
</main>
</body>
}
</html>
};
declare %rest:path("dictionary")
%rest:query-param("query", "{$query}")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:dictionary($query as xs:string?) {
site:dictionary('en', $query)
};
(: INDEX INTERFACE :)
declare %rest:path("{$lang}/index")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:index($lang as xs:string) {
<html>
{
site:head(if ($lang = 'ru') then 'ИЭСОЯ В.И. Абаева — Указатель'
else 'Abaevdict — Index'),
<body>
{site:header($lang,`/{abv-m:invert-lang($lang)}/index`)}
<main>
{index:content($lang)}
</main>
</body>
}
</html>
};
declare %rest:path("index")
%rest:GET
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:index() {
site:index('en')
};
(: SEARCH INTERFACE :)
declare %rest:path("{$lang}/search")
%rest:form-param("pattern", "{$pattern}")
%rest:form-param("text", "{$text}")
%rest:GET
%rest:POST
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:search($lang as xs:string,
$pattern as xs:string?,
$text as xs:string?) {
<html>
{
site:head(if ($lang = 'ru') then 'ИЭСОЯ В.И. Абаева — Поиск'
else 'Abaevdict — Search'),
<body>
{site:header($lang,`/{abv-m:invert-lang($lang)}/search`)}
<main>
{search:content($lang,$pattern,$text)}
</main>
</body>
}
</html>
};
declare %rest:path("search")
%rest:form-param("pattern", "{$pattern}")
%rest:form-param("text", "{$text}")
%rest:GET
%rest:POST
%rest:produces("text/html")
%output:method("html")
%output:html-version('5')
function site:search($pattern as xs:string?,
$text as xs:string?) {
site:index('en')
};
0