From 6f2f61c1330dbd48a1fdbc564a0fec50a59f2d88 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 3 Jun 2021 12:41:49 -0300 Subject: module-ify news pages & index; new page module fns --- src/page/news.js | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/page/news.js (limited to 'src/page/news.js') diff --git a/src/page/news.js b/src/page/news.js new file mode 100644 index 00000000..99cbe8d5 --- /dev/null +++ b/src/page/news.js @@ -0,0 +1,129 @@ +// News entry & index page specifications. + +// Imports + +import fixWS from 'fix-whitespace'; + +// Page exports + +export function condition({wikiData}) { + return wikiData.wikiInfo.features.news; +} + +export function targets({wikiData}) { + return wikiData.newsData; +} + +export function write(entry, {wikiData}) { + const page = { + type: 'page', + path: ['newsEntry', entry.directory], + page: ({ + generatePreviousNextLinks, + link, + strings, + transformMultiline, + }) => ({ + title: strings('newsEntryPage.title', {entry: entry.name}), + + main: { + content: fixWS` +
+

${strings('newsEntryPage.title', {entry: entry.name})}

+

${strings('newsEntryPage.published', {date: strings.count.date(entry.date)})}

+ ${transformMultiline(entry.body)} +
+ ` + }, + + nav: generateNewsEntryNav(entry, { + generatePreviousNextLinks, + link, + strings, + wikiData + }) + }) + }; + + return [page]; +} + +export function writeTargetless({wikiData}) { + const { newsData } = wikiData; + + const page = { + type: 'page', + path: ['newsIndex'], + page: ({ + link, + strings, + transformMultiline + }) => ({ + title: strings('newsIndex.title'), + + main: { + content: fixWS` +
+

${strings('newsIndex.title')}

+ ${newsData.map(entry => fixWS` +
+

${link.newsEntry(entry)}

+ ${transformMultiline(entry.bodyShort)} + ${entry.bodyShort !== entry.body && `

${link.newsEntry(entry, { + text: strings('newsIndex.entry.viewRest') + })}

`} +
+ `).join('\n')} +
+ ` + }, + + nav: {simple: true} + }) + }; + + return [page]; +} + +// Utility functions + +function generateNewsEntryNav(entry, { + generatePreviousNextLinks, + link, + strings, + wikiData +}) { + const { wikiInfo, newsData } = wikiData; + + // The newsData list is sorted reverse chronologically (newest ones first), + // so the way we find next/previous entries is flipped from normal. + const previousNextLinks = generatePreviousNextLinks(entry, { + link, strings, + data: newsData.slice().reverse(), + linkKey: 'newsEntry' + }); + + return { + links: [ + { + path: ['localized.home'], + title: wikiInfo.shortName + }, + { + path: ['localized.newsIndex'], + title: strings('newsEntryPage.nav.news') + }, + { + html: strings('newsEntryPage.nav.entry', { + date: strings.count.date(entry.date), + entry: link.newsEntry(entry, {class: 'current'}) + }) + }, + previousNextLinks && + { + divider: false, + html: `(${previousNextLinks})` + } + ] + }; +} -- cgit 1.3.0-6-gf8a5