diff options
author | (quasar) nebula <towerofnix@gmail.com> | 2021-02-06 13:24:26 -0400 |
---|---|---|
committer | (quasar) nebula <towerofnix@gmail.com> | 2021-02-06 13:40:27 -0400 |
commit | 32ab33828c3fb3e5b62e811d61b2a6a45c1e1390 (patch) | |
tree | 7b27aa606ae31ac607af706884268465ee0df7eb | |
parent | 978c10394cacfea79982e2f0d4c0842cccd766bd (diff) |
generate individual news entry pages
-rw-r--r-- | static/site.css | 6 | ||||
-rwxr-xr-x | upd8.js | 109 |
2 files changed, 87 insertions, 28 deletions
diff --git a/static/site.css b/static/site.css index 585fca05..bf3303a3 100644 --- a/static/site.css +++ b/static/site.css @@ -313,11 +313,13 @@ footer > :last-child { margin-bottom: 5px; } -.sidebar article h2 { +.sidebar article h2, +.news-index h2 { border-bottom: 1px dotted white; } -.sidebar article h2 time { +.sidebar article h2 time, +.news-index time { float: right; font-weight: normal; } diff --git a/upd8.js b/upd8.js index 5ff1a8b6..a837bef0 100755 --- a/upd8.js +++ b/upd8.js @@ -954,9 +954,9 @@ async function processNewsDataFile(file) { return {error: 'Expected "Name" field!'}; } - const id = getBasicField(section, 'ID'); - if (!id) { - return {error: 'Expected "ID" field!'}; + const directory = getBasicField(section, 'Directory') || getBasicField(section, 'ID'); + if (!directory) { + return {error: 'Expected "Directory" field!'}; } let body = getMultilineField(section, 'Body'); @@ -979,10 +979,10 @@ async function processNewsDataFile(file) { return { name, + directory, body, bodyShort, - date, - id + date }; }); } @@ -1822,9 +1822,9 @@ async function writeHomepage() { <h1>News</h1> ${newsData.slice(0, 3).map((entry, i) => fixWS` <article ${classes('news-entry', i === 0 && 'first-news-entry')}> - <h2><time>${getDateString(entry)}</time> <a href="${C.NEWS_DIRECTORY}/#${entry.id}">${entry.name}</a></h2> + <h2><time>${getDateString(entry)}</time> <a href="${C.NEWS_DIRECTORY}/${entry.directory}/">${entry.name}</a></h2> ${transformMultiline(entry.bodyShort)} - ${entry.bodyShort !== entry.body && `<a href="${C.NEWS_DIRECTORY}/#${entry.id}">(View rest of entry!)</a>`} + ${entry.bodyShort !== entry.body && `<a href="${C.NEWS_DIRECTORY}/${entry.directory}/">(View rest of entry!)</a>`} </article> `).join('\n')} ` : `<p><i>News requested in content description but this feature isn't enabled</i></p>`) @@ -1852,6 +1852,77 @@ async function writeHomepage() { }); } +function writeNewsPages() { + if (!wikiInfo.features.news) { + return; + } + + return progressPromiseAll('Writing news pages.', queue([ + writeNewsIndex, + ...newsData.map(curry(writeNewsPage)) + ], queueSize)); +} + +async function writeNewsIndex() { + await writePage([C.NEWS_DIRECTORY], { + title: 'News', + main: { + content: fixWS` + <div class="long-content news-index"> + <h1>News</h1> + ${newsData.map(entry => fixWS` + <article id="${entry.directory}"> + <h2><time>${getDateString(entry)}</time> <a href="${C.NEWS_DIRECTORY}/${entry.directory}/">${entry.name}</a></h2> + ${transformMultiline(entry.bodyShort)} + ${entry.bodyShort !== entry.body && `<p><a href="${C.NEWS_DIRECTORY}/${entry.directory}/">(View rest of entry!)</a></p>`} + </article> + `).join('\n')} + </div> + ` + }, + nav: { + links: [ + ['./', wikiInfo.shortName], + [`${C.NEWS_DIRECTORY}/`, 'News'] + ] + } + }); +} + +async function writeNewsPage(entry) { + // The newsData list is sorted reverse chronologically (newest ones first), + // so the way we find next/previous entries is flipped from normal. + const index = newsData.indexOf(entry) + const previous = newsData[index + 1]; + const next = newsData[index - 1]; + const nextPreviousLinks = [ + previous && `<a href="${C.NEWS_DIRECTORY}/${previous.directory}/" id="previous-button" title="${previous.name}">Previous</a>`, + next && `<a href="${C.NEWS_DIRECTORY}/${next.directory}/" id="next-button" title="${next.name}">Next</a>` + ].filter(Boolean).join(', '); + + await writePage([C.NEWS_DIRECTORY, entry.directory], { + title: `News - ${entry.name}`, + main: { + content: fixWS` + <div class="long-content"> + <h1>${entry.name}</h1> + <p>(Published ${getDateString(entry)}.)</p> + ${transformMultiline(entry.body)} + </div> + ` + }, + nav: { + links: [ + ['./', wikiInfo.shortName], + [`${C.NEWS_DIRECTORY}/`, 'News'], + [null, getDateString(entry) + ':'], + [`${C.NEWS_DIRECTORY}/${entry.directory}/`, entry.name], + nextPreviousLinks && [null, `(${nextPreviousLinks})`] + ] + } + }); +} + function writeMiscellaneousPages() { return progressPromiseAll('Writing miscellaneous pages.', [ writeHomepage(), @@ -1904,25 +1975,6 @@ function writeMiscellaneousPages() { nav: {simple: true} }), - wikiInfo.features.news && - writePage([C.NEWS_DIRECTORY], { - title: 'News', - main: { - content: fixWS` - <div class="long-content"> - <h1>News</h1> - ${newsData.map(entry => fixWS` - <article id="${entry.id}"> - <h2><a href="#${entry.id}">${getDateString(entry)} - ${entry.name}</a></h2> - ${transformMultiline(entry.body)} - </article> - `).join('\n')} - </div> - ` - }, - nav: {simple: true} - }), - writeFile(path.join(outputPath, 'data.json'), fixWS` { "albumData": ${stringifyAlbumData()}, @@ -4062,6 +4114,9 @@ async function main() { } return; } + + C.sortByDate(newsData); + newsData.reverse(); } { @@ -4301,6 +4356,7 @@ async function main() { group: {type: 'flag'}, list: {type: 'flag'}, misc: {type: 'flag'}, + news: {type: 'flag'}, static: {type: 'flag'}, tag: {type: 'flag'}, track: {type: 'flag'}, @@ -4313,6 +4369,7 @@ async function main() { await writeSymlinks(); if (buildAll || buildFlags.misc) await writeMiscellaneousPages(); if (buildAll || buildFlags.static) await writeStaticPages(); + if (buildAll || buildFlags.news) await writeNewsPages(); if (buildAll || buildFlags.list) await writeListingPages(); if (buildAll || buildFlags.tag) await writeTagPages(); if (buildAll || buildFlags.group) await writeGroupPages(); |