Lines
94.59 %
Functions
34 %
use crate::server::{
dataset::{Dataset, PredicateObject},
DatasetSummary, DatasetVersionSummary,
};
use askama::Template;
use sophia::api::{prefix::PrefixMapPair, 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>>>,
pub datasets: &'a Vec<Dataset>,
pub prefixes: &'a Vec<PrefixMapPair>,
#[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 sophia::{
api::{
prefix::{PrefixMap, PrefixMapPair},
term::IriRef,
MownStr,
},
iri::Iri,
use crate::{
constants::LABEL_RDFS_IRI,
server::{dataset::Dataset, get_dataset_version},
/// Filter to replace the prefix in a resource IRI
pub(crate) fn replace_prefix<T: std::fmt::Display>(
s: T,
prefixes: &Vec<PrefixMapPair>,
) -> ::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)
/// Filter to find and display the rdfs:label resource for a subject
pub(crate) fn rdfslabel<T: std::fmt::Display>(
datasets: &Vec<Dataset>,
id: &&str,
version: &DateTime<Utc>,
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_RDFS_IRI);
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())
/// Filter to sort subjects by prefix
///
/// Each prefix becomes a category.
/// This filter has a list of hardcoded prefixes that it will place in front of the other prefixes.
/// This filter returns a tuple of two vectors:
/// 1. the list of names for each prefix/category
/// 2. the index of the prefix/category assigned to each subject
pub(crate) 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
.iter()
.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
.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() + special_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))