From 8cf17aae87ba968d35c9871be9f90997cd5a80ad Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 28 May 2026 14:25:50 -0300 Subject: content: generateAlbumLinkNavAccent & friends --- .../dependencies/generateAlbumCommentaryPage.js | 29 ++--- .../dependencies/generateAlbumGalleryPage.js | 28 ++--- src/content/dependencies/generateAlbumInfoPage.js | 21 ++-- .../dependencies/generateAlbumLinkNavAccent.js | 46 +++++++ src/content/dependencies/generateAlbumNavAccent.js | 133 --------------------- src/content/dependencies/generateAlbumNavLinks.js | 56 +++++++++ .../dependencies/generateAlbumNavSwitcher.js | 133 +++++++++++++++++++++ src/content/dependencies/generateTrackInfoPage.js | 6 +- src/content/dependencies/generateTrackNavLinks.js | 11 +- src/strings-default.yaml | 29 ++++- 10 files changed, 296 insertions(+), 196 deletions(-) create mode 100644 src/content/dependencies/generateAlbumLinkNavAccent.js delete mode 100644 src/content/dependencies/generateAlbumNavAccent.js create mode 100644 src/content/dependencies/generateAlbumNavLinks.js create mode 100644 src/content/dependencies/generateAlbumNavSwitcher.js diff --git a/src/content/dependencies/generateAlbumCommentaryPage.js b/src/content/dependencies/generateAlbumCommentaryPage.js index d2706918..0d7fb2cb 100644 --- a/src/content/dependencies/generateAlbumCommentaryPage.js +++ b/src/content/dependencies/generateAlbumCommentaryPage.js @@ -31,11 +31,8 @@ export default { relations.albumStyleTags = relation('generateAlbumStyleTags', album, null); - relations.albumLink = - relation('linkAlbum', album); - - relations.albumNavAccent = - relation('generateAlbumNavAccent', album, null); + relations.albumNavLinks = + relation('generateAlbumNavLinks', album); relations.totals = relation('getContentEntryTotals', @@ -263,21 +260,13 @@ export default { ], navLinkStyle: 'hierarchical', - navLinks: [ - {auto: 'home'}, - { - html: - relations.albumLink - .slot('attributes', {class: 'current'}), - - accent: - relations.albumNavAccent.slots({ - showTrackNavigation: false, - showExtraLinks: true, - currentExtra: 'commentary', - }), - }, - ], + navLinks: + html.resolve( + relations.albumNavLinks.slots({ + showTrackNavigation: false, + showExtraLinks: true, + currentExtra: 'commentary', + })), secondaryNav: relations.secondaryNav.slots({ diff --git a/src/content/dependencies/generateAlbumGalleryPage.js b/src/content/dependencies/generateAlbumGalleryPage.js index 85b0fb74..7e083fbf 100644 --- a/src/content/dependencies/generateAlbumGalleryPage.js +++ b/src/content/dependencies/generateAlbumGalleryPage.js @@ -34,11 +34,8 @@ export default { albumStyleTags: relation('generateAlbumStyleTags', album, null), - albumLink: - relation('linkAlbum', album), - - albumNavAccent: - relation('generateAlbumNavAccent', album, null), + albumNavLinks: + relation('generateAlbumNavLinks', album), secondaryNav: relation('generateAlbumSecondaryNav', album), @@ -132,20 +129,13 @@ export default { ], navLinkStyle: 'hierarchical', - navLinks: [ - {auto: 'home'}, - { - html: - relations.albumLink - .slot('attributes', {class: 'current'}), - accent: - relations.albumNavAccent.slots({ - showTrackNavigation: false, - showExtraLinks: true, - currentExtra: 'gallery', - }), - }, - ], + navLinks: + html.resolve( + relations.albumNavLinks.slots({ + showTrackNavigation: false, + showExtraLinks: true, + currentExtra: 'gallery', + })), secondaryNav: relations.secondaryNav, })), diff --git a/src/content/dependencies/generateAlbumInfoPage.js b/src/content/dependencies/generateAlbumInfoPage.js index 152518b0..34ebb649 100644 --- a/src/content/dependencies/generateAlbumInfoPage.js +++ b/src/content/dependencies/generateAlbumInfoPage.js @@ -11,8 +11,8 @@ export default { socialEmbed: relation('generateAlbumSocialEmbed', album), - albumNavAccent: - relation('generateAlbumNavAccent', album, null), + albumNavLinks: + relation('generateAlbumNavLinks', album), secondaryNav: relation('generateAlbumSecondaryNav', album), @@ -201,17 +201,12 @@ export default { ], navLinkStyle: 'hierarchical', - navLinks: [ - {auto: 'home'}, - { - auto: 'current', - accent: - relations.albumNavAccent.slots({ - showTrackNavigation: true, - showExtraLinks: true, - }), - }, - ], + navLinks: + html.resolve( + relations.albumNavLinks.slots({ + showTrackNavigation: true, + showExtraLinks: true, + })), banner: relations.banner ?? null, bannerPosition: 'top', diff --git a/src/content/dependencies/generateAlbumLinkNavAccent.js b/src/content/dependencies/generateAlbumLinkNavAccent.js new file mode 100644 index 00000000..50a53472 --- /dev/null +++ b/src/content/dependencies/generateAlbumLinkNavAccent.js @@ -0,0 +1,46 @@ +export default { + data: (album) => ({ + style: + album.style, + + nameDetail: + album.nameDetail, + }), + + slots: { + navString: {type: 'string', default: 'albumPage.nav'}, + }, + + generate: (data, slots, {html, language}) => + language.encapsulate(slots.navString, 'albumAccent', capsule => { + let workingCapsule = capsule; + let workingOptions = {}; + + let any = false; + + if (data.nameDetail) { + workingCapsule += '.withNameDetail'; + workingOptions.nameDetail = data.nameDetail; + any = true; + } + + const type = + (data.style === 'single' + ? language.$(capsule, 'type.single') + : data.style === 'in-game vgm' + ? language.$(capsule, 'type.vgm') + : html.blank()); + + if (!html.isBlank(type)) { + workingCapsule += '.withType'; + workingOptions.type = type; + any = true; + } + + if (any) { + return language.$(workingCapsule, workingOptions); + } else { + return html.blank(); + } + }), +}; diff --git a/src/content/dependencies/generateAlbumNavAccent.js b/src/content/dependencies/generateAlbumNavAccent.js deleted file mode 100644 index 24a562f4..00000000 --- a/src/content/dependencies/generateAlbumNavAccent.js +++ /dev/null @@ -1,133 +0,0 @@ -import {atOffset} from '#sugar'; -import {albumHasSubstantialCommentaryPage} from '#wiki-data'; - -export default { - query(album, track) { - const query = {}; - - const index = - (track - ? album.tracks.indexOf(track) - : null); - - query.previousTrack = - (track - ? atOffset(album.tracks, index, -1) - : null); - - query.nextTrack = - (track - ? atOffset(album.tracks, index, +1) - : null); - - return query; - }, - - relations: (relation, query, album, _track) => ({ - switcher: - relation('generateInterpageDotSwitcher'), - - previousLink: - relation('generatePreviousLink'), - - nextLink: - relation('generateNextLink'), - - previousTrackLink: - (query.previousTrack - ? relation('linkTrack', query.previousTrack) - : null), - - nextTrackLink: - (query.nextTrack - ? relation('linkTrack', query.nextTrack) - : null), - - albumGalleryLink: - relation('linkAlbumGallery', album), - - albumCommentaryLink: - relation('linkAlbumCommentary', album), - }), - - data: (query, album, track) => ({ - hasMultipleTracks: - album.tracks.length > 1, - - hasSubstantialCommentaryPage: - albumHasSubstantialCommentaryPage(album), - - galleryIsStub: - album.tracks.every(t => !t.hasUniqueCoverArt), - - isTrackPage: - !!track, - }), - - slots: { - showTrackNavigation: {type: 'boolean', default: false}, - showExtraLinks: {type: 'boolean', default: false}, - - currentExtra: { - validate: v => v.is('gallery', 'commentary'), - }, - }, - - generate(data, relations, slots, {html, language}) { - const albumNavCapsule = language.encapsulate('albumPage.nav'); - const trackNavCapsule = language.encapsulate('trackPage.nav'); - - const previousLink = - data.isTrackPage && - relations.previousLink.slot('link', relations.previousTrackLink); - - const nextLink = - data.isTrackPage && - relations.nextLink.slot('link', relations.nextTrackLink); - - const galleryLink = - (!data.galleryIsStub || - slots.currentExtra === 'gallery') && - relations.albumGalleryLink.slots({ - attributes: {class: slots.currentExtra === 'gallery' && 'current'}, - content: language.$(albumNavCapsule, 'gallery'), - }); - - const commentaryLink = - (data.hasSubstantialCommentaryPage || - slots.currentExtra === 'commentary') && - relations.albumCommentaryLink.slots({ - attributes: {class: slots.currentExtra === 'commentary' && 'current'}, - content: language.$(albumNavCapsule, 'commentary'), - }); - - const randomLink = - data.hasMultipleTracks && - html.tag('a', - {id: 'random-button'}, - {href: '#', 'data-random': 'track-in-sidebar'}, - - (data.isTrackPage - ? language.$(trackNavCapsule, 'random') - : language.$(albumNavCapsule, 'randomTrack'))); - - return relations.switcher.slots({ - links: [ - slots.showTrackNavigation && - previousLink, - - slots.showTrackNavigation && - nextLink, - - slots.showExtraLinks && - galleryLink, - - slots.showExtraLinks && - commentaryLink, - - slots.showTrackNavigation && - randomLink, - ], - }); - }, -}; diff --git a/src/content/dependencies/generateAlbumNavLinks.js b/src/content/dependencies/generateAlbumNavLinks.js new file mode 100644 index 00000000..3068b532 --- /dev/null +++ b/src/content/dependencies/generateAlbumNavLinks.js @@ -0,0 +1,56 @@ +export default { + relations: (relation, album) => ({ + albumLink: + relation('linkAlbum', album), + + switcher: + relation('generateAlbumNavSwitcher', album, null), + + accent: + relation('generateAlbumLinkNavAccent', album), + }), + + slots: { + showTrackNavigation: {type: 'boolean', default: false}, + showExtraLinks: {type: 'boolean', default: false}, + + currentExtra: { + validate: v => v.is('gallery', 'commentary'), + }, + }, + + generate: (relations, slots, {html, language}) => + language.encapsulate('albumPage.nav', navCapsule => [ + {auto: 'home'}, + + { + html: + relations.albumLink + .slot('attributes', {class: 'current'}), + + accent: + (() => { + const {switcher, accent} = relations; + + switcher.setSlots({ + showTrackNavigation: slots.showTrackNavigation, + showExtraLinks: slots.showExtraLinks, + currentExtra: slots.currentExtra, + }); + + if (!html.isBlank(switcher) && !html.isBlank(accent)) { + return language.$(navCapsule, 'albumAccent.withLinks', { + accent: accent, + links: switcher, + }); + } else if (!html.isBlank(accent)) { + return accent; + } else if (!html.isBlank(switcher)) { + return switcher; + } else { + return html.blank(); + } + })(), + }, + ]), +}; diff --git a/src/content/dependencies/generateAlbumNavSwitcher.js b/src/content/dependencies/generateAlbumNavSwitcher.js new file mode 100644 index 00000000..24a562f4 --- /dev/null +++ b/src/content/dependencies/generateAlbumNavSwitcher.js @@ -0,0 +1,133 @@ +import {atOffset} from '#sugar'; +import {albumHasSubstantialCommentaryPage} from '#wiki-data'; + +export default { + query(album, track) { + const query = {}; + + const index = + (track + ? album.tracks.indexOf(track) + : null); + + query.previousTrack = + (track + ? atOffset(album.tracks, index, -1) + : null); + + query.nextTrack = + (track + ? atOffset(album.tracks, index, +1) + : null); + + return query; + }, + + relations: (relation, query, album, _track) => ({ + switcher: + relation('generateInterpageDotSwitcher'), + + previousLink: + relation('generatePreviousLink'), + + nextLink: + relation('generateNextLink'), + + previousTrackLink: + (query.previousTrack + ? relation('linkTrack', query.previousTrack) + : null), + + nextTrackLink: + (query.nextTrack + ? relation('linkTrack', query.nextTrack) + : null), + + albumGalleryLink: + relation('linkAlbumGallery', album), + + albumCommentaryLink: + relation('linkAlbumCommentary', album), + }), + + data: (query, album, track) => ({ + hasMultipleTracks: + album.tracks.length > 1, + + hasSubstantialCommentaryPage: + albumHasSubstantialCommentaryPage(album), + + galleryIsStub: + album.tracks.every(t => !t.hasUniqueCoverArt), + + isTrackPage: + !!track, + }), + + slots: { + showTrackNavigation: {type: 'boolean', default: false}, + showExtraLinks: {type: 'boolean', default: false}, + + currentExtra: { + validate: v => v.is('gallery', 'commentary'), + }, + }, + + generate(data, relations, slots, {html, language}) { + const albumNavCapsule = language.encapsulate('albumPage.nav'); + const trackNavCapsule = language.encapsulate('trackPage.nav'); + + const previousLink = + data.isTrackPage && + relations.previousLink.slot('link', relations.previousTrackLink); + + const nextLink = + data.isTrackPage && + relations.nextLink.slot('link', relations.nextTrackLink); + + const galleryLink = + (!data.galleryIsStub || + slots.currentExtra === 'gallery') && + relations.albumGalleryLink.slots({ + attributes: {class: slots.currentExtra === 'gallery' && 'current'}, + content: language.$(albumNavCapsule, 'gallery'), + }); + + const commentaryLink = + (data.hasSubstantialCommentaryPage || + slots.currentExtra === 'commentary') && + relations.albumCommentaryLink.slots({ + attributes: {class: slots.currentExtra === 'commentary' && 'current'}, + content: language.$(albumNavCapsule, 'commentary'), + }); + + const randomLink = + data.hasMultipleTracks && + html.tag('a', + {id: 'random-button'}, + {href: '#', 'data-random': 'track-in-sidebar'}, + + (data.isTrackPage + ? language.$(trackNavCapsule, 'random') + : language.$(albumNavCapsule, 'randomTrack'))); + + return relations.switcher.slots({ + links: [ + slots.showTrackNavigation && + previousLink, + + slots.showTrackNavigation && + nextLink, + + slots.showExtraLinks && + galleryLink, + + slots.showExtraLinks && + commentaryLink, + + slots.showTrackNavigation && + randomLink, + ], + }); + }, +}; diff --git a/src/content/dependencies/generateTrackInfoPage.js b/src/content/dependencies/generateTrackInfoPage.js index 8b92c1be..72c3c897 100644 --- a/src/content/dependencies/generateTrackInfoPage.js +++ b/src/content/dependencies/generateTrackInfoPage.js @@ -51,8 +51,8 @@ export default { albumNavLink: relation('linkAlbum', track.album), - albumNavAccent: - relation('generateAlbumNavAccent', track.album, track), + albumNavSwitcher: + relation('generateAlbumNavSwitcher', track.album, track), secondaryNav: relation('generateAlbumSecondaryNav', track.album), @@ -401,7 +401,7 @@ export default { navBottomRowContent: (data.singleTrackSingle ? null - : relations.albumNavAccent.slots({ + : relations.albumNavSwitcher.slots({ showTrackNavigation: true, showExtraLinks: false, })), diff --git a/src/content/dependencies/generateTrackNavLinks.js b/src/content/dependencies/generateTrackNavLinks.js index 55029aa4..0fcd2118 100644 --- a/src/content/dependencies/generateTrackNavLinks.js +++ b/src/content/dependencies/generateTrackNavLinks.js @@ -3,14 +3,14 @@ export default { albumLink: relation('linkAlbum', track.album), + albumLinkNavAccent: + relation('generateAlbumLinkNavAccent', track.album), + trackLink: relation('linkTrack', track), }), data: (track) => ({ - albumStyle: - track.album.style, - showTrackSection: track.album.showTrackSectionInNavBar, @@ -39,10 +39,7 @@ export default { { html: relations.albumLink.slot('color', false), - accent: - (data.albumStyle === 'single' - ? language.$(navCapsule, 'singleAccent') - : null), + accent: relations.albumLinkNavAccent.slot('navString', navCapsule), }, data.showTrackSection && diff --git a/src/strings-default.yaml b/src/strings-default.yaml index 1d06d1d4..4e1bf94c 100644 --- a/src/strings-default.yaml +++ b/src/strings-default.yaml @@ -1365,6 +1365,22 @@ albumPage: backToAlbum: "Return to album page" + albumAccent: + withNameDetail: >- + {NAME_DETAIL} + + withType: >- + {TYPE} + + withNameDetail.withType: >- + {TYPE}: {NAME_DETAIL} + + type.single: "single" # This string should probably never appear, but... + type.vgm: "in-game vgm" + + withLinks: >- + {ACCENT} - {LINKS} + randomTrack: "Random Track" gallery: "Gallery" commentary: "Commentary" @@ -3110,7 +3126,18 @@ trackPage: backToTrack: "Return to track page" - singleAccent: "single" + albumAccent: + withNameDetail: >- + {NAME_DETAIL} + + withType: >- + {TYPE} + + withNameDetail.withType: >- + {TYPE}: {NAME_DETAIL} + + type.single: "single" + type.vgm: "vgm" track: _: "{TRACK}" -- cgit 1.3.0-6-gf8a5