diff options
-rw-r--r-- | src/content/dependencies/generateArtistCredit.js | 39 | ||||
-rw-r--r-- | src/content/dependencies/linkContribution.js | 6 | ||||
-rw-r--r-- | src/content/dependencies/transformContent.js | 17 |
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) { |