@rr0/cms
Version:
RR0 Content Management System (CMS)
51 lines (50 loc) • 2.29 kB
JavaScript
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 };
}
}