« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/data/things
diff options
context:
space:
mode:
Diffstat (limited to 'src/data/things')
-rw-r--r--src/data/things/Track.js115
-rw-r--r--src/data/things/album/Album.js11
-rw-r--r--src/data/things/album/TrackSection.js16
3 files changed, 50 insertions, 92 deletions
diff --git a/src/data/things/Track.js b/src/data/things/Track.js
index a615af4a..7ce55e51 100644
--- a/src/data/things/Track.js
+++ b/src/data/things/Track.js
@@ -7,7 +7,7 @@ import find, {keyRefRegex} from '#find';
 import {empty, onlyItem} from '#sugar';
 import {sortByDate, sortFlashesChronologically} from '#sort';
 import Thing from '#thing';
-import {compareKebabCase, getKebabCase} from '#wiki-data';
+import {compareKebabCase} from '#wiki-data';
 
 import {
   anyOf,
@@ -17,9 +17,11 @@ import {
   isContentString,
   isContributionList,
   isDate,
+  isDirectory,
   isExcludingURLsReason,
   isFileExtension,
   isString,
+  strictArrayOf,
   validateReference,
 } from '#validators';
 
@@ -69,6 +71,7 @@ import {
 } from '#composite/data';
 
 import {
+  withDirectory,
   withRecontextualizedContributionList,
   withRedatedContributionList,
   withResolvedContribs,
@@ -100,6 +103,7 @@ import {
 import {
   inheritContributionListFromMainRelease,
   inheritFromMainRelease,
+  withDirectorySuffixes,
 } from '#composite/things/track';
 
 export class Track extends Thing {
@@ -155,16 +159,26 @@ export class Track extends Thing {
     ],
 
     directory: directory({
-      suffix: 'directorySuffix',
+      suffix: 'suffixDirectory',
     }),
 
     suffixDirectory: [
-      exposeUpdateValueOrContinue({
-        validate: input.value(isBoolean),
+      withDirectorySuffixes({
+        from:
+          input.updateValue({
+            validate:
+              anyOf(
+                isBoolean,
+                is('album'),
+                isDirectory,
+                strictArrayOf(
+                  anyOf(
+                    is('album'),
+                    isDirectory))),
+          }),
       }),
 
-      withPropertyFromObject('trackSection', V('suffixTrackDirectories')),
-      exposeDependency('#trackSection.suffixTrackDirectories'),
+      exposeDependency('#directorySuffix'),
     ],
 
     referenceByDirectory: [
@@ -674,80 +688,25 @@ export class Track extends Thing {
       exposeDependency('name'),
     ],
 
-    commentatorArtists: commentatorArtists(),
-
-    directorySuffix: [
-      withPropertyFromObject('trackSection', V('directorySuffix')),
-
-      {
-        dependencies: [
-          '_suffixDirectory',
-           'suffixDirectory',
-          '#trackSection.directorySuffix',
-        ],
-
-        compute(continuation, {
-          ['_suffixDirectory']: suffixDirectoryUpdateValue,
-          [ 'suffixDirectory']: suffixDirectoryComputedValue,
-          ['#trackSection.directorySuffix']: directorySuffixFromAlbum,
-        }) {
-          // If directly set to true or inheriting true...
-          if (suffixDirectoryComputedValue === true) {
-            return directorySuffixFromAlbum;
-          }
-
-          // If directly set to false...
-          if (suffixDirectoryUpdateValue === false) {
-            return null;
-          }
-
-          // If inheriting false or defaulting to false...
-          return continuation();
-        },
-      },
+    directoryWithinAlbum: [
+      withDirectorySuffixes(),
 
-      // Don't follow any "automatic" directory suffix logic if the track's
-      // entire directory is set outright.
-      {
-        dependencies: ['_directory'],
-        compute(continuation, {
-          ['_directory']: directoryUpdateValue,
-        }) {
-          if (directoryUpdateValue) {
-            return null;
-          }
-
-          return continuation();
-        },
-      },
-
-      {
-        dependencies: [
-          '_nameDetail',
-           'nameDetailAcrossWiki',
-          '#trackSection.directorySuffix',
-        ],
-
-        compute(continuation, {
-          ['_nameDetail']: nameDetail,
-          [ 'nameDetailAcrossWiki']: nameDetailAcrossWiki,
-          ['#trackSection.directorySuffix']: directorySuffixFromAlbum,
-        }) {
-          if (nameDetail === 'album') {
-            return directorySuffixFromAlbum;
-          }
-
-          if (nameDetailAcrossWiki) {
-            return getKebabCase(nameDetailAcrossWiki);
-          }
+      withDirectory({
+        directory: '_directory',
+        name: 'name',
+        suffix: '#directorySuffixWithinAlbum',
+      }),
 
-          return continuation();
-        },
-      },
+      exposeDependency('#directory'),
+    ],
 
-      exposeConstant(V(null)),
+    suffixDirectoryWithinAlbum: [
+      withDirectorySuffixes(),
+      exposeDependency('#directorySuffixWithinAlbum'),
     ],
 
+    commentatorArtists: commentatorArtists(),
+
     date: [
       {
         dependencies: ['disableDate'],
@@ -1467,8 +1426,8 @@ export class Track extends Thing {
     const ext = artwork.fileExtension;
     const basename =
       (artwork.unqualifiedDirectory
-        ? this.directory + '-' + artwork.unqualifiedDirectory
-        : this.directory);
+        ? this.directoryWithinAlbum + '-' + artwork.unqualifiedDirectory
+        : this.directoryWithinAlbum);
 
     return this.album.getAlbumArtPath(`${basename}.${ext}`);
   }
@@ -1484,7 +1443,7 @@ export class Track extends Thing {
     const trackPrefix =
       (isSingleFirstTrack
         ? ''
-        : this.directory + '-');
+        : this.directoryWithinAlbum + '-');
 
     const filename =
       trackPrefix +
diff --git a/src/data/things/album/Album.js b/src/data/things/album/Album.js
index 7efc2d8c..369186f3 100644
--- a/src/data/things/album/Album.js
+++ b/src/data/things/album/Album.js
@@ -122,8 +122,7 @@ export class Album extends Thing {
 
     directory: directory(),
 
-    // note: this is currently strictly "directory suffix for tracks"
-    directorySuffix: [
+    directorySuffixForTracks: [
       exposeUpdateValueOrContinue({
         validate: input.value(isDirectory),
       }),
@@ -137,6 +136,8 @@ export class Album extends Thing {
       },
     ],
 
+    suffixTrackDirectoriesByDefault: flag(V(false)),
+
     alwaysReferenceByDirectory: flag(V(false)),
 
     referenceTracksByDirectory: [
@@ -153,8 +154,6 @@ export class Album extends Thing {
       exposeConstant(V('normally')),
     ],
 
-    suffixTrackDirectories: flag(V(false)),
-
     style: [
       exposeUpdateValueOrContinue({
         validate: input.value(is(...[
@@ -640,8 +639,8 @@ export class Album extends Thing {
       'Name Detail For Tracks': {property: 'nameDetailForTracks'},
 
       'Directory': {property: 'directory'},
-      'Directory Suffix': {property: 'directorySuffix'},
-      'Suffix Track Directories': {property: 'suffixTrackDirectories'},
+      'Directory Suffix': {property: 'directorySuffixForTracks'},
+      'Suffix Track Directories': {property: 'suffixTrackDirectoriesByDefault'},
 
       'Always Reference By Directory': {property: 'alwaysReferenceByDirectory'},
 
diff --git a/src/data/things/album/TrackSection.js b/src/data/things/album/TrackSection.js
index 451f8f7b..00963d1b 100644
--- a/src/data/things/album/TrackSection.js
+++ b/src/data/things/album/TrackSection.js
@@ -50,22 +50,22 @@ export class TrackSection extends Thing {
 
     unqualifiedDirectory: directory(),
 
-    directorySuffix: [
+    directorySuffixForTracks: [
       exposeUpdateValueOrContinue({
         validate: input.value(isDirectory),
       }),
 
-      withPropertyFromObject('album', V('directorySuffix')),
-      exposeDependency('#album.directorySuffix'),
+      withPropertyFromObject('album', V('directorySuffixForTracks')),
+      exposeDependency('#album.directorySuffixForTracks'),
     ],
 
-    suffixTrackDirectories: [
+    suffixTrackDirectoriesByDefault: [
       exposeUpdateValueOrContinue({
         validate: input.value(isBoolean),
       }),
 
-      withPropertyFromObject('album', V('suffixTrackDirectories')),
-      exposeDependency('#album.suffixTrackDirectories'),
+      withPropertyFromObject('album', V('suffixTrackDirectoriesByDefault')),
+      exposeDependency('#album.suffixTrackDirectoriesByDefault'),
     ],
 
     color: [
@@ -204,8 +204,8 @@ export class TrackSection extends Thing {
   static [Thing.yamlDocumentSpec] = {
     fields: {
       'Section': {property: 'name'},
-      'Directory Suffix': {property: 'directorySuffix'},
-      'Suffix Track Directories': {property: 'suffixTrackDirectories'},
+      'Directory Suffix': {property: 'directorySuffixForTracks'},
+      'Suffix Track Directories': {property: 'suffixTrackDirectoriesByDefault'},
 
       'Color': {property: 'color'},
       'Has Track Numbers': {property: 'hasTrackNumbers'},