diff options
| author | (quasar) nebula <qznebula@protonmail.com> | 2026-05-25 07:09:39 -0300 |
|---|---|---|
| committer | (quasar) nebula <qznebula@protonmail.com> | 2026-05-25 07:09:39 -0300 |
| commit | d783d3bf1eb1cd501d28dff58b258708a70d7e3c (patch) | |
| tree | e8896add7353110093509a4c1ceedd64f535a78d | |
| parent | 44b1b14624ff3c87ae14d00b7e9f2ca34c5d63d3 (diff) | |
content, data: Track.nameDetailWithinAlbum, directory magic, etc
| -rw-r--r-- | src/content/dependencies/generateAlbumSidebarTrackSection.js | 2 | ||||
| -rw-r--r-- | src/content/dependencies/generateAlbumTrackListItem.js | 2 | ||||
| -rw-r--r-- | src/content/dependencies/generateNearbyTrackList.js | 24 | ||||
| -rw-r--r-- | src/content/dependencies/generateTrackInfoPage.js | 2 | ||||
| -rw-r--r-- | src/content/dependencies/generateTrackListItem.js | 20 | ||||
| -rw-r--r-- | src/content/dependencies/generateTrackNavLinks.js | 2 | ||||
| -rw-r--r-- | src/data/things/Track.js | 154 |
7 files changed, 176 insertions, 30 deletions
diff --git a/src/content/dependencies/generateAlbumSidebarTrackSection.js b/src/content/dependencies/generateAlbumSidebarTrackSection.js index 97941698..94785c2d 100644 --- a/src/content/dependencies/generateAlbumSidebarTrackSection.js +++ b/src/content/dependencies/generateAlbumSidebarTrackSection.js @@ -42,7 +42,7 @@ export default { data.trackNameDetails = trackSection.tracks - .map(track => track.nameDetail); + .map(track => track.nameDetailWithinAlbum); data.tracksAreMissingCommentary = trackSection.tracks diff --git a/src/content/dependencies/generateAlbumTrackListItem.js b/src/content/dependencies/generateAlbumTrackListItem.js index 7024284b..e46e9904 100644 --- a/src/content/dependencies/generateAlbumTrackListItem.js +++ b/src/content/dependencies/generateAlbumTrackListItem.js @@ -47,7 +47,7 @@ export default { ? 'auto' : false), - showDetail: true, + showDetail: 'from within album', showDuration: (slots.collapseDurationScope === 'track' diff --git a/src/content/dependencies/generateNearbyTrackList.js b/src/content/dependencies/generateNearbyTrackList.js index ebea7206..ff1c969b 100644 --- a/src/content/dependencies/generateNearbyTrackList.js +++ b/src/content/dependencies/generateNearbyTrackList.js @@ -1,3 +1,5 @@ +import {stitchArrays} from '#sugar'; + export default { query: (tracks, contextTrack, _contextContributions) => ({ presentedTracks: @@ -14,6 +16,12 @@ export default { .map(track => relation('generateTrackListItem', track, contextContributions)), }), + data: (query, _tracks, contextTrack, _contextContributions) => ({ + presentedTracksMatchContextRelease: + query.presentedTracks + .map(track => track.album === contextTrack.album), + }), + slots: { showArtists: { validate: v => v.is(true, false, 'auto'), @@ -36,15 +44,25 @@ export default { }, }, - generate: (relations, slots, {html}) => + generate: (data, relations, slots, {html}) => html.tag('ul', {[html.onlyIfContent]: true}, - relations.items.map(item => + stitchArrays({ + item: relations.items, + releasesMatch: data.presentedTracksMatchContextRelease, + }).map(({item, releasesMatch}) => item.slots({ showArtists: slots.showArtists, showDuration: slots.showDuration, - showDetail: slots.showDetail, + + showDetail: + (slots.showDetail && releasesMatch + ? 'from within album' + : slots.showDetail + ? 'from across wiki' + : false), + colorMode: slots.colorMode, }))), }; diff --git a/src/content/dependencies/generateTrackInfoPage.js b/src/content/dependencies/generateTrackInfoPage.js index 33242b4e..8b92c1be 100644 --- a/src/content/dependencies/generateTrackInfoPage.js +++ b/src/content/dependencies/generateTrackInfoPage.js @@ -147,7 +147,7 @@ export default { track.nameStyle, nameDetail: - track.nameDetail, + track.nameDetailAcrossWiki, color: track.color, diff --git a/src/content/dependencies/generateTrackListItem.js b/src/content/dependencies/generateTrackListItem.js index c1f6ff93..ce975326 100644 --- a/src/content/dependencies/generateTrackListItem.js +++ b/src/content/dependencies/generateTrackListItem.js @@ -28,8 +28,11 @@ export default { date: track.date, - detail: - track.nameDetail, + nameDetailWithinAlbum: + track.nameDetailWithinAlbum, + + nameDetailAcrossWiki: + track.nameDetailAcrossWiki, duration: track.duration ?? 0, @@ -47,7 +50,7 @@ export default { }, showDetail: { - type: 'boolean', + validate: v => v.is('from across wiki', 'from within album', false), default: false, }, @@ -124,12 +127,19 @@ export default { relations.trackLink .slot('color', slots.colorMode === 'track'); - if (data.detail && slots.showDetail) { + const nameDetail = + (slots.showDetail === 'from within album' + ? data.nameDetailWithinAlbum + : slots.showDetail + ? data.nameDetailAcrossWiki + : null); + + if (nameDetail) { workingCapsule += '.withDetail'; workingOptions.detailAccent = html.tag('span', {class: 'name-detail'}, language.$(itemCapsule, 'withDetail', 'accent', { - detail: language.sanitize(data.detail), + detail: language.sanitize(nameDetail), })); } diff --git a/src/content/dependencies/generateTrackNavLinks.js b/src/content/dependencies/generateTrackNavLinks.js index 21ba48db..55029aa4 100644 --- a/src/content/dependencies/generateTrackNavLinks.js +++ b/src/content/dependencies/generateTrackNavLinks.js @@ -24,7 +24,7 @@ export default { track.trackNumber, nameDetail: - track.nameDetail, + track.nameDetailWithinAlbum, }), slots: { diff --git a/src/data/things/Track.js b/src/data/things/Track.js index 473de163..19d111e9 100644 --- a/src/data/things/Track.js +++ b/src/data/things/Track.js @@ -7,7 +7,7 @@ import find, {keyRefRegex} from '#find'; import {onlyItem} from '#sugar'; import {sortByDate, sortFlashesChronologically} from '#sort'; import Thing from '#thing'; -import {compareKebabCase} from '#wiki-data'; +import {compareKebabCase, getKebabCase} from '#wiki-data'; import { anyOf, @@ -19,6 +19,7 @@ import { isDate, isExcludingURLsReason, isFileExtension, + isString, validateReference, } from '#validators'; @@ -153,13 +154,11 @@ export class Track extends Thing { exposeConstant(V('normal')), ], - nameDetail: simpleString(), - directory: directory({ suffix: 'directorySuffix', }), - suffixDirectoryFromAlbum: [ + suffixDirectory: [ exposeUpdateValueOrContinue({ validate: input.value(isBoolean), }), @@ -580,6 +579,16 @@ export class Track extends Thing { // > Update only + nameDetail: { + flags: {update: true}, + update: { + validate: + anyOf( + is('album'), + isString), + }, + }, + find: soupyFind(), reverse: soupyReverse(), @@ -593,16 +602,101 @@ export class Track extends Thing { isTrack: exposeConstant(V(true)), + nameForReferencingAcrossWiki: [ + // When referencing without any particular context, + // all referenceByDirectory values except for 'normally' + // count against referencing by name. + { + dependencies: ['referenceByDirectory'], + compute: (continuation, {referenceByDirectory}) => + (referenceByDirectory !== 'normally' + ? continuation.exit(null) + : continuation()), + }, + + { + dependencies: ['name', 'nameDetailAcrossWiki'], + compute: (continuation, {name, nameDetailAcrossWiki}) => + (nameDetailAcrossWiki + ? continuation.exit(`${name} (${nameDetailAcrossWiki})`) + : continuation()), + }, + + exposeDependency('name'), + ], + commentatorArtists: commentatorArtists(), directorySuffix: [ - exitWithoutDependency('suffixDirectoryFromAlbum', { - value: input.value(null), - mode: input.value('falsy'), - }), - withPropertyFromObject('trackSection', V('directorySuffix')), - exposeDependency('#trackSection.directorySuffix'), + + { + dependencies: [ + '_suffixDirectory', + 'suffixDirectory', + '#trackSection.directorySuffix', + ], + + compute(continuation, { + ['_suffixDirectory']: suffixDirectoryUpdateValue, + [ 'suffixDirectory']: suffixDirectoryComputedValue, + ['#trackSection.directorySuffix']: directorySuffixFromAlbum, + }) { + // If directly set to true or inheriting true... + if (suffixDirectoryComputedValue === true) { + return directorySuffixFromAlbum; + } + + // If directly set to false... + if (suffixDirectoryUpdateValue === false) { + return null; + } + + // If inheriting false or defaulting to false... + return continuation(); + }, + }, + + // Don't follow any "automatic" directory suffix logic if the track's + // entire directory is set outright. + { + dependencies: ['_directory'], + compute(continuation, { + ['_directory']: directoryUpdateValue, + }) { + if (directoryUpdateValue) { + return null; + } + + return continuation(); + }, + }, + + { + dependencies: [ + '_nameDetail', + 'nameDetailAcrossWiki', + '#trackSection.directorySuffix', + ], + + compute(continuation, { + ['_nameDetail']: nameDetail, + [ 'nameDetailAcrossWiki']: nameDetailAcrossWiki, + ['#trackSection.directorySuffix']: directorySuffixFromAlbum, + }) { + if (nameDetail === 'album') { + return directorySuffixFromAlbum; + } + + if (nameDetailAcrossWiki) { + return getKebabCase(nameDetailAcrossWiki); + } + + return continuation(); + }, + }, + + exposeConstant(V(null)), ], date: [ @@ -639,6 +733,33 @@ export class Track extends Thing { }, ], + nameDetailWithinAlbum: [ + { + dependencies: ['_nameDetail'], + compute: ({ + ['_nameDetail']: nameDetail, + }) => + (nameDetail === 'album' + ? null + : nameDetail), + }, + ], + + nameDetailAcrossWiki: [ + withPropertyFromObject('album', V('name')), + + { + dependencies: ['_nameDetail', '#album.name'], + compute: ({ + ['_nameDetail']: nameDetail, + ['#album.name']: albumName, + }) => + (nameDetail === 'album' + ? albumName + : nameDetail), + }, + ], + // Whether or not the track has "unique" cover artwork - a cover which is // specifically associated with this track in particular, rather than with // the track's album as a whole. This is typically used to select between @@ -979,7 +1100,7 @@ export class Track extends Thing { 'Name Detail': {property: 'nameDetail'}, 'Directory': {property: 'directory'}, - 'Suffix Directory': {property: 'suffixDirectoryFromAlbum'}, + 'Suffix Directory': {property: 'suffixDirectory'}, 'Reference By Directory': {property: 'referenceByDirectory'}, @@ -1205,11 +1326,9 @@ export class Track extends Thing { bindTo: 'trackData', - // When referencing without any particular context, all values - // except for 'normally' count against referencing by name. getMatchableNames: track => - (track.referenceByDirectory === 'normally' - ? [track.name] + (track.nameForReferencingAcrossWiki + ? [track.nameForReferencingAcrossWiki] : []), }, @@ -1220,10 +1339,9 @@ export class Track extends Thing { include: track => !CacheableObject.getUpdateValue(track, 'mainRelease'), - // This is an acontextual reference. getMatchableNames: track => - (track.referenceByDirectory === 'normally' - ? [track.name] + (track.nameForReferencingAcrossWiki + ? [track.nameForReferencingAcrossWiki] : []), }, |