UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

51 lines (50 loc) 2.29 kB
import { RelativeTimeTextBuilder } from "../text/RelativeTimeTextBuilder.js"; import { UrlUtil } from "../../util/url/UrlUtil.js"; import { TimeReplacer } from "./TimeReplacer.js"; export class TimeRenderer { constructor(urlBuilder, textBuilder) { this.urlBuilder = urlBuilder; this.textBuilder = textBuilder; this.relativeTextBuilder = new RelativeTimeTextBuilder(textBuilder); } render(context, previousContext, options = { url: true, contentOnly: false }) { const { result, replacement } = this.renderContent(context, previousContext, options); if (!options.contentOnly) { const timeMessages = context.messages.context.time; const time = context.time; const message = time.getDayOfMonth() ? timeMessages.on : timeMessages.in; result.append(message(time.approximate)); } result.append(replacement); return result; } renderContent(context, previousContext, options, renderOptions = this.textBuilder.options) { const time = context.time; const date = time.date; const absoluteTimeUrl = this.urlBuilder.fromEdtf(date); const title = this.textBuilder.build(context, renderOptions); const text = (previousContext ? this.relativeTextBuilder.build(previousContext, context) : undefined) || title; const file = context.file; const currentFileName = file.name; const doc = file.document; let replacement; const timeEl = TimeReplacer.resolvedTime(context, date.toString()); if (title !== text) { timeEl.title = title; } timeEl.textContent = text; const dirName = currentFileName.substring(0, currentFileName.indexOf("/index")); const existingUrl = options.url && this.urlBuilder.matchExistingTimeFile(absoluteTimeUrl); if (existingUrl && existingUrl !== dirName) { const a = replacement = doc.createElement("a"); a.href = UrlUtil.absolute(existingUrl); a.append(timeEl); } else { replacement = timeEl; } const result = file.document.createElement("span"); result.className = "time-resolved"; return { result, replacement }; } }