« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/content/dependencies/generateTrackInfoPageOtherReleasesList.js86
-rw-r--r--src/strings-default.yaml12
2 files changed, 77 insertions, 21 deletions
diff --git a/src/content/dependencies/generateTrackInfoPageOtherReleasesList.js b/src/content/dependencies/generateTrackInfoPageOtherReleasesList.js
index ebd76577..550c86b3 100644
--- a/src/content/dependencies/generateTrackInfoPageOtherReleasesList.js
+++ b/src/content/dependencies/generateTrackInfoPageOtherReleasesList.js
@@ -1,22 +1,42 @@
-import {stitchArrays} from '#sugar';
+import {onlyItem, stitchArrays} from '#sugar';
 
 export default {
   contentDependencies: ['linkTrack'],
   extraDependencies: ['html', 'language'],
 
-  relations: (relation, track) => ({
+  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:
-      track.otherReleases
+      query.regularReleases
         .map(track => relation('linkTrack', track)),
   }),
 
-  data: (track) => ({
+  data: (query, _track) => ({
     albumNames:
-      track.otherReleases
+      query.regularReleases
         .map(track => track.album.name),
 
     albumColors:
-      track.otherReleases
+      query.regularReleases
         .map(track => track.album.color),
   }),
 
@@ -24,19 +44,43 @@ export default {
     html.tag('p',
       {[html.onlyIfContent]: true},
 
-      language.$('releaseInfo.alsoReleasedOn', {
-        [language.onlyIfOptions]: ['albums'],
-
-        albums:
-          language.formatConjunctionList(
-            stitchArrays({
-              trackLink: relations.trackLinks,
-              albumName: data.albumNames,
-              albumColor: data.albumColors,
-            }).map(({trackLink, albumName, albumColor}) =>
-                trackLink.slots({
-                  content: language.sanitize(albumName),
-                  color: albumColor,
-                }))),
-      })),
+      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/strings-default.yaml b/src/strings-default.yaml
index 108aec2b..3193890b 100644
--- a/src/strings-default.yaml
+++ b/src/strings-default.yaml
@@ -299,6 +299,18 @@ releaseInfo:
 
   note: "Context notes:"
 
+  alsoReleased:
+    onAlbums: >-
+      Also released on {ALBUMS}.
+
+    asSingle: >-
+      Also released {SINGLE}.
+
+    onAlbums.asSingle: >-
+      Also released on {ALBUMS}, and {SINGLE}.
+
+    single: "as a single"
+
   alsoReleasedOn: "Also released on {ALBUMS}."
 
   tracksReferenced: