html.js

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;