« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/dependencies')
-rw-r--r--src/content/dependencies/generateArtistInfoPageArtworksChunkItem.js5
-rw-r--r--src/content/dependencies/generateArtistInfoPageChunkItem.js34
-rw-r--r--src/content/dependencies/generateArtistInfoPageCommentaryChunkedList.js4
-rw-r--r--src/content/dependencies/generateArtistInfoPageOtherArtistLinks.js28
-rw-r--r--src/content/dependencies/generateArtistInfoPageTracksChunk.js92
-rw-r--r--src/content/dependencies/generateArtistInfoPageTracksChunkItem.js49
-rw-r--r--src/content/dependencies/generateTrackInfoPageOtherReleaseTooltip.js13
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
+};