@rr0/cms
Version:
RR0 Content Management System (CMS)
70 lines (69 loc) • 2.72 kB
JavaScript
import assert from "assert";
import { PlaceRenderer } from "../place/PlaceRenderer.js";
/**
* Render a case summary as HTML.
*/
export class EventRenderer {
constructor(noteRenderer, sourceFactory, sourceRenderer, timeElementFactory) {
this.noteRenderer = noteRenderer;
this.sourceFactory = sourceFactory;
this.sourceRenderer = sourceRenderer;
this.timeElementFactory = timeElementFactory;
this.placeRenderer = new PlaceRenderer();
}
placeElement(context, place) {
const doc = context.file.document;
const placeEl = doc.createElement("span");
placeEl.className = "place";
placeEl.textContent = this.placeRenderer.render(context, place) || "";
return placeEl;
}
async renderEnd(context, event, container) {
const sources = event.sources;
if (sources) {
await this.renderSources(context, sources, container);
}
const notes = event.notes;
if (notes) {
await this.renderNotes(context, notes, container);
}
container.append(".");
}
async render(context, event, container, options = { url: true, contentOnly: false }) {
const eventContext = context.clone();
const eventTime = eventContext.time.date = event.time;
assert.ok(eventTime, `Event of type "${event.type}" has no time`);
container.dataset.time = eventTime.toString();
const timeEl = this.timeElementFactory.create(eventContext, context, options);
container.append(timeEl);
const place = event.place;
if (place) {
container.append(" À ");
container.append(this.placeElement(context, place));
}
container.append(", ", event.description);
const notes = event.notes;
if (notes) {
await this.renderNotes(context, notes, container);
}
const sources = event.sources;
if (sources) {
await this.renderSources(context, sources, container);
}
container.append(".");
}
async renderNotes(context, notes, container) {
for (const noteStr of notes) {
const sourceEl = this.noteRenderer.render(context, noteStr);
container.append(" ", sourceEl);
}
}
async renderSources(context, sources, container) {
for (const source of sources) {
const href = source.url;
const resolvedSource = source.title || !href ? source : await this.sourceFactory.create(context, href.toString());
const sourceEl = this.sourceRenderer.render(context, resolvedSource);
container.append(" ", sourceEl);
}
}
}