import { print } from '@entryscape/rdfjson';
/**
* A module that contain utility methods for generating html for entries.
*
* @exports store/html
* @namespace
*/
const html = {};
// The above construction seem to be needed because of jsdoc3 issues with not detecting the
// exports variable.
/**
* Generates a table with columns subject, predicate, and object.
* @param {Entry} entry to expose metadata for
* @returns {string} rendered html as a string
*/
html.metadataTable = (entry) => {
const delegates = print.prettyTree(
entry.getMetadata(),
entry.getResourceURI()
);
const arr = [];
for (let i = 0; i < delegates.length; i++) {
const d = delegates[i];
const st = d.stmt;
arr.push(
`${'<tr>' + "<td class='rdf_subject'>"}${
st.isSubjectBlank() ? d.s : `<a href='${st.getSubject()}'>${d.s}</a>`
}</td>` +
`<td class='rdf_predicate'><a href='${st.getPredicate()}'>${d.p}</a></td>` +
`<td class='rdf_object'>${
st.getType() === 'uri' ? `<a href='${st.getValue()}'>${d.o}</a>` : d.o
}</td></tr>`
);
}
return arr.join('\n');
};
const _ind = {};
const indenter = function (indent) {
if (!_ind[indent]) {
let str = '';
for (let i = 1; i < indent; i++) {
str += "<span class='rdf_indent'></span>";
}
_ind[indent] = str;
}
return _ind[indent];
};
/**
* Prints one level of triples from a subject where URIs are namespaced.
*
* @param {rdfjson/Graph} graph the graph containing the metadata
* @param {string} subject URI to a resource to start from
* @returns {string} string with the triples rendered as HTML.
*/
html.metadataIndent = function (graph, subject) {
const delegates = print.prettyTree(graph, subject);
const arr = [];
for (let i = 0; i < delegates.length; i++) {
const d = delegates[i];
const st = d.stmt;
arr.push(
`<div class='rdf_statement'>${indenter(d.indent)}<span class='rdf_subject'>${
st.isSubjectBlank() ? d.s : `<a href='${st.getSubject()}'>${d.s}</a>`
}</span>` +
`<span class='rdf_predicate'><a href='${st.getPredicate()}'>${d.p}</a></span>` +
`<span class='rdf_object'>${
st.getType() === 'uri' ? `<a href='${st.getValue()}'>${d.o}</a>` : d.o
}</span></div>`
);
}
return arr.join('\n');
};
/**
* Prints the three types of the entry, i.e. entry, resource and graphtype.
* @param {EntryInfo} entryInfo
* @returns {string}
*/
html.entryInfo = (entryInfo) =>
`<span class='info entrytype'><label>EntryType:</label> ${entryInfo.getEntryType()}</span>` +
`<span class='info resourceType'><label>ResourceType:</label> ${entryInfo.getResourceType()}</span>` +
`<span class='info graphType'><label>GraphType:</label> ${entryInfo.getGraphType()}</span>`;
/**
* Prints information about the entry, including entryinfo, metadata, cached external metadata
* as well as which context the entry belongs to.
*
* @param {Entry} entry
* @returns {string} information about the entry as a HTML string.
*/
html.print = (entry) => {
const strs = [
`${
"<div class='entry'>" + "<h3>Context: <a class='contextURI' href='"
}${entry.getContext().getEntryURI()}'>${entry.getContext().getId()}</a> <span></span> ` +
`Entry: <a class='entryURI' href='${entry.getURI()}'>${entry.getId()}</a></h3>` +
'<div>' +
`<div class='entryInfo'>${html.entryInfo(entry.getEntryInfo())}</div>`,
];
const md = entry.getMetadata();
if (md && !md.isEmpty()) {
strs.push(
`<h4>Local metadata:</h4><div class='metadata'>${html.metadataIndent(md, entry.getResourceURI())}</div>`
);
}
const emd = entry.getCachedExternalMetadata();
if (emd && !emd.isEmpty()) {
strs.push(
`<h4>Cached external metadata:</h4><div class='metadata'>${html.metadataIndent(emd, entry.getResourceURI())}</div>`
);
}
strs.push('</div></div>');
return strs.join('');
};
export default html;