diff options
Diffstat (limited to 'src/content')
7 files changed, 133 insertions, 92 deletions
diff --git a/src/content/dependencies/generateArtistInfoPageArtworksChunkItem.js b/src/content/dependencies/generateArtistInfoPageArtworksChunkItem.js index e3ba5342..993ef706 100644 --- a/src/content/dependencies/generateArtistInfoPageArtworksChunkItem.js +++ b/src/content/dependencies/generateArtistInfoPageArtworksChunkItem.js @@ -21,9 +21,6 @@ export default { ? relation('linkTrack', contrib.thing.thing) : null), - otherArtistLinks: - relation('generateArtistInfoPageOtherArtistLinks', [contrib]), - originDetails: relation('transformContent', contrib.thing.originDetails), }), @@ -48,8 +45,6 @@ export default { generate: (data, relations, slots, {html, language}) => relations.template.slots({ - otherArtistLinks: relations.otherArtistLinks, - annotation: language.encapsulate('artistPage.creditList.entry.artwork.accent', workingCapsule => { const workingOptions = {}; diff --git a/src/content/dependencies/generateArtistInfoPageChunkItem.js b/src/content/dependencies/generateArtistInfoPageChunkItem.js index 8117ca9a..92af420b 100644 --- a/src/content/dependencies/generateArtistInfoPageChunkItem.js +++ b/src/content/dependencies/generateArtistInfoPageChunkItem.js @@ -1,5 +1,3 @@ -import {empty} from '#sugar'; - export default { relations: (relation) => ({ textWithTooltip: @@ -17,8 +15,9 @@ export default { mutable: false, }, - otherArtistLinks: { - validate: v => v.strictArrayOf(v.isHTML), + citation: { + type: 'html', + mutable: false, }, rereleaseTooltip: { @@ -54,11 +53,7 @@ export default { text: language.$(entryCapsule, 'rerelease.term'), tooltip: slots.rereleaseTooltip, }); - - return language.$(workingCapsule, workingOptions); - } - - if (!html.isBlank(slots.firstReleaseTooltip)) { + } else if (!html.isBlank(slots.firstReleaseTooltip)) { workingCapsule += '.firstRelease'; workingOptions.firstRelease = relations.textWithTooltip.slots({ @@ -66,29 +61,20 @@ export default { text: language.$(entryCapsule, 'firstRelease.term'), tooltip: slots.firstReleaseTooltip, }); - - return language.$(workingCapsule, workingOptions); - } - - let anyAccent = false; - - if (!empty(slots.otherArtistLinks)) { - anyAccent = true; - workingCapsule += '.withArtists'; - workingOptions.artists = - language.formatConjunctionList(slots.otherArtistLinks); } if (!html.isBlank(slots.annotation)) { - anyAccent = true; workingCapsule += '.withAnnotation'; workingOptions.annotation = slots.annotation; + } else if (!html.isBlank(slots.citation)) { + workingCapsule += '.withCitation'; + workingOptions.citation = slots.citation; } - if (anyAccent) { - return language.$(workingCapsule, workingOptions); - } else { + if (workingCapsule === entryCapsule) { return slots.content; + } else { + return language.$(workingCapsule, workingOptions); } }), diff --git a/src/content/dependencies/generateArtistInfoPageCommentaryChunkedList.js b/src/content/dependencies/generateArtistInfoPageCommentaryChunkedList.js index 08446a2e..572eb982 100644 --- a/src/content/dependencies/generateArtistInfoPageCommentaryChunkedList.js +++ b/src/content/dependencies/generateArtistInfoPageCommentaryChunkedList.js @@ -231,7 +231,9 @@ export default { type: itemTypes, }).map(({item, link, annotation, type}) => item.slots({ - annotation: + // The citation slot, instead of annotation, gives commentary + // a specially custom look. + citation: annotation.slots({ mode: 'inline', absorbPunctuationFollowingExternalLinks: false, diff --git a/src/content/dependencies/generateArtistInfoPageOtherArtistLinks.js b/src/content/dependencies/generateArtistInfoPageOtherArtistLinks.js deleted file mode 100644 index afb61c33..00000000 --- a/src/content/dependencies/generateArtistInfoPageOtherArtistLinks.js +++ /dev/null @@ -1,28 +0,0 @@ -import {unique} from '#sugar'; - -export default { - query(contribs) { - const associatedContributionsByOtherArtists = - contribs - .flatMap(ownContrib => - ownContrib.associatedContributions - .filter(associatedContrib => - associatedContrib.artist !== ownContrib.artist)); - - const otherArtists = - unique( - associatedContributionsByOtherArtists - .map(contrib => contrib.artist)); - - return {otherArtists}; - }, - - relations: (relation, query) => ({ - artistLinks: - query.otherArtists - .map(artist => relation('linkArtist', artist)), - }), - - generate: (relations) => - relations.artistLinks, -}; diff --git a/src/content/dependencies/generateArtistInfoPageTracksChunk.js b/src/content/dependencies/generateArtistInfoPageTracksChunk.js index 7d00fdd6..50278271 100644 --- a/src/content/dependencies/generateArtistInfoPageTracksChunk.js +++ b/src/content/dependencies/generateArtistInfoPageTracksChunk.js @@ -2,24 +2,70 @@ import {sortAlbumsTracksChronologically} from '#sort'; import {empty, unique} from '#sugar'; import {getTotalDuration} from '#wiki-data'; +function countTowardTotals(contribs) { + const track = contribs[0].thing; + + if (track.isSecondaryRelease) { + const all = + Object.fromEntries( + unique(contribs.map(contrib => contrib.thingProperty)) + .map(prop => [ + prop, + track.mainReleaseTrack[prop].slice(), + ])); + + contribs = contribs.flatMap(a => { + const array = all[a.thingProperty]; + const index = + array.findIndex(b => + b.artist === a.artist && + b.annotation === a.annotation); + + if (index === -1) return []; + return array.splice(index, 1); + }).filter(Boolean); + } + + return contribs.some(contrib => + contrib.countInContributionTotals || + contrib.countInDurationTotals); +} + export default { - relations: (relation, artist, album, trackContribLists) => ({ + query: (_artist, _album, trackContribLists) => ({ + contribListsCountingTowardTotals: + trackContribLists + .filter(contribs => countTowardTotals(contribs)), + + contribListsNotCountingTowardTotals: + trackContribLists + .filter(contribs => !countTowardTotals(contribs)), + }), + + relations: (relation, query, artist, album, _trackContribLists) => ({ template: relation('generateArtistInfoPageChunk'), albumLink: relation('linkAlbum', album), - // Intentional mapping here: each item may be associated with - // more than one contribution. - items: - trackContribLists.map(trackContribs => + albumArtistCredit: + relation('generateArtistCredit', album.artistContribs, []), + + itemsCountingTowardTotals: + query.contribListsCountingTowardTotals.map(trackContribs => + relation('generateArtistInfoPageTracksChunkItem', + artist, + trackContribs)), + + itemsNotCountingTowardTotals: + query.contribListsNotCountingTowardTotals.map(trackContribs => relation('generateArtistInfoPageTracksChunkItem', artist, trackContribs)), }), - data(artist, album, trackContribLists) { + data(artist, _query, album, trackContribLists) { const data = {}; const contribs = @@ -71,10 +117,28 @@ export default { return data; }, - generate: (data, relations, {html}) => + generate: (data, relations, {html, language}) => relations.template.slots({ mode: 'album', - link: relations.albumLink, + + link: + language.encapsulate('artistPage.creditList.album', workingCapsule => { + const creditCapsule = workingCapsule + '.credit'; + const workingOptions = {album: relations.albumLink}; + + relations.albumArtistCredit.setSlots({ + normalStringKey: creditCapsule + '.by', + }); + + if (!html.isBlank(relations.albumArtistCredit)) { + workingCapsule += '.withCredit'; + workingOptions.credit = + html.tag('span', {class: 'by'}, + relations.albumArtistCredit); + } + + return language.$(workingCapsule, workingOptions); + }), dates: data.dates, duration: data.duration, @@ -85,6 +149,16 @@ export default { data.numLinkingOtherReleases > 1 && {class: 'offset-tooltips'}, - relations.items), + [ + relations.itemsCountingTowardTotals, + + !empty(relations.itemsCountingTowardTotals) && + !empty(relations.itemsNotCountingTowardTotals) && + html.tag('li', {class: 'divider'}, + html.tag('hr')), + + relations.itemsNotCountingTowardTotals + .map(item => item.slot('showDuration', false)), + ]), }), }; diff --git a/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js b/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js index e976c57f..f53e0f81 100644 --- a/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js +++ b/src/content/dependencies/generateArtistInfoPageTracksChunkItem.js @@ -10,9 +10,11 @@ export default { query.track = contribs[0].thing; - const creditedAsArtist = + const creditedAsNormalArtist = contribs - .some(contrib => contrib.thingProperty === 'artistContribs'); + .some(contrib => + contrib.thingProperty === 'artistContribs' && + contrib.annotation !== 'featuring'); const creditedAsContributor = contribs @@ -20,7 +22,9 @@ export default { const annotatedContribs = contribs - .filter(contrib => contrib.annotation); + .filter(contrib => + contrib.annotation && + contrib.annotation !== 'featuring'); const annotatedArtistContribs = annotatedContribs @@ -39,7 +43,7 @@ export default { // Return seemingly only for "bass clarinet" when they're also // the one who composed and arranged Renewed Return! if ( - creditedAsArtist && + creditedAsNormalArtist && creditedAsContributor && empty(annotatedArtistContribs) ) { @@ -84,15 +88,19 @@ export default { return query; }, - relations: (relation, query, artist, contribs) => ({ + relations: (relation, query, artist, _contribs) => ({ template: relation('generateArtistInfoPageChunkItem'), trackLink: relation('linkTrack', query.track), - otherArtistLinks: - relation('generateArtistInfoPageOtherArtistLinks', contribs), + trackListItem: + relation('generateTrackListItem', + query.track, + (empty(query.track.album.artistContribs) + ? [artist.mockSimpleContribution] + : query.track.album.artistContribs)), rereleaseTooltip: (query.isLaterRelease @@ -116,9 +124,15 @@ export default { : null), }), - generate: (data, relations, {html, language}) => + slots: { + showDuration: { + type: 'boolean', + default: true, + }, + }, + + generate: (data, relations, slots, {html, language}) => relations.template.slots({ - otherArtistLinks: relations.otherArtistLinks, rereleaseTooltip: relations.rereleaseTooltip, firstReleaseTooltip: relations.firstReleaseTooltip, @@ -128,16 +142,13 @@ export default { : html.blank()), content: - language.encapsulate('artistPage.creditList.entry.track', workingCapsule => { - const workingOptions = {track: relations.trackLink}; - - if (data.duration) { - workingCapsule += '.withDuration'; - workingOptions.duration = - language.formatDuration(data.duration); - } - - return language.$(workingCapsule, workingOptions); + language.$('artistPage.creditList.entry.track', { + track: + html.inside( + relations.trackListItem.slots({ + showArtists: 'auto', + showDuration: slots.showDuration, + })), }), }), }; diff --git a/src/content/dependencies/generateTrackInfoPageOtherReleaseTooltip.js b/src/content/dependencies/generateTrackInfoPageOtherReleaseTooltip.js index 92ab52ba..fcb2e2fa 100644 --- a/src/content/dependencies/generateTrackInfoPageOtherReleaseTooltip.js +++ b/src/content/dependencies/generateTrackInfoPageOtherReleaseTooltip.js @@ -43,11 +43,12 @@ export default { }), data.otherDate && data.currentDate && - language.formatRelativeDate(data.otherDate, data.currentDate, { - considerRoundingDays: true, - approximate: true, - absolute: false, - }), + html.tag('span', {class: 'when'}, + language.formatRelativeDate(data.otherDate, data.currentDate, { + considerRoundingDays: true, + approximate: true, + absolute: false, + })), ], })), -}; \ No newline at end of file +}; |