import fs from 'node:fs'; import mustache from 'mustache'; import loadSVG from './load-svg.mjs'; import getRSS from './rss.mjs'; import loadMD from './loadMD.mjs'; import {cmpArticles} from './article.mjs'; import i18n from './i18n.mjs'; import {addDescription} from './i18n.mjs'; const leftPanelTmpl = fs.readFileSync('src/templates/left.tmpl', 'utf8'); const likesTmpl = fs.readFileSync('src/templates/likes.tmpl', 'utf8'); const headerTmpl = fs.readFileSync('src/templates/header.tmpl', 'utf8'); const articleTmpl = fs.readFileSync('src/templates/article.tmpl', 'utf8'); const indexTmpl = fs.readFileSync('src/templates/index.tmpl', 'utf8'); const tagTmpl = fs.readFileSync('src/templates/tag.tmpl', 'utf8'); const hidTmpl = fs.readFileSync('src/templates/hid.tmpl', 'utf8'); const baseUrl = 'https://ache.one/'; const partials = { header: headerTmpl, leftPanel: leftPanelTmpl, likesButton: likesTmpl, hid: hidTmpl, }; // Load global variables const svg = loadSVG(); for (const lang in i18n) { const tagsArticle = new Map(); const articles = loadMD(i18n[lang].articles, 'articles', lang); for (const article of articles) { const context = { svg, page_title: `${article.title} - ache`, title: i18n[lang].title, intro: i18n[lang].intro, lang, canonical: `${baseUrl}${article.url.slice(1)}`, content: article.content, title: i18n[lang].title, metaData: article.metaData, alt_lang: addDescription(article.metaData.alt_lang), }; const output = mustache.render(articleTmpl, context, partials); console.log(`Create : ${article.title}`); fs.writeFileSync(`articles/${article.name}.html`, output); for (const tag of article.metaData.tags) { if (tagsArticle.has(tag)) { tagsArticle.get(tag).push(article); } else { tagsArticle.set(tag, [article]); } } } // Set of pages language dependant try { fs.mkdirSync(`${lang}/tag`, {recursive: true}); } catch { fs.rmSync(`${lang}/tag`, {force: true, recursive: true}); fs.mkdirSync(`${lang}/tag`, {recursive: true}); } for (const [tag, articles] of tagsArticle.entries()) { console.log(`Create tag page : ${lang}/${tag}.html`); articles.sort(cmpArticles); const context = { svg, page_title: `ache - Tag: ${tag}`, title: i18n[lang].title, intro: i18n[lang].intro, lang, tag, articles, }; const output = mustache.render(tagTmpl, context, partials); fs.writeFileSync(`${lang}/tag/${tag}.html`, output); } console.log(`Create RSS Flux: ${lang}/rss.xml`); const xmlFeed = getRSS(articles, baseUrl); fs.writeFileSync(`${lang}/rss.xml`, xmlFeed); { const alt_lang = { fr: { lang: 'en', url: '/en/', }, en: { lang: 'fr', url: '/fr/', }, }; const context = { page_title: i18n[lang].title.main, title: i18n[lang].title, intro: i18n[lang].intro, lang, canonical: baseUrl, svg, articles, alt_lang: [alt_lang[lang]], }; console.log(`Create : Home page ${lang}`); const output = mustache.render(indexTmpl, context, partials); fs.writeFileSync(`${lang}/index.html`, output); } }