Lines
94.29 %
Functions
34 %
use crate::server::{
dataset::{Dataset, PredicateObject},
DatasetSummary, DatasetVersionSummary,
};
use askama::Template;
use sophia::api::{term::IriRef, MownStr};
use std::collections::BTreeSet;
#[derive(Template)]
#[template(path = "index.html")]
pub(crate) struct IndexTemplate<'a> {
pub datasets: &'a [DatasetSummary<'a>],
}
#[template(path = "dataset.html")]
pub(crate) struct DatasetTemplate<'a> {
pub dataset: &'a Dataset,
pub versions: &'a [DatasetVersionSummary],
#[template(path = "version.html")]
pub(crate) struct VersionTemplate<'a> {
pub dataset: &'a DatasetSummary<'a>,
pub version: &'a DatasetVersionSummary,
pub subjects: BTreeSet<&'a IriRef<MownStr<'a>>>,
#[template(path = "subject.html")]
pub(crate) struct SubjectTemplate<'a> {
pub subject: String,
pub pos: Vec<PredicateObject<'a>>,
mod filters {
use std::{collections::BTreeSet, fmt};
use askama::Error::Fmt;
use chrono::{DateTime, Utc};
use lazy_static::lazy_static;
use sophia::{
api::{
prefix::{PrefixMap, PrefixMapPair},
term::IriRef,
MownStr,
},
iri::Iri,
dataset::{load_datasets, load_prefixes, Dataset},
get_dataset_version,
static LABEL_RESOURCE: &str = "http://www.w3.org/2000/01/rdf-schema#label";
lazy_static! {
static ref DATASETS: Vec<Dataset> = load_datasets("datasets").unwrap_or_default();
static ref PREFIXES: Vec<PrefixMapPair> = load_prefixes("datasets").unwrap_or_default();
pub fn replace_prefix<T: std::fmt::Display>(s: T) -> ::askama::Result<String> {
let prefix_found = PREFIXES.get_prefixed_pair(Iri::new_unchecked(s.to_string()));
let out = if let Some(ps) = prefix_found {
format!("{}:{}", ps.0.as_str(), ps.1)
} else {
s.to_string()
Ok(out)
// Would be nice if this filter returned the found prefix in the original URL format
// pub fn prefix<T: std::fmt::Display>(s: T) -> ::askama::Result<String> {
// let prefix_found = PREFIXES.get_prefixed_pair(Iri::new_unchecked(s.to_string()));
// let out = if let Some(ps) = prefix_found {
// format!("{}", ps.0.)
// } else {
// s.to_string()
// };
// Ok(out)
// }
pub fn rdfslabel<T: std::fmt::Display>(
s: T,
id: &&str,
version: &DateTime<Utc>,
) -> ::askama::Result<String> {
let subject = Iri::new_unchecked(s.to_string());
let Ok((_, dataset_version)) = get_dataset_version(&DATASETS, id, *version) else {
return Err(Fmt(fmt::Error));
let pos = dataset_version.pos(&subject);
let find_target_po = pos
.into_iter()
.find(|po| po.predicate.as_str() == LABEL_RESOURCE);
let Some(target_po) = find_target_po else {
return Ok("".to_string());
let Some(target_object) = target_po.object_literal else {
Ok(target_object.to_string())
pub fn categorize_subjects<'a>(
subs: &BTreeSet<&'a IriRef<MownStr<'a>>>,
) -> ::askama::Result<(Vec<String>, Vec<usize>)> {
let special_categories: Vec<&str> = vec!["proposal", "nlnet"];
let mut categories: Vec<String> = PREFIXES
.clone()
.map(|(p, _)| p.to_string())
.filter(|cat| !special_categories.contains(&cat.as_str()))
.collect();
let cat_assigns: Vec<usize> = subs
.map(|s| {
if let Some((prefix, _)) = prefix_found {
if let Some(idx) = special_categories
.iter()
.position(|cat| cat == &prefix.as_str())
{
return idx;
} else if let Some(idx) =
categories.iter().position(|cat| cat == &prefix.as_str())
return idx + special_categories.len();
categories.len()
})
let mut all_categories = vec!["Proposals".to_string(), "NLnet".to_string()];
let mut others = vec!["Other".to_string()];
all_categories.append(&mut categories);
all_categories.append(&mut others);
Ok((all_categories, cat_assigns))