« 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/data/things/contrib
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/data/things/contrib
parent4f9adf7339e0c646ff732ee1b6d164f32e352103 (diff)
data: Contribution.annotationFront, is{Featuring,EditsForWiki}Credit
Diffstat (limited to 'src/data/things/contrib')
-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
7 files changed, 114 insertions, 9 deletions
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';