« get me outta code hell

content, data: generateRelationsContentHeading, Track.nameStyle - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2026-05-11 19:00:59 -0300
committer(quasar) nebula <qznebula@protonmail.com>2026-05-11 19:00:59 -0300
commit657e1c1e447ad8939d2ad9286af00be52975f791 (patch)
tree8f471ff45bad3f1890357f8cbe54c75e5b01fb09 /src
parent38672451c0f2380093283156609018cce789bb50 (diff)
content, data: generateRelationsContentHeading, Track.nameStyle
Diffstat (limited to 'src')
-rw-r--r--src/content/dependencies/generateContentContentHeading.js32
-rw-r--r--src/content/dependencies/generateRelationsContentHeading.js39
-rw-r--r--src/content/dependencies/generateTrackInfoPage.js142
-rw-r--r--src/data/things/Track.js14
-rw-r--r--src/strings-default.yaml16
5 files changed, 136 insertions, 107 deletions
diff --git a/src/content/dependencies/generateContentContentHeading.js b/src/content/dependencies/generateContentContentHeading.js
index 9ed2d9f0..44053427 100644
--- a/src/content/dependencies/generateContentContentHeading.js
+++ b/src/content/dependencies/generateContentContentHeading.js
@@ -6,9 +6,10 @@ export default {
 
   data: (thing) => ({
     name:
-      (thing
-        ? thing.name
-        : null),
+      (thing ? thing.name : null),
+
+    nameStyle:
+      (thing ? thing.nameStyle : null),
   }),
 
   slots: {
@@ -32,33 +33,40 @@ export default {
       attributes: slots.attributes,
 
       title:
-        (() => {
+        language.encapsulate(slots.string, workingCapsule => {
           if (!slots.string) return html.blank();
 
-          const options = {};
+          const workingOptions = {};
 
           if (slots.summary) {
-            options.cue =
+            workingOptions.cue =
               html.tag('span', {class: 'cue'},
                 language.$(slots.string, 'cue'));
           }
 
-          if (data.name) {
-            options.thing = html.tag('i', data.name);
+          const name =
+            (data.nameStyle === 'utility'
+              ? null
+              : data.name);
+
+          if (name) {
+            workingOptions.thing = html.tag('i', name);
+          } else {
+            workingCapsule += '.withoutName';
           }
 
           if (slots.summary) {
             return html.tags([
               html.tag('span', {class: 'when-open'},
-                language.$(slots.string, options)),
+                language.$(workingCapsule, workingOptions)),
 
               html.tag('span', {class: 'when-collapsed'},
-                language.$(slots.string, 'collapsed', options)),
+                language.$(workingCapsule, 'collapsed', workingOptions)),
             ]);
           } else {
-            return language.$(slots.string, options);
+            return language.$(workingCapsule, workingOptions);
           }
-        })(),
+        }),
 
       stickyTitle:
         (slots.string
diff --git a/src/content/dependencies/generateRelationsContentHeading.js b/src/content/dependencies/generateRelationsContentHeading.js
new file mode 100644
index 00000000..5d50c2fc
--- /dev/null
+++ b/src/content/dependencies/generateRelationsContentHeading.js
@@ -0,0 +1,39 @@
+export default {
+  relations: (relation, _thing) => ({
+    contentHeading:
+      relation('generateContentHeading'),
+  }),
+
+  data: (nameSlot, thing) => ({
+    nameSlot,
+
+    name: thing.name,
+    nameStyle: thing.nameStyle,
+  }),
+
+  slots: {
+    attributes: {type: 'attributes', mutable: false},
+    string: {type: 'string'},
+  },
+
+  generate(data, relations, slots, {html, language}) {
+    const namePart =
+      (data.nameStyle === 'utility'
+        ? null
+        : html.tag('i', data.name));
+
+    const title =
+      (namePart
+        ? language.$(slots.string, {[data.nameSlot]: namePart})
+        : language.$(slots.string, 'withoutName'));
+
+    const stickyTitle =
+      language.$(slots.string, 'sticky');
+
+    return relations.contentHeading.slots({
+      attributes: slots.attributes,
+      title,
+      stickyTitle,
+    });
+  },
+};
diff --git a/src/content/dependencies/generateTrackInfoPage.js b/src/content/dependencies/generateTrackInfoPage.js
index 5dce680b..daba1ead 100644
--- a/src/content/dependencies/generateTrackInfoPage.js
+++ b/src/content/dependencies/generateTrackInfoPage.js
@@ -76,6 +76,9 @@ export default {
     contentHeading:
       relation('generateContentHeading'),
 
+    relationsContentHeading:
+      relation('generateRelationsContentHeading', 'track', track),
+
     name:
       relation('generateName', track),
 
@@ -237,11 +240,10 @@ export default {
             relations.otherReleasesLine),
 
           html.tags([
-            relations.contentHeading.clone()
-              .slots({
-                attributes: {id: 'contributors'},
-                title: language.$('releaseInfo.contributors'),
-              }),
+            relations.contentHeading.clone().slots({
+              attributes: {id: 'contributors'},
+              title: language.$('releaseInfo.contributors'),
+            }),
 
             relations.contributorContributionList.slots({
               chronologyKind: 'trackContribution',
@@ -249,99 +251,52 @@ export default {
           ]),
 
           html.tags([
-            language.encapsulate('releaseInfo.tracksReferenced', capsule =>
-              relations.contentHeading.clone()
-                .slots({
-                  attributes: {id: 'references'},
-
-                  title:
-                    language.$(capsule, {
-                      track:
-                        html.tag('i', data.name),
-                    }),
-
-                  stickyTitle:
-                    language.$(capsule, 'sticky'),
-                })),
+            relations.relationsContentHeading.clone().slots({
+              attributes: {id: 'references'},
+              string: 'releaseInfo.tracksReferenced',
+            }),
 
             relations.referencedTracksList,
           ]),
 
           html.tags([
-            language.encapsulate('releaseInfo.tracksSampled', capsule =>
-              relations.contentHeading.clone()
-                .slots({
-                  attributes: {id: 'samples'},
-
-                  title:
-                    language.$(capsule, {
-                      track:
-                        html.tag('i', data.name),
-                    }),
-
-                  stickyTitle:
-                    language.$(capsule, 'sticky'),
-                })),
+            relations.relationsContentHeading.clone().slots({
+              attributes: {id: 'samples'},
+              string: 'releaseInfo.tracksSampled',
+            }),
 
             relations.sampledTracksList,
           ]),
 
           language.encapsulate('releaseInfo.tracksThatReference', capsule =>
             html.tags([
-              relations.contentHeading.clone()
-                .slots({
-                  attributes: {id: 'referenced-by'},
-
-                  title:
-                    language.$(capsule, {
-                      track: html.tag('i', data.name),
-                    }),
-
-                  stickyTitle:
-                    language.$(capsule, 'sticky'),
-                }),
-
-              relations.referencedByTracksList
-                .slots({
-                  headingString: capsule,
-                }),
+              relations.relationsContentHeading.clone().slots({
+                attributes: {id: 'referenced-by'},
+                string: capsule,
+              }),
+
+              relations.referencedByTracksList.slots({
+                headingString: capsule,
+              }),
             ])),
 
           language.encapsulate('releaseInfo.tracksThatSample', capsule =>
             html.tags([
-              relations.contentHeading.clone()
-                .slots({
-                  attributes: {id: 'sampled-by'},
-
-                  title:
-                    language.$(capsule, {
-                      track: html.tag('i', data.name),
-                    }),
-
-                  stickyTitle:
-                    language.$(capsule, 'sticky'),
-                }),
-
-              relations.sampledByTracksList
-                .slots({
-                  headingString: capsule,
-                }),
+              relations.relationsContentHeading.clone().slots({
+                attributes: {id: 'sampled-by'},
+                string: capsule,
+              }),
+
+              relations.sampledByTracksList.slots({
+                headingString: capsule,
+              }),
             ])),
 
           html.tags([
-            language.encapsulate('releaseInfo.flashesThatFeature', capsule =>
-              relations.contentHeading.clone()
-                .slots({
-                  attributes: {id: 'featured-in'},
-
-                  title:
-                    language.$(capsule, {
-                      track: html.tag('i', data.name),
-                    }),
-
-                  stickyTitle:
-                    language.$(capsule, 'sticky'),
-                })),
+            relations.relationsContentHeading.clone().slots({
+              attributes: {id: 'featured-in'},
+              string: 'releaseInfo.flashesThatFeature',
+            }),
 
             relations.flashesThatFeatureList,
           ]),
@@ -368,31 +323,28 @@ export default {
           relations.lyricsSection,
 
           html.tags([
-            relations.contentHeading.clone()
-              .slots({
-                attributes: {id: 'sheet-music-files'},
-                title: language.$('releaseInfo.sheetMusicFiles.heading'),
-              }),
+            relations.contentHeading.clone().slots({
+              attributes: {id: 'sheet-music-files'},
+              title: language.$('releaseInfo.sheetMusicFiles.heading'),
+            }),
 
             relations.sheetMusicFilesList,
           ]),
 
           html.tags([
-            relations.contentHeading.clone()
-              .slots({
-                attributes: {id: 'midi-project-files'},
-                title: language.$('releaseInfo.midiProjectFiles.heading'),
-              }),
+            relations.contentHeading.clone().slots({
+              attributes: {id: 'midi-project-files'},
+              title: language.$('releaseInfo.midiProjectFiles.heading'),
+            }),
 
             relations.midiProjectFilesList,
           ]),
 
           html.tags([
-            relations.contentHeading.clone()
-              .slots({
-                attributes: {id: 'additional-files'},
-                title: language.$('releaseInfo.additionalFiles.heading'),
-              }),
+            relations.contentHeading.clone().slots({
+              attributes: {id: 'additional-files'},
+              title: language.$('releaseInfo.additionalFiles.heading'),
+            }),
 
             relations.additionalFilesList,
           ]),
diff --git a/src/data/things/Track.js b/src/data/things/Track.js
index cb785211..87383b55 100644
--- a/src/data/things/Track.js
+++ b/src/data/things/Track.js
@@ -133,6 +133,17 @@ export class Track extends Thing {
     name: name(V('Unnamed Track')),
     nameText: contentString(),
 
+    nameStyle: [
+      exposeUpdateValueOrContinue({
+        validate: input.value(is(...[
+          'normal',
+          'utility',
+        ])),
+      }),
+
+      exposeConstant(V('normal')),
+    ],
+
     directory: directory({
       suffix: 'directorySuffix',
     }),
@@ -931,6 +942,9 @@ export class Track extends Thing {
 
       'Track': {property: 'name'},
       'Track Text': {property: 'nameText'},
+
+      'Name Style': {property: 'nameStyle'},
+
       'Directory': {property: 'directory'},
       'Suffix Directory': {property: 'suffixDirectoryFromAlbum'},
 
diff --git a/src/strings-default.yaml b/src/strings-default.yaml
index d4779387..da970b98 100644
--- a/src/strings-default.yaml
+++ b/src/strings-default.yaml
@@ -314,14 +314,17 @@ releaseInfo:
 
   tracksReferenced:
     _: "Tracks that {TRACK} references:"
+    withoutName: "Tracks that this one references:"
     sticky: "Tracks that this one references:"
 
   tracksSampled:
     _: "Tracks that {TRACK} samples:"
+    withoutName: "Tracks that this one samples:"
     sticky: "Tracks that this one samples:"
 
   tracksThatReference:
     _: "Tracks that reference {TRACK}:"
+    withoutName: "Tracks that reference this one:"
 
     sticky:
       _: "Tracks that reference this one:"
@@ -330,6 +333,7 @@ releaseInfo:
 
   tracksThatSample:
     _: "Tracks that sample {TRACK}:"
+    withoutName: "Tracks that sample this one:"
 
     sticky:
       _: "Tracks that sample this one:"
@@ -338,6 +342,7 @@ releaseInfo:
 
   flashesThatFeature:
     _: "Flashes that feature {TRACK}:"
+    withoutName: "Flashes taht feature this track:"
     sticky: "Flashes that feature this track:"
 
   referencesArtworks: "References {ARTWORKS}."
@@ -533,14 +538,17 @@ misc:
 
   artistCommentary:
     _: "Artist commentary for {THING}:"
+    withoutName: "Artist commentary:"
     sticky: "Artist commentary:"
 
     withWikiCommentary:
       _: "Artist and wiki commentary for {THING}:"
+      withoutName: "Artist and wiki commentary:"
       sticky: "Artist and wiki commentary:"
 
     onlyWikiCommentary:
       _: "Wiki commentary for {THING}:"
+      withoutName: "Wiki commentary:"
       sticky: "Wiki commentary:"
 
     entry:
@@ -652,7 +660,11 @@ misc:
 
   creditingSources:
     _: "{CUE} for {THING}:"
+    withoutName: "{CUE}:"
+
     collapsed: "{CUE} for {THING}…"
+    withoutName.collapsed: "{CUE}…"
+
     cue: "Crediting sources"
     sticky: "Crediting sources:"
 
@@ -919,7 +931,11 @@ misc:
 
   referencingSources:
     _: "{CUE} for {THING}:"
+    withoutName: "{CUE}:"
+
     collapsed: "{CUE} for {THING}…"
+    withoutName.collapsed: "{CUE}…"
+
     cue: "Referencing sources"
     sticky: "Referencing sources:"