UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

70 lines (69 loc) 2.72 kB
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); } } }