UNPKG

@rr0/cms

Version:

RR0 Content Management System (CMS)

45 lines (44 loc) 1.94 kB
/** * Adds an "abstract" HTML paragraph from a <meta name="description">, if any. */ export class DescriptionReplaceCommand { constructor(defaultDescription, abstractClass = "abstract") { this.defaultDescription = defaultDescription; this.abstractClass = abstractClass; } async execute(context) { const file = context.file; const inDescription = file.meta.description; const outDoc = file.document; let descriptionMeta = outDoc.head.querySelector("meta[name='description']"); if (!descriptionMeta) { const existingAbstract = outDoc.querySelector(`.${this.abstractClass}`); let outDescription; if (existingAbstract) { outDescription = inDescription || existingAbstract.textContent.toString(); } else if (inDescription) { const abstractFromDescription = outDoc.createElement("p"); abstractFromDescription.className = this.abstractClass; abstractFromDescription.textContent = inDescription; const body = outDoc.body; body.insertBefore(abstractFromDescription, body.firstChild); outDescription = inDescription; } else { outDescription = this.defaultDescription; } outDescription = outDescription.replace(/\s{2,}/g, " "); file.meta.description = outDescription; const descriptionMeta = outDoc.createElement("meta"); descriptionMeta.name = "description"; descriptionMeta.content = file.meta.description; outDoc.head.append(descriptionMeta); const docType = outDoc.doctype ? `<!DOCTYPE ${outDoc.doctype.name}>` : ""; context.file.contents = `${docType}${outDoc.documentElement.outerHTML}`; } } async contentStepEnd() { // NOP } }