diff options
Diffstat (limited to 'src/content')
-rw-r--r-- | src/content/dependencies/generateContributionLinks.js | 23 | ||||
-rw-r--r-- | src/content/dependencies/generateIconForURL.js | 51 |
2 files changed, 63 insertions, 11 deletions
diff --git a/src/content/dependencies/generateContributionLinks.js b/src/content/dependencies/generateContributionLinks.js index a79c8234..18bc409d 100644 --- a/src/content/dependencies/generateContributionLinks.js +++ b/src/content/dependencies/generateContributionLinks.js @@ -3,37 +3,40 @@ import {empty} from '../../util/sugar.js'; export default { contentDependencies: [ 'linkArtist', + 'generateIconForURL', ], extraDependencies: [ 'html', - 'iconifyURL', 'language', ], - relations(relation, contributions) { + relations(relation, contributions, {showIcons = false} = {}) { const relations = {}; relations.artistLinks = contributions.map(({who}) => relation('linkArtist', who)); + if (showIcons) { + relations.artistIcons = + contributions.map(({who}) => + who.urls.map(url => + relation('generateIconForURL', url))); + } + return relations; }, data(contributions, { showContribution = false, showIcons = false, - }) { + } = {}) { const data = {}; - data.showContribution = showContribution; - data.showIcons = showIcons; - data.contributionData = contributions.map(({who, what}) => ({ hasContributionPart: !!(showContribution && what), hasExternalPart: !!(showIcons && !empty(who.urls)), - artistUrls: who.urls, contribution: showContribution && what, })); @@ -42,23 +45,21 @@ export default { generate(data, relations, { html, - iconifyURL, language, }) { return language.formatConjunctionList( data.contributionData.map(({ hasContributionPart, hasExternalPart, - artistUrls, contribution, }, index) => { const artistLink = relations.artistLinks[index]; + const artistIcons = relations.artistIcons?.[index]; const externalLinks = hasExternalPart && html.tag('span', {[html.noEdgeWhitespace]: true, class: 'icons'}, - language.formatUnitList( - artistUrls.map(url => iconifyURL(url, {language})))); + language.formatUnitList(artistIcons)); return ( (hasContributionPart diff --git a/src/content/dependencies/generateIconForURL.js b/src/content/dependencies/generateIconForURL.js new file mode 100644 index 00000000..4473ccbf --- /dev/null +++ b/src/content/dependencies/generateIconForURL.js @@ -0,0 +1,51 @@ +const BANDCAMP_DOMAINS = [ + 'bc.s3m.us', + 'music.solatrux.com', +]; + +const MASTODON_DOMAINS = [ + 'types.pl', +]; + +export default { + extraDependencies: ['html', 'language', 'to'], + + data(url) { + return {url}; + }, + + generate(data, {html, language, to}) { + const domain = new URL(data.url).hostname; + const [id, msg] = ( + domain.includes('bandcamp.com') + ? ['bandcamp', language.$('misc.external.bandcamp')] + : BANDCAMP_DOMAINS.includes(domain) + ? ['bandcamp', language.$('misc.external.bandcamp.domain', {domain})] + : MASTODON_DOMAINS.includes(domain) + ? ['mastodon', language.$('misc.external.mastodon.domain', {domain})] + : domain.includes('youtu') + ? ['youtube', language.$('misc.external.youtube')] + : domain.includes('soundcloud') + ? ['soundcloud', language.$('misc.external.soundcloud')] + : domain.includes('tumblr.com') + ? ['tumblr', language.$('misc.external.tumblr')] + : domain.includes('twitter.com') + ? ['twitter', language.$('misc.external.twitter')] + : domain.includes('deviantart.com') + ? ['deviantart', language.$('misc.external.deviantart')] + : domain.includes('instagram.com') + ? ['instagram', language.$('misc.external.bandcamp')] + : domain.includes('newgrounds.com') + ? ['newgrounds', language.$('misc.external.newgrounds')] + : ['globe', language.$('misc.external.domain', {domain})]); + + return html.tag('a', + {href: data.url, class: 'icon'}, + html.tag('svg', [ + html.tag('title', msg), + html.tag('use', { + href: to('shared.staticFile', `icons.svg#icon-${id}`), + }), + ])); + }, +}; |