// Listing page specification. // // The targets here are a bit different than for most pages: rather than data // objects loaded from text files in the wiki data directory, they're hard- // coded specifications, with various JS functions for processing wiki data // and turning it into user-readable HTML listings. // // Individual listing specs are described in src/listing-spec.js, but are // provided via wikiData like other (normal) data objects. // Imports import fixWS from 'fix-whitespace'; import * as html from '../util/html.js'; import { UNRELEASED_TRACKS_DIRECTORY } from '../util/magic-constants.js'; import { getTotalDuration } from '../util/wiki-data.js'; // Page exports export function condition({wikiData}) { return wikiData.wikiInfo.features.listings; } export function targets({wikiData}) { return wikiData.listingSpec; } export function write(listing, {wikiData}) { if (listing.condition && !listing.condition({wikiData})) { return null; } const { wikiInfo } = wikiData; const data = (listing.data ? listing.data({wikiData}) : null); const page = { type: 'page', path: ['listing', listing.directory], page: opts => { const { link, strings } = opts; return { title: listing.title({strings}), main: { content: fixWS`
${strings('listingIndex.infoLine', { wiki: wikiInfo.name, tracks: `${strings.count.tracks(releasedTracks.length, {unit: true})}`, albums: `${strings.count.albums(releasedAlbums.length, {unit: true})}`, duration: `${strings.count.duration(duration, {approximate: true, unit: true})}` })}
${strings('listingIndex.exploreList')}
${generateLinkIndexForListings(null, {link, strings, wikiData})} ` }, sidebarLeft: { content: generateSidebarForListings(null, {link, strings, wikiData}) }, nav: {simple: true} }) }; return [page]; }; // Utility functions function generateSidebarForListings(currentListing, {link, strings, wikiData}) { return fixWS`