diff options
Diffstat (limited to 'src/content/dependencies/generateTrackInfoPage.js')
-rw-r--r-- | src/content/dependencies/generateTrackInfoPage.js | 691 |
1 files changed, 255 insertions, 436 deletions
diff --git a/src/content/dependencies/generateTrackInfoPage.js b/src/content/dependencies/generateTrackInfoPage.js index ec93ab71..ca6f82b9 100644 --- a/src/content/dependencies/generateTrackInfoPage.js +++ b/src/content/dependencies/generateTrackInfoPage.js @@ -1,284 +1,138 @@ -import {sortFlashesChronologically} from '#sort'; -import {empty, stitchArrays} from '#sugar'; - export default { contentDependencies: [ - 'generateAbsoluteDatetimestamp', + 'generateAdditionalNamesBox', 'generateAlbumAdditionalFilesList', 'generateAlbumNavAccent', 'generateAlbumSecondaryNav', 'generateAlbumSidebar', 'generateAlbumStyleRules', - 'generateColorStyleAttribute', - 'generateCommentarySection', + 'generateCommentaryEntry', 'generateContentHeading', 'generateContributionList', + 'generateLyricsSection', 'generatePageLayout', - 'generateRelativeDatetimestamp', - 'generateTrackAdditionalNamesBox', - 'generateTrackChronologyLinks', - 'generateTrackCoverArtwork', + 'generateTrackArtistCommentarySection', + 'generateTrackArtworkColumn', + 'generateTrackInfoPageFeaturedByFlashesList', + 'generateTrackInfoPageOtherReleasesList', 'generateTrackList', 'generateTrackListDividedByGroups', + 'generateTrackNavLinks', 'generateTrackReleaseInfo', 'generateTrackSocialEmbed', 'linkAlbum', - 'linkFlash', 'linkTrack', 'transformContent', ], - extraDependencies: ['html', 'language', 'wikiData'], - - sprawl({wikiInfo}) { - return { - divideTrackListsByGroups: wikiInfo.divideTrackListsByGroups, - enableFlashesAndGames: wikiInfo.enableFlashesAndGames, - }; - }, - - relations(relation, sprawl, track) { - const relations = {}; - const sections = relations.sections = {}; - const {album} = track; - - relations.layout = - relation('generatePageLayout'); - - relations.albumStyleRules = - relation('generateAlbumStyleRules', track.album, track); - - relations.socialEmbed = - relation('generateTrackSocialEmbed', track); - - relations.albumLink = - relation('linkAlbum', track.album); - - relations.trackLink = - relation('linkTrack', track); - - relations.albumNavAccent = - relation('generateAlbumNavAccent', track.album, track); - - relations.trackChronologyLinks = - relation('generateTrackChronologyLinks', track); - - relations.secondaryNav = - relation('generateAlbumSecondaryNav', track.album); - - relations.sidebar = - relation('generateAlbumSidebar', track.album, track); - - const additionalFilesSection = additionalFiles => ({ - heading: relation('generateContentHeading'), - list: relation('generateAlbumAdditionalFilesList', album, additionalFiles), - }); - - // This'll take care of itself being blank if there's nothing to show here. - relations.additionalNamesBox = - relation('generateTrackAdditionalNamesBox', track); - - if (track.hasUniqueCoverArt || album.hasCoverArt) { - relations.cover = - relation('generateTrackCoverArtwork', track); - } - - // Section: Release info - - relations.releaseInfo = - relation('generateTrackReleaseInfo', track); - - // Section: Other releases - - if (!empty(track.otherReleases)) { - const otherReleases = sections.otherReleases = {}; - - otherReleases.heading = - relation('generateContentHeading'); - - otherReleases.colorStyles = - track.otherReleases - .map(track => relation('generateColorStyleAttribute', track.color)); - - otherReleases.trackLinks = - track.otherReleases - .map(track => relation('linkTrack', track)); + extraDependencies: ['html', 'language'], - otherReleases.albumLinks = - track.otherReleases - .map(track => relation('linkAlbum', track.album)); + query: (track) => ({ + mainReleaseTrack: + (track.isMainRelease + ? track + : track.mainReleaseTrack), + }), - otherReleases.datetimestamps = - track.otherReleases.map(track2 => - (track2.date - ? (track.date - ? relation('generateRelativeDatetimestamp', - track2.date, - track.date) - : relation('generateAbsoluteDatetimestamp', - track2.date)) - : null)); + relations: (relation, query, track) => ({ + layout: + relation('generatePageLayout'), - otherReleases.items = - track.otherReleases.map(track => ({ - trackLink: relation('linkTrack', track), - albumLink: relation('linkAlbum', track.album), - })); - } + albumStyleRules: + relation('generateAlbumStyleRules', track.album, track), - // Section: Contributors + socialEmbed: + relation('generateTrackSocialEmbed', track), - if (!empty(track.contributorContribs)) { - const contributors = sections.contributors = {}; + navLinks: + relation('generateTrackNavLinks', track), - contributors.heading = - relation('generateContentHeading'); + albumNavAccent: + relation('generateAlbumNavAccent', track.album, track), - contributors.list = - relation('generateContributionList', track.contributorContribs); - } + secondaryNav: + relation('generateAlbumSecondaryNav', track.album), - // Section: Referenced tracks + sidebar: + relation('generateAlbumSidebar', track.album, track), - if (!empty(track.referencedTracks)) { - const references = sections.references = {}; + additionalNamesBox: + relation('generateAdditionalNamesBox', track.additionalNames), - references.heading = - relation('generateContentHeading'); + artworkColumn: + relation('generateTrackArtworkColumn', track), - references.list = - relation('generateTrackList', track.referencedTracks); - } + contentHeading: + relation('generateContentHeading'), - // Section: Sampled tracks + releaseInfo: + relation('generateTrackReleaseInfo', track), - if (!empty(track.sampledTracks)) { - const samples = sections.samples = {}; + otherReleasesList: + relation('generateTrackInfoPageOtherReleasesList', track), - samples.heading = - relation('generateContentHeading'); + contributorContributionList: + relation('generateContributionList', track.contributorContribs), - samples.list = - relation('generateTrackList', track.sampledTracks); - } + referencedTracksList: + relation('generateTrackList', track.referencedTracks), - // Section: Tracks that reference + sampledTracksList: + relation('generateTrackList', track.sampledTracks), - if (!empty(track.referencedByTracks)) { - const referencedBy = sections.referencedBy = {}; + referencedByTracksList: + relation('generateTrackListDividedByGroups', + query.mainReleaseTrack.referencedByTracks), - referencedBy.heading = - relation('generateContentHeading'); + sampledByTracksList: + relation('generateTrackListDividedByGroups', + query.mainReleaseTrack.sampledByTracks), - referencedBy.list = - relation('generateTrackListDividedByGroups', - track.referencedByTracks, - sprawl.divideTrackListsByGroups); - } + flashesThatFeatureList: + relation('generateTrackInfoPageFeaturedByFlashesList', track), - // Section: Tracks that sample + lyricsSection: + relation('generateLyricsSection', track.lyrics), - if (!empty(track.sampledByTracks)) { - const sampledBy = sections.sampledBy = {}; + sheetMusicFilesList: + relation('generateAlbumAdditionalFilesList', + track.album, + track.sheetMusicFiles), - sampledBy.heading = - relation('generateContentHeading'); + midiProjectFilesList: + relation('generateAlbumAdditionalFilesList', + track.album, + track.midiProjectFiles), - sampledBy.list = - relation('generateTrackListDividedByGroups', - track.sampledByTracks, - sprawl.divideTrackListsByGroups); - } + additionalFilesList: + relation('generateAlbumAdditionalFilesList', + track.album, + track.additionalFiles), - // Section: Flashes that feature + artistCommentarySection: + relation('generateTrackArtistCommentarySection', track), - if (sprawl.enableFlashesAndGames) { - const sortedFeatures = - sortFlashesChronologically( - [track, ...track.otherReleases].flatMap(track => - track.featuredInFlashes.map(flash => ({ - // These aren't going to be exposed directly, they're processed - // into the appropriate relations after this sort. - flash, track, + creditSourceEntries: + track.creditSources + .map(entry => relation('generateCommentaryEntry', entry)), + }), - // These properties are only used for the sort. - act: flash.act, - date: flash.date, - })))); + data: (_query, track) => ({ + name: + track.name, - if (!empty(sortedFeatures)) { - const flashesThatFeature = sections.flashesThatFeature = {}; + color: + track.color, + }), - flashesThatFeature.heading = - relation('generateContentHeading'); - - flashesThatFeature.entries = - sortedFeatures.map(({flash, track: directlyFeaturedTrack}) => - (directlyFeaturedTrack === track - ? { - flashLink: relation('linkFlash', flash), - } - : { - flashLink: relation('linkFlash', flash), - trackLink: relation('linkTrack', directlyFeaturedTrack), - })); - } - } - - // Section: Lyrics - - if (track.lyrics) { - const lyrics = sections.lyrics = {}; - - lyrics.heading = - relation('generateContentHeading'); - - lyrics.content = - relation('transformContent', track.lyrics); - } - - // Sections: Sheet music files, MIDI/proejct files, additional files - - if (!empty(track.sheetMusicFiles)) { - sections.sheetMusicFiles = additionalFilesSection(track.sheetMusicFiles); - } - - if (!empty(track.midiProjectFiles)) { - sections.midiProjectFiles = additionalFilesSection(track.midiProjectFiles); - } - - if (!empty(track.additionalFiles)) { - sections.additionalFiles = additionalFilesSection(track.additionalFiles); - } - - // Section: Artist commentary - - if (track.commentary) { - sections.artistCommentary = - relation('generateCommentarySection', track.commentary); - } - - return relations; - }, - - data(sprawl, track) { - return { - name: track.name, - color: track.color, - - hasTrackNumbers: track.album.hasTrackNumbers, - trackNumber: track.album.tracks.indexOf(track) + 1, - - numAdditionalFiles: track.additionalFiles.length, - }; - }, - - generate(data, relations, {html, language}) { - const {sections: sec} = relations; + generate: (data, relations, {html, language}) => + language.encapsulate('trackPage', pageCapsule => + relations.layout.slots({ + title: + language.$(pageCapsule, 'title', { + track: data.name, + }), - return relations.layout - .slots({ - title: language.$('trackPage.title', {track: data.name}), headingMode: 'sticky', additionalNames: relations.additionalNamesBox, @@ -286,12 +140,8 @@ export default { color: data.color, styleRules: [relations.albumStyleRules], - cover: - (relations.cover - ? relations.cover.slots({ - alt: language.$('misc.alt.trackCover'), - }) - : null), + artworkColumnContent: + relations.artworkColumn, mainContent: [ relations.releaseInfo, @@ -300,251 +150,224 @@ export default { {[html.onlyIfContent]: true}, {[html.joinChildren]: html.tag('br')}, - [ - sec.sheetMusicFiles && - language.$('releaseInfo.sheetMusicFiles.shortcut', { - link: html.tag('a', - {href: '#sheet-music-files'}, - language.$('releaseInfo.sheetMusicFiles.shortcut.link')), - }), + language.encapsulate('releaseInfo', capsule => [ + !html.isBlank(relations.sheetMusicFilesList) && + language.encapsulate(capsule, 'sheetMusicFiles.shortcut', capsule => + language.$(capsule, { + link: + html.tag('a', + {href: '#sheet-music-files'}, + language.$(capsule, 'link')), + })), - sec.midiProjectFiles && - language.$('releaseInfo.midiProjectFiles.shortcut', { - link: html.tag('a', - {href: '#midi-project-files'}, - language.$('releaseInfo.midiProjectFiles.shortcut.link')), - }), + !html.isBlank(relations.midiProjectFilesList) && + language.encapsulate(capsule, 'midiProjectFiles.shortcut', capsule => + language.$(capsule, { + link: + html.tag('a', + {href: '#midi-project-files'}, + language.$(capsule, 'link')), + })), - sec.additionalFiles && - language.$('releaseInfo.additionalFiles.shortcut', { - link: html.tag('a', - {href: '#midi-project-files'}, - language.$('releaseInfo.additionalFiles.shortcut.link')), - }), + !html.isBlank(relations.additionalFilesList) && + language.encapsulate(capsule, 'additionalFiles.shortcut', capsule => + language.$(capsule, { + link: + html.tag('a', + {href: '#midi-project-files'}, + language.$(capsule, 'link')), + })), - sec.artistCommentary && - language.$('releaseInfo.readCommentary', { - link: html.tag('a', - {href: '#artist-commentary'}, - language.$('releaseInfo.readCommentary.link')), - }), - ]), + !html.isBlank(relations.artistCommentarySection) && + language.encapsulate(capsule, 'readCommentary', capsule => + language.$(capsule, { + link: + html.tag('a', + {href: '#artist-commentary'}, + language.$(capsule, 'link')), + })), - sec.otherReleases && [ - sec.otherReleases.heading - .slots({ - attributes: {id: 'also-released-as'}, - title: language.$('releaseInfo.alsoReleasedAs'), - }), + !html.isBlank(relations.creditSourceEntries) && + language.encapsulate(capsule, 'readCreditSources', capsule => + language.$(capsule, { + link: + html.tag('a', + {href: '#credit-sources'}, + language.$(capsule, 'link')), + })), + ])), - html.tag('ul', - stitchArrays({ - trackLink: sec.otherReleases.trackLinks, - albumLink: sec.otherReleases.albumLinks, - datetimestamp: sec.otherReleases.datetimestamps, - colorStyle: sec.otherReleases.colorStyles, - }).map(({ - trackLink, - albumLink, - datetimestamp, - colorStyle, - }) => { - const parts = ['releaseInfo.alsoReleasedAs.item']; - const options = {}; - - options.track = trackLink.slot('color', false); - options.album = albumLink; - - if (datetimestamp) { - parts.push('withYear'); - options.year = - datetimestamp.slots({ - style: 'year', - tooltip: true, - }); - } - - return ( - html.tag('li', - colorStyle, - language.$(...parts, options))); - })), - ], + relations.otherReleasesList, - sec.contributors && [ - sec.contributors.heading + html.tags([ + relations.contentHeading.clone() .slots({ attributes: {id: 'contributors'}, title: language.$('releaseInfo.contributors'), }), - sec.contributors.list, - ], - - sec.references && [ - sec.references.heading - .slots({ - attributes: {id: 'references'}, + relations.contributorContributionList.slots({ + chronologyKind: 'trackContribution', + }), + ]), + + html.tags([ + language.encapsulate('releaseInfo.tracksReferenced', capsule => + relations.contentHeading.clone() + .slots({ + attributes: {id: 'references'}, + + title: + language.$(capsule, { + track: + html.tag('i', data.name), + }), + + stickyTitle: + language.$(capsule, 'sticky'), + })), - title: - language.$('releaseInfo.tracksReferenced', { - track: html.tag('i', data.name), - }), + relations.referencedTracksList, + ]), - stickyTitle: - language.$('releaseInfo.tracksReferenced.sticky'), - }), + html.tags([ + language.encapsulate('releaseInfo.tracksSampled', capsule => + relations.contentHeading.clone() + .slots({ + attributes: {id: 'samples'}, - sec.references.list, - ], + title: + language.$(capsule, { + track: + html.tag('i', data.name), + }), - sec.samples && [ - sec.samples.heading - .slots({ - attributes: {id: 'samples'}, + stickyTitle: + language.$(capsule, 'sticky'), + })), - title: - language.$('releaseInfo.tracksSampled', { - track: html.tag('i', data.name), - }), + relations.sampledTracksList, + ]), - stickyTitle: - language.$('releaseInfo.tracksSampled.sticky'), - }), + language.encapsulate('releaseInfo.tracksThatReference', capsule => + html.tags([ + relations.contentHeading.clone() + .slots({ + attributes: {id: 'referenced-by'}, - sec.samples.list, - ], + title: + language.$(capsule, { + track: html.tag('i', data.name), + }), - sec.referencedBy && [ - sec.referencedBy.heading - .slots({ - attributes: {id: 'referenced-by'}, + stickyTitle: + language.$(capsule, 'sticky'), + }), - title: - language.$('releaseInfo.tracksThatReference', { - track: html.tag('i', data.name), - }), + relations.referencedByTracksList + .slots({ + headingString: capsule, + }), + ])), - stickyTitle: - language.$('releaseInfo.tracksThatReference.sticky'), - }), + language.encapsulate('releaseInfo.tracksThatSample', capsule => + html.tags([ + relations.contentHeading.clone() + .slots({ + attributes: {id: 'sampled-by'}, - sec.referencedBy.list - .slots({ - headingString: 'releaseInfo.tracksThatReference', - }), - ], + title: + language.$(capsule, { + track: html.tag('i', data.name), + }), - sec.sampledBy && [ - sec.sampledBy.heading - .slots({ - attributes: {id: 'referenced-by'}, + stickyTitle: + language.$(capsule, 'sticky'), + }), - title: - language.$('releaseInfo.tracksThatSample', { - track: html.tag('i', data.name), - }), + relations.sampledByTracksList + .slots({ + headingString: capsule, + }), + ])), - stickyTitle: - language.$('releaseInfo.tracksThatSample.sticky'), - }), + html.tags([ + language.encapsulate('releaseInfo.flashesThatFeature', capsule => + relations.contentHeading.clone() + .slots({ + attributes: {id: 'featured-in'}, - sec.sampledBy.list - .slots({ - headingString: 'releaseInfo.tracksThatSample', - }), - ], + title: + language.$(capsule, { + track: html.tag('i', data.name), + }), - sec.flashesThatFeature && [ - sec.flashesThatFeature.heading - .slots({ - attributes: {id: 'featured-in'}, + stickyTitle: + language.$(capsule, 'sticky'), + })), - title: - language.$('releaseInfo.flashesThatFeature', { - track: html.tag('i', data.name), - }), + relations.flashesThatFeatureList, + ]), - stickyTitle: - language.$('releaseInfo.flashesThatFeature.sticky'), - }), + relations.lyricsSection, - html.tag('ul', sec.flashesThatFeature.entries.map(({flashLink, trackLink}) => - (trackLink - ? html.tag('li', {class: 'rerelease'}, - language.$('releaseInfo.flashesThatFeature.item.asDifferentRelease', { - flash: flashLink, - track: trackLink, - })) - : html.tag('li', - language.$('releaseInfo.flashesThatFeature.item', { - flash: flashLink, - }))))), - ], - - sec.lyrics && [ - sec.lyrics.heading - .slots({ - attributes: {id: 'lyrics'}, - title: language.$('releaseInfo.lyrics'), - }), + // html.tags([ + // relations.contentHeading.clone() + // .slots({ + // attributes: {id: 'lyrics'}, + // title: language.$('releaseInfo.lyrics'), + // }), - html.tag('blockquote', - sec.lyrics.content - .slot('mode', 'lyrics')), - ], + // html.tag('blockquote', + // {[html.onlyIfContent]: true}, + // relations.lyrics.slot('mode', 'lyrics')), + // ]), - sec.sheetMusicFiles && [ - sec.sheetMusicFiles.heading + html.tags([ + relations.contentHeading.clone() .slots({ attributes: {id: 'sheet-music-files'}, title: language.$('releaseInfo.sheetMusicFiles.heading'), }), - sec.sheetMusicFiles.list, - ], + relations.sheetMusicFilesList, + ]), - sec.midiProjectFiles && [ - sec.midiProjectFiles.heading + html.tags([ + relations.contentHeading.clone() .slots({ attributes: {id: 'midi-project-files'}, title: language.$('releaseInfo.midiProjectFiles.heading'), }), - sec.midiProjectFiles.list, - ], + relations.midiProjectFilesList, + ]), - sec.additionalFiles && [ - sec.additionalFiles.heading + html.tags([ + relations.contentHeading.clone() .slots({ attributes: {id: 'additional-files'}, title: language.$('releaseInfo.additionalFiles.heading'), }), - sec.additionalFiles.list, - ], + relations.additionalFilesList, + ]), + + relations.artistCommentarySection, + + html.tags([ + relations.contentHeading.clone() + .slots({ + attributes: {id: 'credit-sources'}, + title: language.$('misc.creditSources'), + }), - sec.artistCommentary, + relations.creditSourceEntries, + ]), ], navLinkStyle: 'hierarchical', - navLinks: [ - {auto: 'home'}, - {html: relations.albumLink.slot('color', false)}, - { - html: - (data.hasTrackNumbers - ? language.$('trackPage.nav.track.withNumber', { - number: data.trackNumber, - track: relations.trackLink - .slot('attributes', {class: 'current'}), - }) - : language.$('trackPage.nav.track', { - track: relations.trackLink - .slot('attributes', {class: 'current'}), - })), - }, - ], + navLinks: html.resolve(relations.navLinks), navBottomRowContent: relations.albumNavAccent.slots({ @@ -552,9 +375,6 @@ export default { showExtraLinks: false, }), - navContent: - relations.trackChronologyLinks, - secondaryNav: relations.secondaryNav .slot('mode', 'track'), @@ -562,8 +382,7 @@ export default { leftSidebar: relations.sidebar, socialEmbed: relations.socialEmbed, - }); - }, + })), }; /* |