« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateFlashInfoPage.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/dependencies/generateFlashInfoPage.js')
-rw-r--r--src/content/dependencies/generateFlashInfoPage.js239
1 files changed, 105 insertions, 134 deletions
diff --git a/src/content/dependencies/generateFlashInfoPage.js b/src/content/dependencies/generateFlashInfoPage.js
index 05964936..d06f0c01 100644
--- a/src/content/dependencies/generateFlashInfoPage.js
+++ b/src/content/dependencies/generateFlashInfoPage.js
@@ -19,180 +19,151 @@ export default {
   query(flash) {
     const query = {};
 
-    if (flash.page || !empty(flash.urls)) {
-      query.urls = [];
+    query.urls = [];
 
-      if (flash.page) {
-        query.urls.push(`https://homestuck.com/story/${flash.page}`);
-      }
+    if (flash.page) {
+      query.urls.push(`https://homestuck.com/story/${flash.page}`);
+    }
 
-      if (!empty(flash.urls)) {
-        query.urls.push(...flash.urls);
-      }
+    if (!empty(flash.urls)) {
+      query.urls.push(...flash.urls);
     }
 
     return query;
   },
 
-  relations(relation, query, flash) {
-    const relations = {};
-    const sections = relations.sections = {};
-
-    relations.layout =
-      relation('generatePageLayout');
+  relations: (relation, query, flash) => ({
+    layout:
+      relation('generatePageLayout'),
 
-    relations.sidebar =
-      relation('generateFlashActSidebar', flash.act, flash);
+    sidebar:
+      relation('generateFlashActSidebar', flash.act, flash),
 
-    if (query.urls) {
-      relations.externalLinks =
-        query.urls.map(url => relation('linkExternal', url));
-    }
-
-    // TODO: Flashes always have cover art (#175)
-    /* eslint-disable-next-line no-constant-condition */
-    if (true) {
-      relations.cover =
-        relation('generateFlashCoverArtwork', flash);
-    }
+    externalLinks:
+      query.urls
+        .map(url => relation('linkExternal', url)),
 
-    // Section: navigation bar
+    cover:
+      relation('generateFlashCoverArtwork', flash),
 
-    const nav = sections.nav = {};
+    contentHeading:
+      relation('generateContentHeading'),
 
-    nav.flashActLink =
-      relation('linkFlashAct', flash.act);
+    flashActLink:
+      relation('linkFlashAct', flash.act),
 
-    nav.flashNavAccent =
-      relation('generateFlashNavAccent', flash);
+    flashNavAccent:
+      relation('generateFlashNavAccent', flash),
 
-    // Section: Featured tracks
-
-    if (!empty(flash.featuredTracks)) {
-      const featuredTracks = sections.featuredTracks = {};
-
-      featuredTracks.heading =
-        relation('generateContentHeading');
-
-      featuredTracks.list =
-        relation('generateTrackList', flash.featuredTracks);
-    }
-
-    // Section: Contributors
-
-    if (!empty(flash.contributorContribs)) {
-      const contributors = sections.contributors = {};
-
-      contributors.heading =
-        relation('generateContentHeading');
-
-      contributors.list =
-        relation('generateContributionList', flash.contributorContribs);
-    }
-
-    // Section: Artist commentary
-
-    if (flash.commentary) {
-      sections.artistCommentary =
-        relation('generateCommentarySection', flash.commentary);
-    }
+    featuredTracksList:
+      relation('generateTrackList', flash.featuredTracks),
 
-    return relations;
-  },
+    contributorContributionList:
+      relation('generateContributionList', flash.contributorContribs),
 
-  data(query, flash) {
-    const data = {};
+    artistCommentarySection:
+      relation('generateCommentarySection', flash.commentary),
+  }),
 
-    data.name = flash.name;
-    data.color = flash.color;
-    data.date = flash.date;
+  data: (_query, flash) => ({
+    name:
+      flash.name,
 
-    return data;
-  },
+    color:
+      flash.color,
 
-  generate(data, relations, {html, language}) {
-    const {sections: sec} = relations;
+    date:
+      flash.date,
+  }),
 
-    return relations.layout.slots({
-      title:
-        language.$('flashPage.title', {
-          flash: data.name,
-        }),
+  generate: (data, relations, {html, language}) =>
+    language.encapsulate('flashPage', pageCapsule =>
+      relations.layout.slots({
+        title:
+          language.$(pageCapsule, 'title', {
+            flash: data.name,
+          }),
 
-      color: data.color,
-      headingMode: 'sticky',
+        color: data.color,
+        headingMode: 'sticky',
 
-      cover:
-        (relations.cover
-          ? relations.cover.slots({
-              alt: language.$('misc.alt.flashArt'),
-            })
-          : null),
+        cover:
+          (relations.cover
+            ? relations.cover.slots({
+                alt: language.$('misc.alt.flashArt'),
+              })
+            : null),
 
-      mainContent: [
-        html.tag('p',
-          language.$('releaseInfo.released', {
-            date: language.formatDate(data.date),
-          })),
+        mainContent: [
+          html.tag('p',
+            language.$('releaseInfo.released', {
+              date: language.formatDate(data.date),
+            })),
 
-        relations.externalLinks &&
           html.tag('p',
+            {[html.onlyIfContent]: true},
+
             language.$('releaseInfo.playOn', {
+              [language.onlyIfOptions]: ['links'],
+
               links:
                 language.formatDisjunctionList(
                   relations.externalLinks
                     .map(link => link.slot('context', 'flash'))),
             })),
 
-        html.tag('p',
-          {[html.onlyIfContent]: true},
-          {[html.joinChildren]: html.tag('br')},
-
-          [
-            sec.artistCommentary &&
-              language.$('releaseInfo.readCommentary', {
-                link: html.tag('a',
-                  {href: '#artist-commentary'},
-                  language.$('releaseInfo.readCommentary.link')),
+          html.tag('p',
+            {[html.onlyIfContent]: true},
+            {[html.joinChildren]: html.tag('br')},
+
+            language.encapsulate('releaseInfo', capsule => [
+              !html.isBlank(relations.artistCommentarySection) &&
+                language.encapsulate(capsule, 'readCommentary', capsule =>
+                  language.$(capsule, {
+                    link:
+                      html.tag('a',
+                        {href: '#artist-commentary'},
+                        language.$(capsule, 'link')),
+                  })),
+            ])),
+
+          html.tags([
+            relations.contentHeading.clone()
+              .slots({
+                attributes: {id: 'features'},
+                title:
+                  language.$('releaseInfo.tracksFeatured', {
+                    flash: html.tag('i', data.name),
+                  }),
               }),
-          ]),
 
-        sec.featuredTracks && [
-          sec.featuredTracks.heading
-            .slots({
-              id: 'features',
-              title:
-                language.$('releaseInfo.tracksFeatured', {
-                  flash: html.tag('i', data.name),
-                }),
-            }),
+            relations.featuredTracksList,
+          ]),
 
-          sec.featuredTracks.list,
-        ],
+          html.tags([
+            relations.contentHeading.clone()
+              .slots({
+                attributes: {id: 'contributors'},
+                title: language.$('releaseInfo.contributors'),
+              }),
 
-        sec.contributors && [
-          sec.contributors.heading
-            .slots({
-              id: 'contributors',
-              title: language.$('releaseInfo.contributors'),
+            relations.contributorContributionList.slots({
+              chronologyKind: 'flash',
             }),
+          ]),
 
-          sec.contributors.list,
+          relations.artistCommentarySection,
         ],
 
-        sec.artistCommentary,
-      ],
-
-      navLinkStyle: 'hierarchical',
-      navLinks: [
-        {auto: 'home'},
-        {html: sec.nav.flashActLink.slot('color', false)},
-        {auto: 'current'},
-      ],
+        navLinkStyle: 'hierarchical',
+        navLinks: [
+          {auto: 'home'},
+          {html: relations.flashActLink.slot('color', false)},
+          {auto: 'current'},
+        ],
 
-      navBottomRowContent: sec.nav.flashNavAccent,
+        navBottomRowContent: relations.flashNavAccent,
 
-      leftSidebar: relations.sidebar,
-    });
-  },
+        leftSidebar: relations.sidebar,
+      })),
 };