From f198626619b9dba45156632d1d81eced1192bd38 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 11 Sep 2024 17:11:41 -0300 Subject: [PATCH 1/7] content: generateAlbumSocialEmbedDescription: code cleanup Also fixes #555 by scrapping hasAny altogether. --- .../generateAlbumSocialEmbedDescription.js | 77 +++++++++---------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/src/content/dependencies/generateAlbumSocialEmbedDescription.js b/src/content/dependencies/generateAlbumSocialEmbedDescription.js index 7099616a7..69c39c3a7 100644 --- a/src/content/dependencies/generateAlbumSocialEmbedDescription.js +++ b/src/content/dependencies/generateAlbumSocialEmbedDescription.js @@ -3,46 +3,39 @@ import {accumulateSum} from '#sugar'; export default { extraDependencies: ['language'], - data(album) { - const data = {}; - - const duration = accumulateSum(album.tracks, track => track.duration); - - data.hasDuration = duration > 0; - data.hasTracks = album.tracks.length > 0; - data.hasDate = !!album.date; - data.hasAny = (data.hasDuration || data.hasTracks || data.hasDuration); - - if (!data.hasAny) - return data; - - if (data.hasDuration) - data.duration = duration; - - if (data.hasTracks) - data.tracks = album.tracks.length; - - if (data.hasDate) - data.date = album.date; - - return data; - }, - - generate(data, {language}) { - return language.formatString( - 'albumPage.socialEmbed.body' + [ - data.hasDuration && '.withDuration', - data.hasTracks && '.withTracks', - data.hasDate && '.withReleaseDate', - ].filter(Boolean).join(''), - - Object.fromEntries([ - data.hasDuration && - ['duration', language.formatDuration(data.duration)], - data.hasTracks && - ['tracks', language.countTracks(data.tracks, {unit: true})], - data.hasDate && - ['date', language.formatDate(data.date)], - ].filter(Boolean))); - }, + data: (album) => ({ + duration: + accumulateSum(album.tracks, track => track.duration), + + tracks: + album.tracks.length, + + date: + album.date, + }), + + generate: (data, {language}) => + language.encapsulate('albumPage.socialEmbed.body', workingCapsule => { + const workingOptions = {}; + + if (data.duration > 0) { + workingCapsule += '.withDuration'; + workingOptions.duration = + language.formatDuration(data.duration); + } + + if (data.tracks > 0) { + workingCapsule += '.withTracks'; + workingOptions.tracks = + language.countTracks(data.tracks, {unit: true}); + } + + if (data.date) { + workingCapsule += '.withReleaseDate'; + workingOptions.date = + language.formatDate(data.date); + } + + return language.$(workingCapsule, workingOptions); + }), }; From 2da0d55d67c099defa7058dcb558f6ea7e0d2651 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 11 Sep 2024 17:30:55 -0300 Subject: [PATCH 2/7] content: generateTrackSocialEmbedDescription: implement this Geez --- .../dependencies/generateTrackSocialEmbed.js | 18 +---- .../generateTrackSocialEmbedDescription.js | 73 ++++++++++--------- 2 files changed, 40 insertions(+), 51 deletions(-) diff --git a/src/content/dependencies/generateTrackSocialEmbed.js b/src/content/dependencies/generateTrackSocialEmbed.js index 9868f0e22..d8e21e385 100644 --- a/src/content/dependencies/generateTrackSocialEmbed.js +++ b/src/content/dependencies/generateTrackSocialEmbed.js @@ -47,6 +47,9 @@ export default { track: data.trackName, }), + description: + relations.description, + headingContent: language.$(embedCapsule, 'heading', { album: data.albumName, @@ -69,18 +72,3 @@ export default { : null), })), }; - -/* - socialEmbed: { - heading: language.$('trackPage.socialEmbed.heading', { - album: track.album.name, - }), - headingLink: absoluteTo('localized.album', album.directory), - title: language.$('trackPage.socialEmbed.title', { - track: track.name, - }), - description: getSocialEmbedDescription({getArtistString, language}), - image: '/' + getTrackCover(track, {to: urls.from('shared.root').to}), - color: track.color, - }, -*/ diff --git a/src/content/dependencies/generateTrackSocialEmbedDescription.js b/src/content/dependencies/generateTrackSocialEmbedDescription.js index cf21eadf4..4706aa260 100644 --- a/src/content/dependencies/generateTrackSocialEmbedDescription.js +++ b/src/content/dependencies/generateTrackSocialEmbedDescription.js @@ -1,38 +1,39 @@ +import {empty} from '#sugar'; + export default { - generate() { - }, -}; + extraDependencies: ['html', 'language'], + + data: (track) => ({ + artistNames: + track.artistContribs + .map(contrib => contrib.artist.name), + + coverArtistNames: + track.coverArtistContribs + .map(contrib => contrib.artist.name), + }), -/* - const getSocialEmbedDescription = ({ - getArtistString: _getArtistString, - language, - }) => { - const hasArtists = !empty(track.artistContribs); - const hasCoverArtists = !empty(track.coverArtistContribs); - const getArtistString = (contribs) => - _getArtistString(contribs, { - // We don't want to put actual HTML tags in social embeds (sadly - // they don't get parsed and displayed, generally speaking), so - // override the link argument so that artist "links" just show - // their names. - link: {artist: (artist) => artist.name}, - }); - if (!hasArtists && !hasCoverArtists) return ''; - return language.formatString( - 'trackPage.socialEmbed.body' + - [hasArtists && '.withArtists', hasCoverArtists && '.withCoverArtists'] - .filter(Boolean) - .join(''), - Object.fromEntries( - [ - hasArtists && ['artists', getArtistString(track.artistContribs)], - hasCoverArtists && [ - 'coverArtists', - getArtistString(track.coverArtistContribs), - ], - ].filter(Boolean) - ) - ); - }; -*/ + generate: (data, {html, language}) => + language.encapsulate('trackPage.socialEmbed.body', baseCapsule => + language.encapsulate(baseCapsule, workingCapsule => { + const workingOptions = {}; + + if (!empty(data.artistNames)) { + workingCapsule += '.withArtists'; + workingOptions.artists = + language.formatConjunctionList(data.artistNames); + } + + if (!empty(data.coverArtistNames)) { + workingCapsule += '.withCoverArtists'; + workingOptions.coverArtists = + language.formatConjunctionList(data.coverArtistNames); + } + + if (workingCapsule === baseCapsule) { + return html.blank(); + } else { + return language.$(workingCapsule, workingOptions); + } + })), +}; From a28798293daaec40df392fe8f246e98a066f94a4 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 11 Sep 2024 20:11:57 -0300 Subject: [PATCH 3/7] write: pagePathStringFromRoot --- src/write/bind-utilities.js | 2 ++ src/write/build-modes/live-dev-server.js | 1 + src/write/build-modes/static-build.js | 1 + 3 files changed, 4 insertions(+) diff --git a/src/write/bind-utilities.js b/src/write/bind-utilities.js index 8dd08dba3..be702c8cc 100644 --- a/src/write/bind-utilities.js +++ b/src/write/bind-utilities.js @@ -26,6 +26,7 @@ export function bindUtilities({ languages, missingImagePaths, pagePath, + pagePathStringFromRoot, thumbsCache, to, urls, @@ -44,6 +45,7 @@ export function bindUtilities({ languages, missingImagePaths, pagePath, + pagePathStringFromRoot, thumb, to, urls, diff --git a/src/write/build-modes/live-dev-server.js b/src/write/build-modes/live-dev-server.js index b018bc1c5..389f5f4cc 100644 --- a/src/write/build-modes/live-dev-server.js +++ b/src/write/build-modes/live-dev-server.js @@ -405,6 +405,7 @@ export async function go({ languages, missingImagePaths, pagePath: servePath, + pagePathStringFromRoot: pathname.replace(/^\//, ''), thumbsCache, to, urls, diff --git a/src/write/build-modes/static-build.js b/src/write/build-modes/static-build.js index 86e3da0f2..c50db6b8e 100644 --- a/src/write/build-modes/static-build.js +++ b/src/write/build-modes/static-build.js @@ -324,6 +324,7 @@ export async function go({ languages, missingImagePaths, pagePath, + pagePathStringFromRoot: pathname, thumbsCache, to, urls, From dd841e85e0f2cbd6b4a57fb9741111ed7c88df9f Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 11 Sep 2024 20:24:23 -0300 Subject: [PATCH 4/7] data: WikiInfo: make canonicalBase always end with slash --- src/data/things/wiki-info.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data/things/wiki-info.js b/src/data/things/wiki-info.js index b7b7b01c6..57446f3f0 100644 --- a/src/data/things/wiki-info.js +++ b/src/data/things/wiki-info.js @@ -59,6 +59,12 @@ export class WikiInfo extends Thing { canonicalBase: { flags: {update: true, expose: true}, update: {validate: isURL}, + expose: { + transform: (value) => + (value.endsWith('/') + ? value + : value + '/'), + }, }, divideTrackListsByGroups: referenceList({ From 899d837193c169e59dfb8503a00493bdbc4d460e Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 11 Sep 2024 20:24:52 -0300 Subject: [PATCH 5/7] content: generatePageLayout: fix missing json+oembed link --- .../dependencies/generatePageLayout.js | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/content/dependencies/generatePageLayout.js b/src/content/dependencies/generatePageLayout.js index 4e4df5ecf..67a44b2b8 100644 --- a/src/content/dependencies/generatePageLayout.js +++ b/src/content/dependencies/generatePageLayout.js @@ -16,25 +16,24 @@ export default { 'html', 'language', 'pagePath', + 'pagePathStringFromRoot', 'to', 'wikiData', ], - sprawl({wikiInfo}) { - return { - enableSearch: wikiInfo.enableSearch, - footerContent: wikiInfo.footerContent, - wikiColor: wikiInfo.color, - wikiName: wikiInfo.nameShort, - }; - }, + sprawl: ({wikiInfo}) => ({ + enableSearch: wikiInfo.enableSearch, + footerContent: wikiInfo.footerContent, + wikiColor: wikiInfo.color, + wikiName: wikiInfo.nameShort, + canonicalBase: wikiInfo.canonicalBase, + }), - data({wikiColor, wikiName}) { - return { - wikiColor, - wikiName, - }; - }, + data: (sprawl) => ({ + wikiColor: sprawl.wikiColor, + wikiName: sprawl.wikiName, + canonicalBase: sprawl.canonicalBase, + }), relations(relation, sprawl) { const relations = {}; @@ -228,6 +227,7 @@ export default { html, language, pagePath, + pagePathStringFromRoot, to, }) { const colors = getColors(slots.color ?? data.wikiColor); @@ -241,6 +241,13 @@ export default { const mainContentHTML = html.tags([slots.mainContent]).toString(); const hasID = id => mainContentHTML.includes(`id="${id}"`); + const oEmbedJSONHref = + (hasSocialEmbed && data.canonicalBase + ? data.canonicalBase + + pagePathStringFromRoot + + 'oembed.json' + : null); + const titleContentsHTML = (html.isBlank(slots.title) ? null @@ -649,6 +656,12 @@ export default { .clone() .slot('mode', 'html'), + oEmbedJSONHref && + html.tag('link', { + type: 'application/json+oembed', + href: oEmbedJSONHref, + }), + html.tag('link', { rel: 'stylesheet', href: to('staticCSS.path', 'site.css'), From 43fd39b3be4c6f446f78711bf51142e27a3ee9e6 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 11 Sep 2024 20:36:03 -0300 Subject: [PATCH 6/7] content: generateSocialEmbed: resolve to string in json mode --- src/content/dependencies/generateSocialEmbed.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/content/dependencies/generateSocialEmbed.js b/src/content/dependencies/generateSocialEmbed.js index 0144c7fbc..85a0f4d39 100644 --- a/src/content/dependencies/generateSocialEmbed.js +++ b/src/content/dependencies/generateSocialEmbed.js @@ -47,10 +47,12 @@ export default { return JSON.stringify({ author_name: (slots.headingContent - ? language.$('misc.socialEmbed.heading', { - wikiName: data.shortWikiName, - heading: slots.headingContent, - }) + ? html.resolve( + language.$('misc.socialEmbed.heading', { + wikiName: data.shortWikiName, + heading: slots.headingContent, + }), + {normalize: 'string'}) : undefined), author_url: From f9fca95359e00496a424edd39829d6f7f4ca6188 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 11 Sep 2024 20:36:30 -0300 Subject: [PATCH 7/7] content: generateAlbumSocialEmbed: use group name, not directory How does this even happen --- src/content/dependencies/generateAlbumSocialEmbed.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/dependencies/generateAlbumSocialEmbed.js b/src/content/dependencies/generateAlbumSocialEmbed.js index 7500109e9..54574e45e 100644 --- a/src/content/dependencies/generateAlbumSocialEmbed.js +++ b/src/content/dependencies/generateAlbumSocialEmbed.js @@ -25,7 +25,7 @@ export default { if (data.hasHeading) { const firstGroup = album.groups[0]; - data.headingGroupName = firstGroup.directory; + data.headingGroupName = firstGroup.name; data.headingGroupDirectory = firstGroup.directory; }