From aeed300cb9f4fc543a4fdadc294106e455900309 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 4 Jun 2026 08:55:25 -0300 Subject: content, data: Track.datePosted, etc --- .../dependencies/generateAlbumCommentaryPage.js | 68 +++++++++++++++++----- .../dependencies/generateAlbumGalleryStatsLine.js | 12 +++- .../generateAlbumSocialEmbedDescription.js | 11 +++- .../dependencies/generateTrackReleaseInfo.js | 14 +++-- src/data/things/Track.js | 31 ++++++++-- src/data/things/album/Album.js | 36 ++++++++---- src/strings-default.yaml | 54 ++++++++++++++--- 7 files changed, 180 insertions(+), 46 deletions(-) diff --git a/src/content/dependencies/generateAlbumCommentaryPage.js b/src/content/dependencies/generateAlbumCommentaryPage.js index 0d7fb2cb..02755cf2 100644 --- a/src/content/dependencies/generateAlbumCommentaryPage.js +++ b/src/content/dependencies/generateAlbumCommentaryPage.js @@ -96,10 +96,18 @@ export default { data.name = album.name; data.color = album.color; data.date = album.date; + data.dateStyle = album.dateStyle; data.trackCommentaryTrackDates = query.tracksWithCommentary - .map(track => track.dateFirstReleased); + .map(track => + (+track.date !== +album.date + ? track.date + : null)); + + data.trackCommentaryTrackDateStyles = + query.tracksWithCommentary + .map(track => track.dateStyle); data.trackCommentaryDirectories = query.tracksWithCommentary @@ -136,10 +144,21 @@ export default { [ data.date && relations.totals.entryCount >= 1 && - language.$('releaseInfo.albumReleased', { - date: - html.tag('b', - language.formatDate(data.date)), + language.encapsulate('releaseInfo', workingCapsule => { + const workingOptions = {}; + + workingOptions.date = + html.tag('b', language.formatDate(data.date)); + + if (data.dateStyle === 'released') { + workingCapsule += '.albumReleased'; + } else if (data.dateStyle === 'posted') { + workingCapsule += '.albumPosted'; + } else { + return html.blank(); + } + + return language.$(workingCapsule, workingOptions); }), language.encapsulate(pageCapsule, 'infoLine', workingCapsule => { @@ -211,6 +230,7 @@ export default { entries: relations.trackCommentaryEntries, color: data.trackCommentaryColors, trackDate: data.trackCommentaryTrackDates, + trackDateStyle: data.trackCommentaryTrackDateStyles, }).map(({ heading, link, @@ -220,6 +240,7 @@ export default { entries, color, trackDate, + trackDateStyle, }) => language.encapsulate(pageCapsule, 'entry', entryCapsule => [ language.encapsulate(entryCapsule, 'title.trackCommentary', titleCapsule => @@ -243,20 +264,37 @@ export default { }), })), - cover?.slots({ - mode: 'commentary', - color: true, - }), + cover?.slots({ + mode: 'commentary', + color: true, + }), - trackDate && - trackDate !== data.date && html.tag('p', {class: 'track-info'}, - language.$('releaseInfo.trackReleased', { - date: language.formatDate(trackDate), + {[html.onlyIfContent]: true}, + + language.encapsulate('releaseInfo', workingCapsule => { + const workingOptions = {}; + + if (!trackDate) { + return html.blank(); + } + + workingOptions.date = + language.formatDate(trackDate); + + if (trackDateStyle === 'released') { + workingCapsule += '.trackReleased'; + } else if (trackDateStyle === 'posted') { + workingCapsule += '.trackPosted'; + } else { + return html.blank(); + } + + return language.$(workingCapsule, workingOptions); })), - entries.map(entry => entry.slot('color', color)), - ])), + entries.map(entry => entry.slot('color', color)), + ])), ], navLinkStyle: 'hierarchical', diff --git a/src/content/dependencies/generateAlbumGalleryStatsLine.js b/src/content/dependencies/generateAlbumGalleryStatsLine.js index 75341937..394be6b8 100644 --- a/src/content/dependencies/generateAlbumGalleryStatsLine.js +++ b/src/content/dependencies/generateAlbumGalleryStatsLine.js @@ -5,6 +5,9 @@ export default { date: album.date, + dateStyle: + album.dateStyle, + hideDuration: album.hideDuration, @@ -40,8 +43,13 @@ export default { language.formatDuration(data.duration, {unit: true})); } - if (data.date) { - workingCapsule += '.withDate'; + if (data.dateStyle === 'released') { + workingCapsule += '.withDateReleased'; + workingOptions.date = + html.tag('b', + language.formatDate(data.date)); + } else if (data.dateStyle === 'posted') { + workingCapsule += '.withDatePosted'; workingOptions.date = html.tag('b', language.formatDate(data.date)); diff --git a/src/content/dependencies/generateAlbumSocialEmbedDescription.js b/src/content/dependencies/generateAlbumSocialEmbedDescription.js index db6da5b7..f584b59e 100644 --- a/src/content/dependencies/generateAlbumSocialEmbedDescription.js +++ b/src/content/dependencies/generateAlbumSocialEmbedDescription.js @@ -10,6 +10,9 @@ export default { date: album.date, + + dateStyle: + album.dateStyle, }), generate: (data, {language}) => @@ -28,8 +31,12 @@ export default { language.countTracks(data.tracks, {unit: true}); } - if (data.date) { - workingCapsule += '.withReleaseDate'; + if (data.dateStyle === 'released') { + workingCapsule += '.withDateReleased'; + workingOptions.date = + language.formatDate(data.date); + } else if (data.dateStyle === 'posted') { + workingCapsule += '.withDatePosted'; workingOptions.date = language.formatDate(data.date); } diff --git a/src/content/dependencies/generateTrackReleaseInfo.js b/src/content/dependencies/generateTrackReleaseInfo.js index 001f5a54..b610188a 100644 --- a/src/content/dependencies/generateTrackReleaseInfo.js +++ b/src/content/dependencies/generateTrackReleaseInfo.js @@ -22,6 +22,7 @@ export default { data.name = track.name; data.date = track.date; + data.dateStyle = track.dateStyle; data.duration = track.duration; const {album} = track; @@ -65,10 +66,15 @@ export default { }); }), - language.$(capsule, 'released', { - [language.onlyIfOptions]: ['date'], - date: language.formatDate(data.date), - }), + (data.dateStyle === 'released' + ? language.$(capsule, 'released', { + date: language.formatDate(data.date), + }) + : data.dateStyle === 'posted' + ? language.$(capsule, 'posted', { + date: language.formatDate(data.date), + }) + : html.blank()), language.$(capsule, 'duration', { [language.onlyIfOptions]: ['duration'], diff --git a/src/data/things/Track.js b/src/data/things/Track.js index 7eff2000..6fc38e5d 100644 --- a/src/data/things/Track.js +++ b/src/data/things/Track.js @@ -282,6 +282,7 @@ export class Track extends Thing { additionalNames: thingList(V(AdditionalName)), dateFirstReleased: simpleDate(), + datePosted: simpleDate(), // > Update & expose - Credits and contributors @@ -721,11 +722,30 @@ export class Track extends Thing { }, exposeDependencyOrContinue('dateFirstReleased'), + exposeDependencyOrContinue('datePosted'), withPropertyFromObject('album', V('date')), exposeDependency('#album.date'), ], + dateStyle: [ + exitWithoutDependency('date'), + + { + dependencies: ['_dateFirstReleased', '_datePosted'], + compute: (continuation, { + ['_dateFirstReleased']: dateFirstReleased, + ['_datePosted']: datePosted, + }) => + (dateFirstReleased ? 'released' + : datePosted ? 'posted' + : continuation()), + }, + + withPropertyFromObject('album', V('dateStyle')), + exposeDependency('#album.dateStyle'), + ], + trackNumber: [ // Zero is the fallback, not one, but in most albums the first track // (and its intended output by this composition) will be one. @@ -1060,10 +1080,8 @@ export class Track extends Thing { transform: parseAdditionalNames, }, - 'Date First Released': { - property: 'dateFirstReleased', - transform: parseDate, - }, + 'Date First Released': {property: 'dateFirstReleased', transform: parseDate}, + 'Date Posted': {property: 'datePosted', transform: parseDate}, // Credits and contributors @@ -1240,6 +1258,11 @@ export class Track extends Thing { ], }, + {message: `Only one unique date per track is supported`, fields: [ + 'Date First Released', + 'Date Posted', + ]}, + {message: `Don't include URLs alongside Excluding URLs, unless Excluding URLs is false`, fields: [ 'URLs', ['Excluding URLs', v => v !== false], diff --git a/src/data/things/album/Album.js b/src/data/things/album/Album.js index 47abb73a..1a07656a 100644 --- a/src/data/things/album/Album.js +++ b/src/data/things/album/Album.js @@ -223,7 +223,8 @@ export class Album extends Thing { additionalNames: thingList(V(AdditionalName)), - date: simpleDate(), + dateReleased: simpleDate(), + datePosted: simpleDate(), dateAddedToWiki: simpleDate(), // > Update & expose - Credits and contributors @@ -527,6 +528,27 @@ export class Album extends Thing { withFlattenedList('#trackSections.tracks'), exposeDependency('#flattenedList'), ], + + date: [ + exposeDependencyOrContinue('dateReleased'), + exposeDependencyOrContinue('datePosted'), + exposeConstant(V(null)), + ], + + dateStyle: [ + exitWithoutDependency('date'), + + { + dependencies: ['_dateReleased', '_datePosted'], + compute: ({ + ['_dateReleased']: dateReleased, + ['_datePosted']: datePosted, + }) => + (dateReleased ? 'released' + : datePosted ? 'posted' + : null), + }, + ] }); static [Thing.getSerializeDescriptors] = ({ @@ -721,15 +743,9 @@ export class Album extends Thing { transform: parseAdditionalNames, }, - 'Date': { - property: 'date', - transform: parseDate, - }, - - 'Date Added': { - property: 'dateAddedToWiki', - transform: parseDate, - }, + 'Date': {property: 'dateReleased', transform: parseDate}, + 'Date Posted': {property: 'datePosted', transform: parseDate}, + 'Date Added': {property: 'dateAddedToWiki', transform: parseDate}, // Credits and contributors diff --git a/src/strings-default.yaml b/src/strings-default.yaml index 4e1bf94c..ee7dff25 100644 --- a/src/strings-default.yaml +++ b/src/strings-default.yaml @@ -292,6 +292,11 @@ releaseInfo: released: "Released {DATE}." albumReleased: "Album released {DATE}." trackReleased: "Track released {DATE}." + + posted: "Posted {DATE}." + albumPosted: "Album posted {DATE}." + trackPosted: "Track posted {DATE}." + addedToWiki: "Added to wiki {DATE}." unofficialName: >- @@ -1394,13 +1399,38 @@ albumPage: # string, ex. "63 tracks". body: - withDuration: "{DURATION}." - withTracks: "{TRACKS}." - withReleaseDate: Released {DATE}. - withDuration.withTracks: "{DURATION}, {TRACKS}." - withDuration.withReleaseDate: "{DURATION}. Released {DATE}." - withTracks.withReleaseDate: "{TRACKS}. Released {DATE}." - withDuration.withTracks.withReleaseDate: "{DURATION}, {TRACKS}. Released {DATE}." + withDuration: >- + {DURATION}. + + withTracks: >- + {TRACKS}. + + withDateReleased: >- + Released {DATE}. + + withDatePosted: >- + Posted {DATE}. + + withDuration.withTracks: >- + {DURATION}, {TRACKS}. + + withDuration.withDateReleased: >- + {DURATION}. Released {DATE}. + + withDuration.withDatePosted: >- + {DURATION}. Posted {DATE}. + + withTracks.withDateReleased: >- + {TRACKS}. Released {DATE}. + + withTracks.withDatePosted: >- + {DURATION}. Posted {DATE}. + + withDuration.withTracks.withDateReleased: >- + {DURATION}, {TRACKS}. Released {DATE}. + + withDuration.withTracks.withDatePosted: >- + {DURATION}, {TRACKS}. Posted {DATE}. # # albumGalleryPage: @@ -1421,12 +1451,18 @@ albumGalleryPage: statsLine: >- {TRACKS} totaling {DURATION}. - statsLine.withDate: >- + statsLine.withDateReleased: >- {TRACKS} totaling {DURATION}. Released {DATE}. - statsLine.withDate.noDuration: >- + statsLine.withDatePosted: >- + {TRACKS} totaling {DURATION}. Posted {DATE}. + + statsLine.withDateReleased.noDuration: >- Released {DATE}. + statsLine.withDatePosted.noDuration: >- + Posted {DATE}. + # coverArtistsLine: # This is displayed if every track (which has artwork at all) # has the same illustration credits. -- cgit 1.3.0-6-gf8a5