« get me outta code hell

content: contextual external links - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content
diff options
context:
space:
mode:
author(quasar) nebula <qznebula@protonmail.com>2023-11-23 18:52:04 -0400
committer(quasar) nebula <qznebula@protonmail.com>2023-11-24 13:45:34 -0400
commit8c69ef2b14c4719fa0cd0c7daca27c613167b7ca (patch)
tree8742a45bb243c9e1fdc1a7a7504316f92f9315ce /src/content
parentcf08893d48db6f8082a176f54d0d92cb82716b3a (diff)
content: contextual external links
Diffstat (limited to 'src/content')
-rw-r--r--src/content/dependencies/generateAlbumReleaseInfo.js2
-rw-r--r--src/content/dependencies/generateAlbumSidebarGroupBox.js5
-rw-r--r--src/content/dependencies/generateArtistInfoPage.js5
-rw-r--r--src/content/dependencies/generateFlashInfoPage.js2
-rw-r--r--src/content/dependencies/generateGroupInfoPage.js5
-rw-r--r--src/content/dependencies/generateTrackReleaseInfo.js5
-rw-r--r--src/content/dependencies/linkContribution.js5
-rw-r--r--src/content/dependencies/linkExternal.js14
-rw-r--r--src/content/dependencies/linkExternalAsIcon.js21
-rw-r--r--src/content/dependencies/linkExternalFlash.js4
10 files changed, 52 insertions, 16 deletions
diff --git a/src/content/dependencies/generateAlbumReleaseInfo.js b/src/content/dependencies/generateAlbumReleaseInfo.js
index d6405283..4b819091 100644
--- a/src/content/dependencies/generateAlbumReleaseInfo.js
+++ b/src/content/dependencies/generateAlbumReleaseInfo.js
@@ -94,7 +94,7 @@ export default {
             links:
               language.formatDisjunctionList(
                 relations.externalLinks
-                  .map(link => link.slot('mode', 'album'))),
+                  .map(link => link.slot('context', 'album'))),
           })),
     ]);
   },
diff --git a/src/content/dependencies/generateAlbumSidebarGroupBox.js b/src/content/dependencies/generateAlbumSidebarGroupBox.js
index 331ddaba..f3705450 100644
--- a/src/content/dependencies/generateAlbumSidebarGroupBox.js
+++ b/src/content/dependencies/generateAlbumSidebarGroupBox.js
@@ -66,7 +66,10 @@ export default {
       !empty(relations.externalLinks) &&
         html.tag('p',
           language.$('releaseInfo.visitOn', {
-            links: language.formatDisjunctionList(relations.externalLinks),
+            links:
+              language.formatDisjunctionList(
+                relations.externalLinks
+                  .map(link => link.slot('context', 'group'))),
           })),
 
       slots.mode === 'album' &&
diff --git a/src/content/dependencies/generateArtistInfoPage.js b/src/content/dependencies/generateArtistInfoPage.js
index 03bc0af5..ac9209a7 100644
--- a/src/content/dependencies/generateArtistInfoPage.js
+++ b/src/content/dependencies/generateArtistInfoPage.js
@@ -161,7 +161,10 @@ export default {
           sec.visit &&
             html.tag('p',
               language.$('releaseInfo.visitOn', {
-                links: language.formatDisjunctionList(sec.visit.externalLinks),
+                links:
+                  language.formatDisjunctionList(
+                    sec.visit.externalLinks
+                      .map(link => link.slot('context', 'artist'))),
               })),
 
           sec.artworks?.artistGalleryLink &&
diff --git a/src/content/dependencies/generateFlashInfoPage.js b/src/content/dependencies/generateFlashInfoPage.js
index 09c6b37c..c60f9696 100644
--- a/src/content/dependencies/generateFlashInfoPage.js
+++ b/src/content/dependencies/generateFlashInfoPage.js
@@ -133,7 +133,7 @@ export default {
               links:
                 language.formatDisjunctionList(
                   relations.externalLinks
-                    .map(link => link.slot('mode', 'flash'))),
+                    .map(link => link.slot('context', 'flash'))),
             })),
 
         sec.featuredTracks && [
diff --git a/src/content/dependencies/generateGroupInfoPage.js b/src/content/dependencies/generateGroupInfoPage.js
index 0583755e..05df33fb 100644
--- a/src/content/dependencies/generateGroupInfoPage.js
+++ b/src/content/dependencies/generateGroupInfoPage.js
@@ -107,7 +107,10 @@ export default {
           sec.info.visitLinks &&
             html.tag('p',
               language.$('releaseInfo.visitOn', {
-                links: language.formatDisjunctionList(sec.info.visitLinks),
+                links:
+                  language.formatDisjunctionList(
+                    sec.info.visitLinks
+                      .map(link => link.slot('context', 'group'))),
               })),
 
           html.tag('blockquote',
diff --git a/src/content/dependencies/generateTrackReleaseInfo.js b/src/content/dependencies/generateTrackReleaseInfo.js
index 9a7478ca..c347dbce 100644
--- a/src/content/dependencies/generateTrackReleaseInfo.js
+++ b/src/content/dependencies/generateTrackReleaseInfo.js
@@ -77,7 +77,10 @@ export default {
       html.tag('p',
         (relations.externalLinks
           ? language.$('releaseInfo.listenOn', {
-              links: language.formatDisjunctionList(relations.externalLinks),
+              links:
+                language.formatDisjunctionList(
+                  relations.externalLinks
+                    .map(link => link.slot('context', 'track'))),
             })
           : language.$('releaseInfo.listenOn.noLinks', {
               name: html.tag('i', data.name),
diff --git a/src/content/dependencies/linkContribution.js b/src/content/dependencies/linkContribution.js
index ef61c766..790afa4f 100644
--- a/src/content/dependencies/linkContribution.js
+++ b/src/content/dependencies/linkContribution.js
@@ -58,7 +58,8 @@ export default {
           },
           language.formatUnitList(
             relations.artistIcons
-              .slice(0, 4)));
+              .slice(0, 4)
+              .map(icon => icon.slot('context', 'artist'))));
     }
 
     let content = language.formatString(parts.join('.'), options);
@@ -79,7 +80,7 @@ export default {
               class: 'icons-tooltip-content',
             },
             relations.artistIcons
-              .map(icon => icon.slot('withText', true)))),
+              .map(icon => icon.slots({context: 'artist', withText: true})))),
       ];
     }
 
diff --git a/src/content/dependencies/linkExternal.js b/src/content/dependencies/linkExternal.js
index 1b81efcc..e51ea89e 100644
--- a/src/content/dependencies/linkExternal.js
+++ b/src/content/dependencies/linkExternal.js
@@ -1,3 +1,5 @@
+import {isExternalLinkContext} from '#external-links';
+
 export default {
   extraDependencies: ['html', 'language', 'wikiData'],
 
@@ -16,8 +18,11 @@ export default {
   },
 
   slots: {
-    mode: {
-      validate: v => v.is('generic', 'album', 'flash'),
+    context: {
+      // This awkward syntax is because the slot descriptor validator can't
+      // differentiate between a function that returns a validator (the usual
+      // syntax) and a function that is itself a validator.
+      validate: () => isExternalLinkContext,
       default: 'generic',
     },
   },
@@ -26,7 +31,10 @@ export default {
     return (
       html.tag('a',
         {href: data.url, class: 'nowrap'},
-        language.formatExternalLink(data.url, {style: 'platform'})));
+        language.formatExternalLink(data.url, {
+          style: 'platform',
+          context: slots.context,
+        })));
   },
 
     /*
diff --git a/src/content/dependencies/linkExternalAsIcon.js b/src/content/dependencies/linkExternalAsIcon.js
index 58bd896d..357c835c 100644
--- a/src/content/dependencies/linkExternalAsIcon.js
+++ b/src/content/dependencies/linkExternalAsIcon.js
@@ -1,21 +1,32 @@
+import {isExternalLinkContext} from '#external-links';
+
 export default {
   extraDependencies: ['html', 'language', 'to'],
 
   data: (url) => ({url}),
 
   slots: {
+    context: {
+      // This awkward syntax is because the slot descriptor validator can't
+      // differentiate between a function that returns a validator (the usual
+      // syntax) and a function that is itself a validator.
+      validate: () => isExternalLinkContext,
+      default: 'generic',
+    },
+
     withText: {type: 'boolean'},
   },
 
   generate(data, slots, {html, language, to}) {
-    const {url} = data;
+    const format = style =>
+      language.formatExternalLink(data.url, {style, context: slots.context});
 
-    const normalText = language.formatExternalLink(url, {style: 'normal'});
-    const compactText = language.formatExternalLink(url, {style: 'compact'});
-    const iconId = language.formatExternalLink(url, {style: 'icon-id'});
+    const normalText = format('normal');
+    const compactText = format('compact');
+    const iconId = format('icon-id');
 
     return html.tag('a',
-      {href: url, class: ['icon', slots.withText && 'has-text']},
+      {href: data.url, class: ['icon', slots.withText && 'has-text']},
       [
         html.tag('svg', [
           !slots.withText &&
diff --git a/src/content/dependencies/linkExternalFlash.js b/src/content/dependencies/linkExternalFlash.js
index 65158ff8..e2147da1 100644
--- a/src/content/dependencies/linkExternalFlash.js
+++ b/src/content/dependencies/linkExternalFlash.js
@@ -1,6 +1,8 @@
 // Note: This function is seriously hard-coded for HSMusic, with custom
 // presentation of links to Homestuck flashes hosted various places.
 
+// This also appears to be dead code, apart from a single snapshot test??
+
 export default {
   contentDependencies: ['linkExternal'],
   extraDependencies: ['html', 'language'],
@@ -22,6 +24,8 @@ export default {
     const {link} = relations;
     const {url, page} = data;
 
+    link.setSlot('context', 'flash');
+
     return html.tag('span',
       {class: 'nowrap'},