@rr0/cms
Version:
RR0 Content Management System (CMS)
111 lines (110 loc) • 4.57 kB
JavaScript
import { TimeReplacer } from "./TimeReplacer.js";
/**
* Creates <time> elements from time strings.
*/
export class TimeElementFactory {
constructor(renderer) {
this.renderer = renderer;
}
create(context, previousContext, options) {
let replacement;
const time = context.time;
const interval = time.interval;
if (interval) {
const fromContext = context.clone();
fromContext.time.date = interval.start;
let end = interval.end;
if (end) {
const toContext = context.clone();
toContext.time.date = end;
context.time = toContext.time; // Latest date is current date
replacement = this.createInterval(fromContext, toContext, previousContext, options);
}
else {
replacement = this.createStarting(fromContext, previousContext, options);
}
}
if (!replacement) {
replacement = this.valueReplacement(context, previousContext, options);
}
return replacement;
}
createInterval(fromContext, toContext, previousContext, options) {
let replacement;
const startReplacement = this.valueReplacement(fromContext, previousContext, options);
if (startReplacement) {
const endReplacement = this.valueReplacement(toContext, previousContext, options);
if (endReplacement && endReplacement.outerHTML !== startReplacement.outerHTML) {
replacement = fromContext.file.document.createElement("span");
replacement.className = "time-interval";
replacement.innerHTML = fromContext.messages.context.time.fromTo(startReplacement.outerHTML, endReplacement.outerHTML);
}
}
return replacement;
}
createStarting(fromContext, previousContext, options) {
const { result, replacement } = this.renderer.renderContent(fromContext, previousContext, options);
let startingReplacement;
startingReplacement = fromContext.file.document.createElement("span");
startingReplacement.className = "time-interval";
const approximate = !fromContext.time.getDayOfMonth();
startingReplacement.innerHTML = fromContext.messages.context.time.starting(approximate) + " " + result.outerHTML;
result.append(startingReplacement, replacement);
return result;
}
valueReplacement(context, previousContext, options = { url: true, contentOnly: false }) {
let replacement;
if (context.time.duration) {
replacement = this.durationReplacement(context);
}
else {
replacement = this.dateTimeReplacement(context, previousContext, options);
}
return replacement;
}
durationReplacement(context) {
const duration = context.time.duration;
const items = [];
const messages = context.messages.context.time.duration;
const datetime = duration.toString();
const spec = duration.toSpec();
const days = spec.days;
if (days) {
items.push(messages.days(days.value));
}
const hours = spec.hours;
if (hours) {
items.push(messages.hours(hours.value));
}
const minutes = spec.minutes;
if (minutes) {
items.push(messages.minutes(minutes.value));
}
const seconds = spec.seconds;
if (seconds) {
items.push(messages.seconds(seconds.value));
}
let replacement;
if (items.length > 0) {
let replacementStr = items.join(", ");
if (items.length > 1) {
let last = replacementStr.lastIndexOf(", ");
replacementStr = replacementStr.substring(0, last) + messages.lastSeparator + items[items.length - 1];
}
if (context.time.approximate) {
replacementStr = messages.approximate(replacementStr);
}
replacement = TimeReplacer.resolvedTime(context, datetime);
replacement.classList.add("duration");
replacement.textContent = replacementStr;
}
return replacement;
}
dateTimeReplacement(context, previousContext, options = { url: true, contentOnly: false }) {
let replacement = undefined;
if (context.time.isDefined()) {
replacement = this.renderer.render(context, previousContext, options);
}
return replacement;
}
}