« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/content/dependencies/generateNearbyTrackList.js20
-rw-r--r--src/content/dependencies/generateReferencedTracksList.js29
-rw-r--r--src/content/dependencies/generateTrackInfoPage.js17
-rw-r--r--src/content/dependencies/generateTrackInfoPageOtherReleasesLine.js80
-rw-r--r--src/content/dependencies/generateTrackInfoPageOtherReleasesList.js83
-rw-r--r--src/content/dependencies/generateTrackInfoPagePreviousProductionLine.js37
-rw-r--r--src/content/dependencies/generateTrackListDividedByGroups.js6
-rw-r--r--src/data/checks.js1
-rw-r--r--src/data/things/track.js23
-rw-r--r--src/strings-default.yaml8
10 files changed, 208 insertions, 96 deletions
diff --git a/src/content/dependencies/generateNearbyTrackList.js b/src/content/dependencies/generateNearbyTrackList.js
index 6771285a..56ab2df5 100644
--- a/src/content/dependencies/generateNearbyTrackList.js
+++ b/src/content/dependencies/generateNearbyTrackList.js
@@ -1,5 +1,5 @@
 export default {
-  query: (tracks, contextTrack) => ({
+  query: (tracks, contextTrack, _contextContributions) => ({
     presentedTracks:
       (contextTrack
         ? tracks.map(track =>
@@ -8,13 +8,23 @@ export default {
         : tracks),
   }),
 
-  relations: (relation, query, _tracks, _contextTrack) => ({
+  relations: (relation, query, _tracks, _contextTrack, contextContributions) => ({
     items:
       query.presentedTracks
-        .map(track => relation('generateTrackListItem', track, [])),
+        .map(track => relation('generateTrackListItem', track, contextContributions)),
   }),
 
   slots: {
+    showArtists: {
+      validate: v => v.is(true, false, 'auto'),
+      default: 'auto',
+    },
+
+    showDuration: {
+      type: 'boolean',
+      default: false,
+    },
+
     colorMode: {
       validate: v => v.is('none', 'track', 'line'),
       default: 'track',
@@ -27,8 +37,8 @@ export default {
 
       relations.items.map(item =>
         item.slots({
-          showArtists: 'auto',
-          showDuration: false,
+          showArtists: slots.showArtists,
+          showDuration: slots.showDuration,
           colorMode: slots.colorMode,
         }))),
 };
diff --git a/src/content/dependencies/generateReferencedTracksList.js b/src/content/dependencies/generateReferencedTracksList.js
new file mode 100644
index 00000000..1d566ce9
--- /dev/null
+++ b/src/content/dependencies/generateReferencedTracksList.js
@@ -0,0 +1,29 @@
+export default {
+  relations: (relation, track) => ({
+    previousProductionTrackList:
+      relation('generateNearbyTrackList',
+        track.previousProductionTracks,
+        track,
+        track.artistContribs),
+
+    referencedTrackList:
+      relation('generateNearbyTrackList',
+        track.referencedTracks,
+        track,
+        []),
+  }),
+
+  generate: (relations, {html, language}) =>
+    html.tag('ul', {[html.onlyIfContent]: true}, [
+      html.inside(relations.previousProductionTrackList)
+        .map(li => html.inside(li))
+        .map(label =>
+          html.tag('li',
+            language.$('trackList.item.previousProduction',
+              {track: label}))),
+
+      html.inside(relations.referencedTrackList),
+    ]),
+};
+
+
diff --git a/src/content/dependencies/generateTrackInfoPage.js b/src/content/dependencies/generateTrackInfoPage.js
index 3903e0fe..d3c2d766 100644
--- a/src/content/dependencies/generateTrackInfoPage.js
+++ b/src/content/dependencies/generateTrackInfoPage.js
@@ -80,17 +80,20 @@ export default {
     readCommentaryLine:
       relation('generateReadCommentaryLine', track),
 
-    otherReleasesList:
-      relation('generateTrackInfoPageOtherReleasesList', track),
+    otherReleasesLine:
+      relation('generateTrackInfoPageOtherReleasesLine', track),
+
+    previousProductionLine:
+      relation('generateTrackInfoPagePreviousProductionLine', track),
 
     contributorContributionList:
       relation('generateContributionList', track.contributorContribs),
 
     referencedTracksList:
-      relation('generateNearbyTrackList', track.referencedTracks, track),
+      relation('generateReferencedTracksList', track),
 
     sampledTracksList:
-      relation('generateNearbyTrackList', track.sampledTracks, track),
+      relation('generateNearbyTrackList', track.sampledTracks, track, []),
 
     referencedByTracksList:
       relation('generateTrackListDividedByGroups',
@@ -228,7 +231,11 @@ export default {
                   })),
             ])),
 
-          relations.otherReleasesList,
+          html.tag('p', {[html.onlyIfContent]: true},
+            relations.otherReleasesLine),
+
+          html.tag('p', {[html.onlyIfContent]: true},
+            relations.previousProductionLine),
 
           html.tags([
             relations.contentHeading.clone()
diff --git a/src/content/dependencies/generateTrackInfoPageOtherReleasesLine.js b/src/content/dependencies/generateTrackInfoPageOtherReleasesLine.js
new file mode 100644
index 00000000..1793b73f
--- /dev/null
+++ b/src/content/dependencies/generateTrackInfoPageOtherReleasesLine.js
@@ -0,0 +1,80 @@
+import {onlyItem, stitchArrays} from '#sugar';
+
+export default {
+  query(track) {
+    const query = {};
+
+    query.singleSingle =
+      onlyItem(
+        track.otherReleases.filter(track => track.album.style === 'single'));
+
+    query.regularReleases =
+      (query.singleSingle
+        ? track.otherReleases.filter(track => track !== query.singleSingle)
+        : track.otherReleases);
+
+    return query;
+  },
+
+  relations: (relation, query, _track) => ({
+    singleLink:
+      (query.singleSingle
+        ? relation('linkTrack', query.singleSingle)
+        : null),
+
+    trackLinks:
+      query.regularReleases
+        .map(track => relation('linkTrack', track)),
+  }),
+
+  data: (query, _track) => ({
+    albumNames:
+      query.regularReleases
+        .map(track => track.album.name),
+
+    albumColors:
+      query.regularReleases
+        .map(track => track.album.color),
+  }),
+
+  generate: (data, relations, {html, language}) =>
+    language.encapsulate('releaseInfo.alsoReleased', capsule =>
+      language.encapsulate(capsule, workingCapsule => {
+        const workingOptions = {};
+
+        let any = false;
+
+        const albumList =
+          language.formatConjunctionList(
+            stitchArrays({
+              trackLink: relations.trackLinks,
+              albumName: data.albumNames,
+              albumColor: data.albumColors,
+            }).map(({trackLink, albumName, albumColor}) =>
+                trackLink.slots({
+                  content: language.sanitize(albumName),
+                  color: albumColor,
+                })));
+
+        if (!html.isBlank(albumList)) {
+          any = true;
+          workingCapsule += '.onAlbums';
+          workingOptions.albums = albumList;
+        }
+
+        if (relations.singleLink) {
+          any = true;
+          workingCapsule += '.asSingle';
+          workingOptions.single =
+            relations.singleLink.slots({
+              content: language.$(capsule, 'single'),
+            });
+        }
+
+        if (any) {
+          return language.$(workingCapsule, workingOptions);
+        } else {
+          return html.blank();
+        }
+      })),
+};
diff --git a/src/content/dependencies/generateTrackInfoPageOtherReleasesList.js b/src/content/dependencies/generateTrackInfoPageOtherReleasesList.js
deleted file mode 100644
index ca6c3fb7..00000000
--- a/src/content/dependencies/generateTrackInfoPageOtherReleasesList.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import {onlyItem, stitchArrays} from '#sugar';
-
-export default {
-  query(track) {
-    const query = {};
-
-    query.singleSingle =
-      onlyItem(
-        track.otherReleases.filter(track => track.album.style === 'single'));
-
-    query.regularReleases =
-      (query.singleSingle
-        ? track.otherReleases.filter(track => track !== query.singleSingle)
-        : track.otherReleases);
-
-    return query;
-  },
-
-  relations: (relation, query, _track) => ({
-    singleLink:
-      (query.singleSingle
-        ? relation('linkTrack', query.singleSingle)
-        : null),
-
-    trackLinks:
-      query.regularReleases
-        .map(track => relation('linkTrack', track)),
-  }),
-
-  data: (query, _track) => ({
-    albumNames:
-      query.regularReleases
-        .map(track => track.album.name),
-
-    albumColors:
-      query.regularReleases
-        .map(track => track.album.color),
-  }),
-
-  generate: (data, relations, {html, language}) =>
-    html.tag('p',
-      {[html.onlyIfContent]: true},
-
-      language.encapsulate('releaseInfo.alsoReleased', capsule =>
-        language.encapsulate(capsule, workingCapsule => {
-          const workingOptions = {};
-
-          let any = false;
-
-          const albumList =
-            language.formatConjunctionList(
-              stitchArrays({
-                trackLink: relations.trackLinks,
-                albumName: data.albumNames,
-                albumColor: data.albumColors,
-              }).map(({trackLink, albumName, albumColor}) =>
-                  trackLink.slots({
-                    content: language.sanitize(albumName),
-                    color: albumColor,
-                  })));
-
-          if (!html.isBlank(albumList)) {
-            any = true;
-            workingCapsule += '.onAlbums';
-            workingOptions.albums = albumList;
-          }
-
-          if (relations.singleLink) {
-            any = true;
-            workingCapsule += '.asSingle';
-            workingOptions.single =
-              relations.singleLink.slots({
-                content: language.$(capsule, 'single'),
-              });
-          }
-
-          if (any) {
-            return language.$(workingCapsule, workingOptions);
-          } else {
-            return html.blank();
-          }
-        }))),
-};
diff --git a/src/content/dependencies/generateTrackInfoPagePreviousProductionLine.js b/src/content/dependencies/generateTrackInfoPagePreviousProductionLine.js
new file mode 100644
index 00000000..b2f50cf3
--- /dev/null
+++ b/src/content/dependencies/generateTrackInfoPagePreviousProductionLine.js
@@ -0,0 +1,37 @@
+import {stitchArrays} from '#sugar';
+import {getKebabCase} from '#wiki-data';
+
+export default {
+  relations: (relation, track) => ({
+    trackLinks:
+      track.followingProductionTracks
+        .map(track => relation('linkTrack', track)),
+
+    albumLinks:
+      track.followingProductionTracks
+        .map(following =>
+          (following.album !== track.album &&
+           getKebabCase(following.name) === getKebabCase(track.name)
+
+            ? relation('linkAlbum', following.album)
+            : null)),
+  }),
+
+  generate: (relations, {language}) =>
+    language.encapsulate('releaseInfo.previousProduction', capsule =>
+      language.$(capsule, {
+        [language.onlyIfOptions]: ['tracks'],
+
+        tracks:
+          stitchArrays({
+            trackLink: relations.trackLinks,
+            albumLink: relations.albumLinks,
+          }).map(({trackLink, albumLink}) =>
+              (albumLink
+                ? language.$(capsule, 'trackOnAlbum', {
+                    track: trackLink,
+                    album: albumLink,
+                  })
+                : trackLink)),
+      })),
+};
diff --git a/src/content/dependencies/generateTrackListDividedByGroups.js b/src/content/dependencies/generateTrackListDividedByGroups.js
index c23617ff..419d7c0f 100644
--- a/src/content/dependencies/generateTrackListDividedByGroups.js
+++ b/src/content/dependencies/generateTrackListDividedByGroups.js
@@ -45,7 +45,7 @@ export default {
   relations: (relation, query, sprawl, tracks, contextTrack) => ({
     flatList:
       (empty(sprawl.divideTrackListsByGroups)
-        ? relation('generateNearbyTrackList', tracks, contextTrack)
+        ? relation('generateNearbyTrackList', tracks, contextTrack, [])
         : null),
 
     contentHeading:
@@ -57,12 +57,12 @@ export default {
 
     groupedTrackLists:
       query.groupedTracks
-        .map(tracks => relation('generateNearbyTrackList', tracks, contextTrack)),
+        .map(tracks => relation('generateNearbyTrackList', tracks, contextTrack, [])),
 
     ungroupedTrackList:
       (empty(query.ungroupedTracks)
         ? null
-        : relation('generateNearbyTrackList', query.ungroupedTracks, contextTrack)),
+        : relation('generateNearbyTrackList', query.ungroupedTracks, contextTrack, [])),
   }),
 
   data: (query, _sprawl, _tracks) => ({
diff --git a/src/data/checks.js b/src/data/checks.js
index e68b2ed0..4786f16b 100644
--- a/src/data/checks.js
+++ b/src/data/checks.js
@@ -297,6 +297,7 @@ export function filterReferenceErrors(wikiData, {
       artistContribs: '_contrib',
       contributorContribs: '_contrib',
       coverArtistContribs: '_contrib',
+      previousProductionTracks: '_trackMainReleasesOnly',
       referencedTracks: '_trackMainReleasesOnly',
       sampledTracks: '_trackMainReleasesOnly',
       artTags: '_artTag',
diff --git a/src/data/things/track.js b/src/data/things/track.js
index 93193b6a..64790a61 100644
--- a/src/data/things/track.js
+++ b/src/data/things/track.js
@@ -393,6 +393,17 @@ export class Track extends Thing {
 
     // > Update & expose - Referenced tracks
 
+    previousProductionTracks: [
+      inheritFromMainRelease({
+        notFoundValue: input.value([]),
+      }),
+
+      referenceList({
+        class: input.value(Track),
+        find: soupyFind.input('trackMainReleasesOnly'),
+      }),
+    ],
+
     referencedTracks: [
       inheritFromMainRelease({
         notFoundValue: input.value([]),
@@ -563,6 +574,10 @@ export class Track extends Thing {
       }),
     ],
 
+    followingProductionTracks: reverseReferenceList({
+      reverse: soupyReverse.input('tracksWhichAreFollowingProductionsOf'),
+    }),
+
     referencedByTracks: reverseReferenceList({
       reverse: soupyReverse.input('tracksWhichReference'),
     }),
@@ -701,6 +716,7 @@ export class Track extends Thing {
 
       // Referenced tracks
 
+      'Previous Productions': {property: 'previousProductionTracks'},
       'Referenced Tracks': {property: 'referencedTracks'},
       'Sampled Tracks': {property: 'sampledTracks'},
 
@@ -912,6 +928,13 @@ export class Track extends Thing {
       referencing: track => track.isSecondaryRelease ? [track] : [],
       referenced: track => [track.mainReleaseTrack],
     },
+
+    tracksWhichAreFollowingProductionsOf: {
+      bindTo: 'trackData',
+
+      referencing: track => track,
+      referenced: track => track.previousProductionTracks,
+    },
   };
 
   // Track YAML loading is handled in album.js.
diff --git a/src/strings-default.yaml b/src/strings-default.yaml
index 5bbecbf3..85d849db 100644
--- a/src/strings-default.yaml
+++ b/src/strings-default.yaml
@@ -301,6 +301,11 @@ releaseInfo:
 
     single: "as a single"
 
+  previousProduction:
+    _: "This track is a previous version or production of {TRACKS}."
+
+    trackOnAlbum: "{TRACK} (on {ALBUM})"
+
   tracksReferenced:
     _: "Tracks that {TRACK} references:"
     sticky: "Tracks that this one references:"
@@ -462,6 +467,9 @@ trackList:
     rerelease: >-
       {TRACK} (rerelease)
 
+    previousProduction: >-
+      {TRACK} (previous version or production)
+
 #
 # misc:
 #