« 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/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
7 files changed, 176 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) => ({