diff options
Diffstat (limited to 'src/content/dependencies/generateArtTagInfoPage.js')
-rw-r--r-- | src/content/dependencies/generateArtTagInfoPage.js | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/src/content/dependencies/generateArtTagInfoPage.js b/src/content/dependencies/generateArtTagInfoPage.js new file mode 100644 index 00000000..056d9749 --- /dev/null +++ b/src/content/dependencies/generateArtTagInfoPage.js @@ -0,0 +1,224 @@ +import {empty, stitchArrays, unique} from '#sugar'; + +export default { + contentDependencies: [ + 'generateArtTagNavLinks', + 'generateArtTagSidebar', + 'generateContentHeading', + 'generatePageLayout', + 'linkArtTagGallery', + 'linkArtTagInfo', + 'linkExternal', + 'transformContent', + ], + + extraDependencies: ['html', 'language', 'wikiData'], + + sprawl({wikiInfo}) { + return { + 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) { + const relations = {}; + const sec = relations.sections = {}; + + relations.layout = + relation('generatePageLayout'); + + relations.navLinks = + relation('generateArtTagNavLinks', artTag); + + relations.sidebar = + relation('generateArtTagSidebar', artTag); + + const info = sec.info = {}; + + if (artTag.description) { + info.description = + relation('transformContent', artTag.description); + } + + if (!empty(query.allThings)) { + info.galleryLink = + relation('linkArtTagGallery', artTag); + } + + if (!empty(artTag.extraReadingURLs)) { + info.extraReadingLinks = + artTag.extraReadingURLs + .map(url => relation('linkExternal', url)); + } + + if (!empty(artTag.directAncestorArtTags)) { + const ancestors = sec.ancestors = {}; + + ancestors.heading = + relation('generateContentHeading'); + + ancestors.directAncestorLinks = + artTag.directAncestorArtTags + .map(artTag => relation('linkArtTagInfo', artTag)); + } + + if (!empty(artTag.directDescendantArtTags)) { + const descendants = sec.descendants = {}; + + descendants.heading = + relation('generateContentHeading'); + + descendants.directDescendantInfoLinks = + artTag.directDescendantArtTags + .map(artTag => relation('linkArtTagInfo', artTag)); + + const allDescendantsHaveMoreDescendants = + artTag.directDescendantArtTags + .every(artTag => !empty(artTag.directDescendantArtTags)); + + if (!allDescendantsHaveMoreDescendants) { + descendants.directDescendantGalleryLinks = + artTag.directDescendantArtTags + .map(artTag => relation('linkArtTagGallery', artTag)); + } + } + + return relations; + }, + + data(query, sprawl, artTag) { + const data = {}; + + data.enableListings = sprawl.enableListings; + + data.name = artTag.name; + data.color = artTag.color; + + data.numArtworksIndirectly = query.indirectThings.length; + data.numArtworksDirectly = query.directThings.length; + data.numArtworksTotal = query.allThings.length; + + data.names = + query.allThings.map(thing => thing.name); + + data.paths = + query.allThings.map(thing => + (thing.album + ? ['media.trackCover', thing.album.directory, thing.directory, thing.coverArtFileExtension] + : ['media.albumCover', thing.directory, thing.coverArtFileExtension])); + + data.onlyFeaturedIndirectly = + query.allThings.map(thing => + !query.directThings.includes(thing)); + + return data; + }, + + generate(data, relations, {html, language}) { + const {sections: sec} = relations; + const nameOption = {tag: language.sanitize(data.name)}; + + return relations.layout + .slots({ + title: language.$('artTagInfoPage.title', nameOption), + headingMode: 'sticky', + color: data.color, + + mainContent: [ + html.tag('p', + (data.numArtworksTotal === 0 + ? language.$('artTagInfoPage.featuredIn.notFeatured') + : data.numArtworksDirectly === 0 + ? language.$('artTagInfoPage.featuredIn.indirectlyOnly', { + artworks: language.countArtworks(data.numArtworksIndirectly, {unit: true}), + }) + : data.numArtworksIndirectly === 0 + ? language.$('artTagInfoPage.featuredIn.directlyOnly', { + artworks: language.countArtworks(data.numArtworksDirectly, {unit: true}), + }) + : language.$('artTagInfoPage.featuredIn.directlyAndIndirectly', { + artworksDirectly: language.countArtworks(data.numArtworksDirectly, {unit: true}), + artworksIndirectly: language.countArtworks(data.numArtworksIndirectly, {unit: false}), + artworksTotal: language.countArtworks(data.numArtworksTotal, {unit: false}), + }))), + + sec.info.galleryLink && + html.tag('p', + language.$('artTagInfoPage.viewArtGallery', { + link: + sec.info.galleryLink + .slot('content', language.$('artTagInfoPage.viewArtGallery.link')), + })), + + html.tag('blockquote', + {[html.onlyIfContent]: true}, + sec.info.description + ?.slot('mode', 'multiline')), + + sec.info.extraReadingLinks && + html.tag('p', + language.$('artTagInfoPage.readMoreOn', { + ...nameOption, + links: language.formatDisjunctionList(sec.info.extraReadingLinks), + })), + + sec.ancestors && [ + sec.ancestors.heading + .slot('title', + language.$('artTagInfoPage.descendsFromTags', nameOption)), + + html.tag('ul', + sec.ancestors.directAncestorLinks + .map(link => + html.tag('li', + language.$('artTagInfoPage.descendsFromTags.item', { + tag: link, + })))), + ], + + sec.descendants && [ + sec.descendants.heading + .slot('title', + language.$('artTagInfoPage.descendantTags', nameOption)), + + !sec.descendants.directDescendantGalleryLinks && + html.tag('ul', + sec.descendants.directDescendantInfoLinks + .map(link => + html.tag('li', + language.$('artTagInfoPage.descendantTags.item', { + tag: link, + })))), + + sec.descendants.directDescendantGalleryLinks && + html.tag('ul', + stitchArrays({ + infoLink: sec.descendants.directDescendantInfoLinks, + galleryLink: sec.descendants.directDescendantGalleryLinks, + }).map(({infoLink, galleryLink}) => + html.tag('li', + language.$('artTagInfoPage.descendantTags.item.withGallery', { + tag: infoLink, + + gallery: + galleryLink.slot('content', + language.$('artTagInfoPage.descendantTags.item.gallery')), + })))), + ], + ], + + navLinkStyle: 'hierarchical', + navLinks: relations.navLinks.content, + + ...relations.sidebar, + }); + }, +}; |