« get me outta code hell

data: Contribution.annotationFront, is{Featuring,EditsForWiki}Credit - 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-01-26 17:49:33 -0400
committer(quasar) nebula <qznebula@protonmail.com>2026-01-26 17:49:33 -0400
commitdf244f21af6078f9456d8281da3a19e7c1e1a2f3 (patch)
treee54b9000c85266d3bfbfaa69526285c8d5ac71b1 /src
parent4f9adf7339e0c646ff732ee1b6d164f32e352103 (diff)
data: Contribution.annotationFront, is{Featuring,EditsForWiki}Credit
Diffstat (limited to 'src')
-rw-r--r--src/data/composite/things/contribution/hasAnnotationFront.js29
-rw-r--r--src/data/composite/things/contribution/index.js1
-rw-r--r--src/data/things/album/Album.js4
-rw-r--r--src/data/things/contrib/AlbumAssetArtworkArtistContribution.js20
-rw-r--r--src/data/things/contrib/AlbumBannerArtistContribution.js12
-rw-r--r--src/data/things/contrib/AlbumWallpaperArtistContribution.js12
-rw-r--r--src/data/things/contrib/ArtworkArtistContribution.js12
-rw-r--r--src/data/things/contrib/Contribution.js53
-rw-r--r--src/data/things/contrib/MusicalArtistContribution.js8
-rw-r--r--src/data/things/contrib/index.js6
10 files changed, 148 insertions, 9 deletions
diff --git a/src/data/composite/things/contribution/hasAnnotationFront.js b/src/data/composite/things/contribution/hasAnnotationFront.js
new file mode 100644
index 00000000..6969268b
--- /dev/null
+++ b/src/data/composite/things/contribution/hasAnnotationFront.js
@@ -0,0 +1,29 @@
+import {input, templateCompositeFrom} from '#composite';
+
+import {exitWithoutDependency} from '#composite/control-flow';
+
+export default templateCompositeFrom({
+  annotation: `hasAnnotationFront`,
+
+  inputs: {
+    front: input({type: 'string'}),
+  },
+
+  compose: false,
+
+  steps: () => [
+    exitWithoutDependency({
+      dependency: 'annotationFront',
+      value: input.value(false),
+    }),
+
+    {
+      dependencies: ['annotationFront', input('front')],
+      compute: ({
+        ['annotationFront']: present,
+        [input('front')]: expected,
+      }) =>
+        present === expected,
+    },
+  ],
+});
diff --git a/src/data/composite/things/contribution/index.js b/src/data/composite/things/contribution/index.js
index 2bbf994d..b03ebfd2 100644
--- a/src/data/composite/things/contribution/index.js
+++ b/src/data/composite/things/contribution/index.js
@@ -1,3 +1,4 @@
+export {default as hasAnnotationFront} from './hasAnnotationFront.js';
 export {default as inheritFromContributionPresets} from './inheritFromContributionPresets.js';
 export {default as withContainingReverseContributionList} from './withContainingReverseContributionList.js';
 export {default as withContributionContext} from './withContributionContext.js';
diff --git a/src/data/things/album/Album.js b/src/data/things/album/Album.js
index ebec5444..48d52223 100644
--- a/src/data/things/album/Album.js
+++ b/src/data/things/album/Album.js
@@ -69,6 +69,8 @@ export class Album extends Thing {
     AdditionalFile,
     AdditionalName,
     AlbumArtistContribution,
+    AlbumBannerArtistContribution,
+    AlbumWallpaperArtistContribution,
     ArtTag,
     Artwork,
     CommentaryEntry,
@@ -266,6 +268,7 @@ export class Album extends Thing {
     ],
 
     wallpaperArtistContribs: contributionList({
+      class: input.value(AlbumWallpaperArtistContribution),
       date: 'coverArtDate',
       artistProperty: input.value('albumWallpaperArtistContributions'),
     }),
@@ -308,6 +311,7 @@ export class Album extends Thing {
     ],
 
     bannerArtistContribs: contributionList({
+      class: input.value(AlbumBannerArtistContribution),
       date: 'coverArtDate',
       artistProperty: input.value('albumBannerArtistContributions'),
     }),
diff --git a/src/data/things/contrib/AlbumAssetArtworkArtistContribution.js b/src/data/things/contrib/AlbumAssetArtworkArtistContribution.js
new file mode 100644
index 00000000..a178ca13
--- /dev/null
+++ b/src/data/things/contrib/AlbumAssetArtworkArtistContribution.js
@@ -0,0 +1,20 @@
+import {V} from '#composite';
+import Thing from '#thing';
+
+import {exposeConstant} from '#composite/control-flow';
+
+import {hasAnnotationFront} from '#composite/things/contribution';
+
+import {ArtworkArtistContribution} from './ArtworkArtistContribution.js';
+
+export class AlbumAssetArtworkArtistContribution extends ArtworkArtistContribution {
+  static [Thing.getPropertyDescriptors] = () => ({
+    isAlbumAssetArtworkArtistContribution: exposeConstant(V(true)),
+
+    recognizedAnnotationFronts:
+      exposeConstant(V(['edits for wiki'])),
+
+    isEditsForWikiCredit:
+      hasAnnotationFront(V('edits for wiki')),
+  });
+}
diff --git a/src/data/things/contrib/AlbumBannerArtistContribution.js b/src/data/things/contrib/AlbumBannerArtistContribution.js
new file mode 100644
index 00000000..16f1c9bb
--- /dev/null
+++ b/src/data/things/contrib/AlbumBannerArtistContribution.js
@@ -0,0 +1,12 @@
+import {V} from '#composite';
+import Thing from '#thing';
+
+import {exposeConstant} from '#composite/control-flow';
+
+import {AlbumAssetArtworkArtistContribution} from './AlbumAssetArtworkArtistContribution.js';
+
+export class AlbumBannerArtistContribution extends AlbumAssetArtworkArtistContribution {
+  static [Thing.getPropertyDescriptors] = () => ({
+    isAlbumBannerArtistContribution: exposeConstant(V(true)),
+  });
+}
diff --git a/src/data/things/contrib/AlbumWallpaperArtistContribution.js b/src/data/things/contrib/AlbumWallpaperArtistContribution.js
new file mode 100644
index 00000000..acd29cf8
--- /dev/null
+++ b/src/data/things/contrib/AlbumWallpaperArtistContribution.js
@@ -0,0 +1,12 @@
+import {V} from '#composite';
+import Thing from '#thing';
+
+import {exposeConstant} from '#composite/control-flow';
+
+import {AlbumAssetArtworkArtistContribution} from './AlbumAssetArtworkArtistContribution.js';
+
+export class AlbumWallpaperArtistContribution extends AlbumAssetArtworkArtistContribution {
+  static [Thing.getPropertyDescriptors] = () => ({
+    isAlbumWallpaperArtistContribution: exposeConstant(V(true)),
+  });
+}
diff --git a/src/data/things/contrib/ArtworkArtistContribution.js b/src/data/things/contrib/ArtworkArtistContribution.js
new file mode 100644
index 00000000..5b1b68d8
--- /dev/null
+++ b/src/data/things/contrib/ArtworkArtistContribution.js
@@ -0,0 +1,12 @@
+import {V} from '#composite';
+import Thing from '#thing';
+
+import {exposeConstant} from '#composite/control-flow';
+
+import {Contribution} from './Contribution.js';
+
+export class ArtworkArtistContribution extends Contribution {
+  static [Thing.getPropertyDescriptors] = () => ({
+    isArtworkArtistContribution: exposeConstant(V(true)),
+  });
+}
diff --git a/src/data/things/contrib/Contribution.js b/src/data/things/contrib/Contribution.js
index 4048709b..57a5c301 100644
--- a/src/data/things/contrib/Contribution.js
+++ b/src/data/things/contrib/Contribution.js
@@ -121,16 +121,51 @@ export class Contribution extends Thing {
 
     isContribution: exposeConstant(V(true)),
 
-    annotationParts: {
-      flags: {expose: true},
-      expose: {
-        dependencies: ['annotation'],
-        compute: ({annotation}) =>
-          (annotation
-            ? annotation.split(',').map(part => part.trim())
-            : []),
+    recognizedAnnotationFronts: exposeConstant(V([])),
+
+    annotationFront: [
+      exitWithoutDependency('annotation'),
+
+      {
+        dependencies: ['recognizedAnnotationFronts', 'annotation'],
+        compute: ({recognizedAnnotationFronts, annotation}) =>
+          recognizedAnnotationFronts
+            .find(front =>
+              annotation.startsWith(front) && (
+                annotation === front ||
+                annotation.at(front.length) === ':' ||
+                annotation.at(front.length) === ','
+              )) ?? null,
       },
-    },
+    ],
+
+    annotationBack: [
+      exitWithoutDependency('annotation'),
+
+      exitWithoutDependency({
+        dependency: 'annotationFront',
+        value: 'annotation',
+      }),
+
+      {
+        dependencies: ['annotation', 'annotationFront'],
+        compute: ({annotation, annotationFront}) =>
+          annotation.slice(annotationFront.length + 1).trim()
+            || null,
+      },
+    ],
+
+    annotationParts: [
+      exitWithoutDependency('annotationBack', V([])),
+
+      {
+        dependencies: ['annotationBack'],
+        compute: ({annotationBack}) =>
+          annotationBack
+            .split(',')
+            .map(part => part.trim()),
+      },
+    ],
 
     context: [
       withContributionContext(),
diff --git a/src/data/things/contrib/MusicalArtistContribution.js b/src/data/things/contrib/MusicalArtistContribution.js
index b4f8d370..df26850b 100644
--- a/src/data/things/contrib/MusicalArtistContribution.js
+++ b/src/data/things/contrib/MusicalArtistContribution.js
@@ -3,10 +3,18 @@ import Thing from '#thing';
 
 import {exposeConstant} from '#composite/control-flow';
 
+import {hasAnnotationFront} from '#composite/things/contribution';
+
 import {Contribution} from './Contribution.js';
 
 export class MusicalArtistContribution extends Contribution {
   static [Thing.getPropertyDescriptors] = () => ({
     isMusicalArtistContribution: exposeConstant(V(true)),
+
+    recognizedAnnotationFronts:
+      exposeConstant(V(['featuring'])),
+
+    isFeaturingCredit:
+      hasAnnotationFront(V('featuring')),
   });
 }
diff --git a/src/data/things/contrib/index.js b/src/data/things/contrib/index.js
index a0629bdf..187ddb2c 100644
--- a/src/data/things/contrib/index.js
+++ b/src/data/things/contrib/index.js
@@ -3,3 +3,9 @@ export * from './Contribution.js';
 export * from './MusicalArtistContribution.js';
 export * from './AlbumArtistContribution.js';
 export * from './TrackArtistContribution.js';
+
+export * from './ArtworkArtistContribution.js';
+
+export * from './AlbumAssetArtworkArtistContribution.js';
+export * from './AlbumBannerArtistContribution.js';
+export * from './AlbumWallpaperArtistContribution.js';