This commit is contained in:
2026-08-26 20:43:01 -04:00
parent 948b415d5a
commit a8938176be
4 changed files with 50 additions and 17 deletions
+15 -7
View File
@@ -1,6 +1,6 @@
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::Display; use std::fmt::Display;
use oxigraph::model::{Graph, Literal, NamedNode, NamedNodeRef, NamedOrBlankNode, Term, Triple}; use oxigraph::model::{Graph, Literal, NamedNode, NamedNodeRef, NamedOrBlankNode, Term, TermRef, Triple};
use oxilangtag::LanguageTag; use oxilangtag::LanguageTag;
use url::Url; use url::Url;
use gl_search::Schema; use gl_search::Schema;
@@ -118,25 +118,33 @@ impl Class {
pub fn next_url(&self) -> Option<Url> { pub fn next_url(&self) -> Option<Url> {
match self { match self {
Class::Work => Some(Url::parse("http://fedora.quill.lan/rest/#Work").unwrap()), Class::Work => Some(Url::parse("http://fedora.quill.lan/rest/#Work").unwrap()),
Class::Person => Some(Url::parse("http://fedora.quill.lan/rest/#Agent").unwrap()),
Class::CorporateBody => Some(Url::parse("http://fedora.quill.lan/rest/#Agent").unwrap()),
Class::Expression => Some(Url::parse("http://fedora.quill.lan/rest/#Expression").unwrap()),
Class::Manifestation => Some(Url::parse("http://fedora.quill.lan/rest/#Manifestation").unwrap()),
_ => None, _ => None,
} }
} }
pub fn template(&self, subject: NamedNode) -> Graph { pub fn template(&self, subject: NamedNode) -> Graph {
let empty_english_string = Term::Literal(Literal::new_language_tagged_literal_unchecked("", "en")); let empty_english_string_term = Term::Literal(Literal::new_language_tagged_literal_unchecked("", "en"));
let empty_node = Term::NamedNode(NamedNode::new_unchecked("#")); let empty_string_term = Term::Literal(Literal::new_simple_literal(""));
let empty_node = NamedNode::new_unchecked("");
let hash_node = NamedNode::new_unchecked("#");
match self { match self {
Class::RdfProperty => Graph::new(), Class::RdfProperty => Graph::new(),
Class::RdfsClass => Graph::new(), Class::RdfsClass => Graph::new(),
Class::SkosConcept => Graph::new(), Class::SkosConcept => Graph::new(),
Class::Work => Graph::from_iter([ Class::Work => Graph::from_iter([
Triple::new(NamedOrBlankNode::NamedNode(subject), vocab::rdawd::TITLE_OF_WORK, empty_english_string) Triple::new(NamedOrBlankNode::NamedNode(subject), vocab::rdawd::TITLE_OF_WORK, empty_english_string_term)
]), ]),
Class::Person => Graph::from_iter([ Class::Person => Graph::from_iter([
Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaao::IDENTIFIER_FOR_PERSON, empty_node), Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaad::GIVEN_NAME, empty_english_string_term.clone()),
Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaad::GIVEN_NAME, empty_english_string.clone()), Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaad::SURNAME, empty_english_string_term),
Triple::new(NamedOrBlankNode::NamedNode(subject), vocab::rdaad::SURNAME, empty_english_string), Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdaao::IDENTIFIER_FOR_PERSON, Term::NamedNode(hash_node.clone())),
Triple::new(NamedOrBlankNode::NamedNode(hash_node.clone()), vocab::rdano::SCHEME_OF_NOMEN, Term::NamedNode(empty_node)),
Triple::new(NamedOrBlankNode::NamedNode(subject.clone()), vocab::rdand::NOMEN_STRING, empty_string_term),
]), ]),
Class::CorporateBody => Graph::new(), Class::CorporateBody => Graph::new(),
Class::Expression => Graph::new(), Class::Expression => Graph::new(),
+4 -3
View File
@@ -19,9 +19,10 @@ pub static PREFIXES: LazyLock<BTreeMap<String, String>> = LazyLock::new(|| {
"http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#", "http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#",
), ),
("prov", "http://www.w3.org/ns/prov#"), ("prov", "http://www.w3.org/ns/prov#"),
("locid", "http://id.loc.gov/vocabulary/identifiers/"), ("lcid", "http://id.loc.gov/vocabulary/identifiers/"),
("locname", "http://id.loc.gov/authorities/names/"), ("lca", "http://id.loc.gov/authorities/"),
("loclang", "http://id.loc.gov/vocabulary/languages/"), ("lcn", "http://id.loc.gov/authorities/names/"),
("lclang", "http://id.loc.gov/vocabulary/languages/"),
("viaf", "http://viaf.org/viaf/"), ("viaf", "http://viaf.org/viaf/"),
("premis", "http://www.loc.gov/premis/rdf/v1#"), ("premis", "http://www.loc.gov/premis/rdf/v1#"),
("premis3", "http://www.loc.gov/premis/rdf/v3/"), ("premis3", "http://www.loc.gov/premis/rdf/v3/"),
+14
View File
@@ -86,4 +86,18 @@ pub mod rdamd {
pub const TITLE_OF_MANIFESTATION: NamedNodeRef = pub const TITLE_OF_MANIFESTATION: NamedNodeRef =
NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/m/datatype/P30335"); NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/m/datatype/P30335");
}
pub mod rdand {
use oxigraph::model::NamedNodeRef;
pub const NOMEN_STRING: NamedNodeRef =
NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/n/datatype/P80068");
}
pub mod rdano {
use oxigraph::model::NamedNodeRef;
pub const SCHEME_OF_NOMEN: NamedNodeRef =
NamedNodeRef::new_unchecked("http://rdaregistry.info/Elements/n/object/P80069");
} }
+17 -7
View File
@@ -37,7 +37,7 @@ pub(crate) enum Message {
CacheDatatypes(HashMap<NamedNode, ResourceDescription>), CacheDatatypes(HashMap<NamedNode, ResourceDescription>),
CacheReadOnlyEntities(HashSet<ReadOnlyEntity>), CacheReadOnlyEntities(HashSet<ReadOnlyEntity>),
PopulateCaches, PopulateCaches,
LookupResourceDescriptions(Vec<NamedNode>), LookupResourceDescriptions(HashSet<NamedNode>),
CacheResourceDescriptions(HashMap<NamedNode, ResourceDescription>), CacheResourceDescriptions(HashMap<NamedNode, ResourceDescription>),
WindowClosed(window::Id), WindowClosed(window::Id),
URLInputChanged(String), URLInputChanged(String),
@@ -409,7 +409,7 @@ impl Publisher {
} }
Message::SearchResultClicked(node) => { Message::SearchResultClicked(node) => {
if let Some(search_state) = &self.search_state { if let Some(search_state) = &self.search_state {
task = task.chain(Task::done(Message::LookupResourceDescriptions(vec![node.clone()]))); task = task.chain(Task::done(Message::LookupResourceDescriptions(HashSet::from_iter([node.clone()]))));
match search_state.action { match search_state.action {
SearchResultClickAction::URLInput => { SearchResultClickAction::URLInput => {
@@ -545,12 +545,22 @@ impl Publisher {
} }
Message::NewDocument(class, Some(url)) => { Message::NewDocument(class, Some(url)) => {
let mut document: RdfSource<KeyedDataset<RowState>> = RdfSource::new(url.clone()); let mut document: RdfSource<KeyedDataset<RowState>> = RdfSource::new(url.clone());
let mut quad = document.new_quad(); let mut nodes_to_look_up = HashSet::new();
quad.predicate = vocab::rdf::TYPE.into_owned(); let document_node = NamedNode::new_unchecked(url.as_str());
quad.object = Term::NamedNode(class.to_named_node().into_owned()); for triple in &class.template(document_node) {
document.dataset_mut().quads.insert(quad); let quad = document.quad_from_triple(triple.into_owned());
document.dataset_mut().quads.insert(quad);
task = Task::done(Message::HideNewDocumentButtons) if triple.predicate == vocab::rdf::TYPE &&
let TermRef::NamedNode(node) = triple.object {
nodes_to_look_up.insert(node.into_owned());
} else {
nodes_to_look_up.insert(triple.predicate.into_owned());
}
}
task = Task::done(Message::LookupResourceDescriptions(nodes_to_look_up))
.chain(Task::done(Message::HideNewDocumentButtons))
.chain(Task::done(Message::URLInputChanged(url.to_string()))) .chain(Task::done(Message::URLInputChanged(url.to_string())))
.chain(Task::done(Message::LoadDocument(document))); .chain(Task::done(Message::LoadDocument(document)));
} }