// Track page specification. // Imports import fixWS from 'fix-whitespace'; import { generateAlbumChronologyLinks, generateAlbumNavLinks, generateAlbumSidebar } from './album.js'; import * as html from '../util/html.js'; import { OFFICIAL_GROUP_DIRECTORY, UNRELEASED_TRACKS_DIRECTORY } from '../util/magic-constants.js'; import { bindOpts } from '../util/sugar.js'; import { getTrackCover, getAlbumListTag, sortByDate } from '../util/wiki-data.js'; // Page exports export function targets({wikiData}) { return wikiData.trackData; } export function write(track, {wikiData}) { const { groupData, wikiInfo } = wikiData; const { album } = track; const tracksThatReference = track.referencedBy; const useDividedReferences = groupData.some(group => group.directory === OFFICIAL_GROUP_DIRECTORY); const ttrFanon = (useDividedReferences && tracksThatReference.filter(t => t.album.groups.every(group => group.directory !== OFFICIAL_GROUP_DIRECTORY))); const ttrOfficial = (useDividedReferences && tracksThatReference.filter(t => t.album.groups.some(group => group.directory === OFFICIAL_GROUP_DIRECTORY))); const tracksReferenced = track.references; const otherReleases = track.otherReleases; const listTag = getAlbumListTag(album); let flashesThatFeature; if (wikiInfo.features.flashesAndGames) { flashesThatFeature = sortByDate([track, ...otherReleases] .flatMap(track => track.flashes.map(flash => ({flash, as: track})))); } const unbound_generateTrackList = (tracks, {getArtistString, link, strings}) => html.tag('ul', tracks.map(track => { const line = strings('trackList.item.withArtists', { track: link.track(track), by: `${strings('trackList.item.withArtists.by', { artists: getArtistString(track.artists) })}` }); return (track.aka ? `
${[
strings('releaseInfo.by', {
artists: getArtistString(track.artists, {
showContrib: true,
showIcons: true
})
}),
track.coverArtists && strings('releaseInfo.coverArtBy', {
artists: getArtistString(track.coverArtists, {
showContrib: true,
showIcons: true
})
}),
album.directory !== UNRELEASED_TRACKS_DIRECTORY && strings('releaseInfo.released', {
date: strings.count.date(track.date)
}),
+track.coverArtDate !== +track.date && strings('releaseInfo.artReleased', {
date: strings.count.date(track.coverArtDate)
}),
track.duration && strings('releaseInfo.duration', {
duration: strings.count.duration(track.duration)
})
].filter(Boolean).join('
\n')}
${ (track.urls.length ? strings('releaseInfo.listenOn', { links: strings.list.or(track.urls.map(url => fancifyURL(url, {strings}))) }) : strings('releaseInfo.listenOn.noLinks')) }
${otherReleases.length && fixWS`${strings('releaseInfo.alsoReleasedAs')}
${strings('releaseInfo.contributors')}
${transformInline(track.contributors.textContent)}
${strings('releaseInfo.contributors')}
${strings('releaseInfo.tracksReferenced', {track: `${track.name}`})}
${generateTrackList(tracksReferenced)} `} ${tracksThatReference.length && fixWS`${strings('releaseInfo.tracksThatReference', {track: `${track.name}`})}
${useDividedReferences && fixWS`${strings('releaseInfo.flashesThatFeature', {track: `${track.name}`})}
${strings('releaseInfo.lyrics')}
${transformLyrics(track.lyrics)}`} ${hasCommentary && fixWS`
${strings('releaseInfo.artistCommentary')}
${generateCommentary({link, strings, transformMultiline})}`} ` }, sidebarLeft: generateAlbumSidebar(album, track, { fancifyURL, getLinkThemeString, link, strings, transformMultiline, wikiData }), nav: { links: [ {toHome: true}, { path: ['localized.album', album.directory], title: album.name }, listTag === 'ol' ? { html: strings('trackPage.nav.track.withNumber', { number: album.tracks.indexOf(track) + 1, track: link.track(track, {class: 'current', to}) }) } : { html: strings('trackPage.nav.track', { track: link.track(track, {class: 'current', to}) }) }, album.tracks.length > 1 && { divider: false, html: generateAlbumNavLinks(album, track, { generatePreviousNextLinks, strings }) } ].filter(Boolean), content: fixWS`