@rr0/cms
Version:
RR0 Content Management System (CMS)
55 lines (54 loc) • 2.58 kB
JavaScript
import { DomReplaceCommand } from "ssg-api";
/**
* Determine page language and ddd links to page language variants,
*/
export class LanguageReplaceCommand extends DomReplaceCommand {
constructor() {
super("#alternate", undefined);
}
async createReplacer(context) {
return new class {
async replace(original) {
if (!original.hasChildNodes()) {
const inputFile = context.file;
const fileName = inputFile.name;
const langInfo = inputFile.lang;
const variants = langInfo.variants;
let fileLang = langInfo.lang;
let pageLang;
const hasEnglishVariant = variants.includes("en");
if (hasEnglishVariant) {
pageLang = fileLang ? fileLang : "fr";
}
else if (variants.includes("fr")) {
if (fileLang && fileLang !== "fr") {
pageLang = fileLang;
}
else {
pageLang = "en";
fileLang = fileName.includes("_" + pageLang) ? pageLang : "";
}
}
else {
pageLang = "fr";
}
inputFile.document.documentElement.lang = inputFile.lang.lang = pageLang;
const langVariants = variants.length == 1 && variants[0] == "" ? [pageLang == "fr" ? "en" : "fr"] : variants;
const doc = inputFile.document;
for (let i = 0; i < langVariants.length; i++) {
const langVariant = langVariants[i];
const altLink = doc.createElement("a");
const toReplace = (fileLang ? "_" + fileLang : "") + ".";
let replacement = `${variants[i] == "" ? "" : "_" + langVariant}.`;
altLink.href = "/" + fileName.replace(toReplace, replacement);
const altText = langVariant === "en" ? "English version" : "Version française";
altLink.textContent = Buffer.from(altText, "utf-8").toString();
original.appendChild(altLink);
context.debug("Added translation link", original.outerHTML, "in", fileName);
}
}
return original;
}
};
}
}