« get me outta code hell

content: transformContent: substitute apply() - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2025-09-08 19:27:06 -0300
committer(quasar) nebula <qznebula@protonmail.com>2025-09-08 19:27:06 -0300
commit435af33e7e33ff664f6b01d2e02486de1346f20a (patch)
tree44ad74caf231c670c27e1e432bf069aa6f9e0cf9
parent27b4de9be0f23e25bdb6eb81e3e48c50cb0d4163 (diff)
content: transformContent: substitute apply()
-rw-r--r--src/content/dependencies/generateArtistCredit.js39
-rw-r--r--src/content/dependencies/linkContribution.js6
-rw-r--r--src/content/dependencies/transformContent.js17
3 files changed, 52 insertions, 10 deletions
diff --git a/src/content/dependencies/generateArtistCredit.js b/src/content/dependencies/generateArtistCredit.js
index 1d6b5dd8..ebc57187 100644
--- a/src/content/dependencies/generateArtistCredit.js
+++ b/src/content/dependencies/generateArtistCredit.js
@@ -1,4 +1,4 @@
-import {compareArrays, empty} from '#sugar';
+import {compareArrays, empty, stitchArrays} from '#sugar';
 
 export default {
   contentDependencies: [
@@ -80,6 +80,14 @@ export default {
     normalContributionAnnotationsDifferFromContext:
       query.normalContributionAnnotationsDifferFromContext,
 
+    normalContributionArtistDirectories:
+      query.normalContributions
+        .map(contrib => contrib.artist.directory),
+
+    featuringContributionArtistDirectories:
+      query.featuringContributions
+        .map(contrib => contrib.artist.directory),
+
     hasWikiEdits:
       !empty(query.wikiEditContributions),
   }),
@@ -144,18 +152,31 @@ export default {
     if (!html.isBlank(relations.formatText)) {
       formattedArtistList = relations.formatText;
 
+      const substituteContrib = ({link, directory}) => ({
+        match: {replacerKey: 'artist', replacerValue: directory},
+        substitute: link,
+
+        apply(link, node) {
+          if (node.data.label) {
+            link.setSlot('content', language.sanitize(node.data.label));
+          }
+        },
+      });
+
       relations.formatText.setSlots({
         mode: 'inline',
 
         substitute: [
-          {
-            match: {
-              replacerKey: 'artist',
-              replacerValue: 'screamcatcher',
-            },
-            substitute: 'YAYAS!',
-          },
-        ],
+          stitchArrays({
+            link: relations.normalContributionLinks,
+            directory: data.normalContributionArtistDirectories,
+          }).map(substituteContrib),
+
+          stitchArrays({
+            link: relations.featuringContributionLinks,
+            directory: data.featuringContributionArtistDirectories,
+          }).map(substituteContrib),
+        ].flat(),
       });
     }
 
diff --git a/src/content/dependencies/linkContribution.js b/src/content/dependencies/linkContribution.js
index 1db0373b..4ccaf7b4 100644
--- a/src/content/dependencies/linkContribution.js
+++ b/src/content/dependencies/linkContribution.js
@@ -24,6 +24,8 @@ export default {
   }),
 
   slots: {
+    content: {type: 'html', mutable: false},
+
     showAnnotation: {type: 'boolean', default: false},
     showExternalLinks: {type: 'boolean', default: false},
     showChronology: {type: 'boolean', default: false},
@@ -46,6 +48,10 @@ export default {
       language.encapsulate('misc.artistLink', workingCapsule => {
         const workingOptions = {};
 
+        if (!html.isBlank(slots.content)) {
+          relations.artistLink.setSlot('content', slots.content);
+        }
+
         // Filling slots early is necessary to actually give the tooltip
         // content. Otherwise, the coming-up html.isBlank() always reports
         // the tooltip as blank!
diff --git a/src/content/dependencies/transformContent.js b/src/content/dependencies/transformContent.js
index 83c85d05..4646a6eb 100644
--- a/src/content/dependencies/transformContent.js
+++ b/src/content/dependencies/transformContent.js
@@ -307,6 +307,8 @@ export default {
             }),
 
             substitute: v.isHTML,
+
+            apply: v.optional(v.isFunction),
           })),
     },
   },
@@ -363,7 +365,20 @@ export default {
         const substitution = pickSubstitution(node);
 
         if (substitution) {
-          return {type: 'substitution', data: substitution.substitute};
+          const source =
+            substitution.substitute;
+
+          let substitute = source;
+
+          if (substitution.apply) {
+            const result = substitution.apply(source, node);
+
+            if (result !== undefined) {
+              substitute = result;
+            }
+          }
+
+          return {type: 'substitution', data: substitute};
         }
 
         switch (node.type) {