From 11ec1991c60e1ba2d2b6d76074f3333491a35bec Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 4 Oct 2023 15:27:23 -0300 Subject: content: generateArtTagInfoPage (stub, mostly) --- src/content/dependencies/generateArtTagInfoPage.js | 143 +++++++++++++++++++++ src/page/art-tag.js | 12 +- src/strings-default.yaml | 17 ++- 3 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 src/content/dependencies/generateArtTagInfoPage.js (limited to 'src') diff --git a/src/content/dependencies/generateArtTagInfoPage.js b/src/content/dependencies/generateArtTagInfoPage.js new file mode 100644 index 00000000..3576351c --- /dev/null +++ b/src/content/dependencies/generateArtTagInfoPage.js @@ -0,0 +1,143 @@ +import {unique} from '#sugar'; + +export default { + contentDependencies: [ + 'generateArtTagNavLinks', + 'generateContentHeading', + 'generatePageLayout', + 'linkArtTag', + 'linkExternal', + 'transformContent', + ], + + extraDependencies: ['html', 'language', 'wikiData'], + + sprawl: ({wikiInfo}) => ({ + enableListings: wikiInfo.enableListings, + }), + + query(sprawl, artTag) { + const directThings = artTag.directlyTaggedInThings; + const indirectThings = artTag.indirectlyTaggedInThings; + const allThings = unique([...directThings, ...indirectThings]); + + return {directThings, indirectThings, allThings}; + }, + + relations: (relation, query, sprawl, artTag) => ({ + layout: + relation('generatePageLayout'), + + navLinks: + relation('generateArtTagNavLinks', artTag), + + contentHeading: + relation('generateContentHeading'), + + description: + relation('transformContent', artTag.description), + + extraReadingLinks: + artTag.extraReadingURLs + .map(url => relation('linkExternal', url)), + + directAncestorLinks: + artTag.directAncestorArtTags + .map(artTag => relation('linkArtTag', artTag)), + + directDescendantLinks: + artTag.directDescendantArtTags + .map(artTag => relation('linkArtTag', artTag)), + }), + + data: (query, sprawl, artTag) => ({ + enableListings: + sprawl.enableListings, + + name: + artTag.name, + + color: + artTag.color, + + numArtworks: + query.allThings.length, + + names: + query.allThings.map(thing => thing.name), + + paths: + query.allThings.map(thing => + (thing.album + ? ['media.trackCover', thing.album.directory, thing.directory, thing.coverArtFileExtension] + : ['media.albumCover', thing.directory, thing.coverArtFileExtension])), + + onlyFeaturedIndirectly: + query.allThings.map(thing => + !query.directThings.includes(thing)), + }), + + generate: (data, relations, {html, language}) => + language.encapsulate('artTagInfoPage', pageCapsule => + relations.layout.slots({ + title: + language.$(pageCapsule, 'title', { + tag: data.name, + }), + + headingMode: 'static', + color: data.color, + + mainContent: [ + html.tag('p', + {[html.onlyIfContent]: true}, + + language.$('releaseInfo.readMoreOn', { + [language.onlyIfOptions]: ['links'], + + links: language.formatDisjunctionList(relations.extraReadingLinks), + })), + + html.tag('blockquote', + {[html.onlyIfContent]: true}, + + relations.description + .slot('mode', 'multiline')), + + html.tags([ + relations.contentHeading.clone() + .slots({ + title: + language.$(pageCapsule, 'descendsFromTags', { + tag: language.sanitize(data.name), + }), + }), + + html.tag('ul', + {[html.onlyIfContent]: true}, + + relations.directAncestorLinks + .map(link => html.tag('li', link))), + ]), + + html.tags([ + relations.contentHeading.clone() + .slots({ + title: + language.$(pageCapsule, 'descendantTags', { + tag: language.sanitize(data.name), + }), + }), + + html.tag('ul', + {[html.onlyIfContent]: true}, + + relations.directDescendantLinks + .map(link => html.tag('li', link))), + ]), + ], + + navLinkStyle: 'hierarchical', + navLinks: relations.navLinks.content, + })), +}; diff --git a/src/page/art-tag.js b/src/page/art-tag.js index 32e869e1..5b61229d 100644 --- a/src/page/art-tag.js +++ b/src/page/art-tag.js @@ -1,6 +1,6 @@ // Art tag page specification. -export const description = `per-art-tag gallery pages`; +export const description = `per-art-tag info & gallery pages`; export function condition({wikiData}) { return wikiData.wikiInfo.enableArtTagUI; @@ -12,6 +12,16 @@ export function targets({wikiData}) { export function pathsForTarget(tag) { return [ + { + type: 'page', + path: ['artTagInfo', tag.directory], + + contentFunction: { + name: 'generateArtTagInfoPage', + args: [tag], + }, + }, + { type: 'page', path: ['artTagGallery', tag.directory], diff --git a/src/strings-default.yaml b/src/strings-default.yaml index 44877e6f..12f39dc6 100644 --- a/src/strings-default.yaml +++ b/src/strings-default.yaml @@ -347,6 +347,7 @@ releaseInfo: visitOn: "Visit on {LINKS}." playOn: "Play on {LINKS}." + readMoreOn: "Read more on {LINKS}." readCommentary: _: "Read {LINK}." @@ -1266,14 +1267,24 @@ artistGalleryPage: # # artTagPage: -# The art tag info page displays general information about a tag, -# including details about how it's networked with other tags in -# particular. +# Stuff that's common between art tag pages. # artTagPage: nav: tag: "Tag: {TAG}" +# +# artTagInfoPage: +# The art tag info page displays general information about a tag, +# including details about how it's networked with other tags in +# particular. +# +artTagInfoPage: + title: "{TAG}" + + descendantTags: "Tags that descend from {TAG}:" + descendsFromTags: "Tags that {TAG} descends from:" + # # artTagGalleryPage: # The tag gallery page displays all the artworks that a tag has -- cgit 1.3.0-6-gf8a5