« get me outta code hell

basic module-ify album pages - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/util
diff options
context:
space:
mode:
author(quasar) nebula <towerofnix@gmail.com>2021-06-01 15:32:03 -0300
committer(quasar) nebula <towerofnix@gmail.com>2021-06-01 15:32:03 -0300
commit234747721fec14e69fc75d6c0134ad4a5ae7736e (patch)
tree2f478d474ee0a0e0d009d7bc39589e89da39c181 /src/util
parent76207fff8bd19d443242ceb841aba09d2fc24190 (diff)
basic module-ify album pages
Other pages are commented out for now. Also, this doesn't include the
source .txt processing functions yet, 8ut that'll pro8a8ly end up in the
page/ files too.
Diffstat (limited to 'src/util')
-rw-r--r--src/util/serialize.js71
-rw-r--r--src/util/wiki-data.js31
2 files changed, 102 insertions, 0 deletions
diff --git a/src/util/serialize.js b/src/util/serialize.js
new file mode 100644
index 0000000..7b0f890
--- /dev/null
+++ b/src/util/serialize.js
@@ -0,0 +1,71 @@
+export function serializeLink(thing) {
+    const ret = {};
+    ret.name = thing.name;
+    ret.directory = thing.directory;
+    if (thing.color) ret.color = thing.color;
+    return ret;
+}
+
+export function serializeContribs(contribs) {
+    return contribs.map(({ who, what }) => {
+        const ret = {};
+        ret.artist = serializeLink(who);
+        if (what) ret.contribution = what;
+        return ret;
+    });
+}
+
+export function serializeImagePaths(original, {thumb}) {
+    return {
+        original,
+        medium: thumb.medium(original),
+        small: thumb.small(original)
+    };
+}
+
+export function serializeCover(thing, pathFunction, {
+    serializeImagePaths,
+    urls
+}) {
+    const coverPath = pathFunction(thing, {
+        to: urls.from('media.root').to
+    });
+
+    const { artTags } = thing;
+
+    const cwTags = artTags.filter(tag => tag.isCW);
+    const linkTags = artTags.filter(tag => !tag.isCW);
+
+    return {
+        paths: serializeImagePaths(coverPath),
+        tags: linkTags.map(serializeLink),
+        warnings: cwTags.map(tag => tag.name)
+    };
+}
+
+export function serializeGroupsForAlbum(album, {
+    serializeLink
+}) {
+    return album.groups.map(group => {
+        const index = group.albums.indexOf(album);
+        const next = group.albums[index + 1] || null;
+        const previous = group.albums[index - 1] || null;
+        return {group, index, next, previous};
+    }).map(({group, index, next, previous}) => ({
+        link: serializeLink(group),
+        descriptionShort: group.descriptionShort,
+        albumIndex: index,
+        nextAlbum: next && serializeLink(next),
+        previousAlbum: previous && serializeLink(previous),
+        urls: group.urls
+    }));
+}
+
+export function serializeGroupsForTrack(track, {
+    serializeLink
+}) {
+    return track.album.groups.map(group => ({
+        link: serializeLink(group),
+        urls: group.urls,
+    }));
+}
diff --git a/src/util/wiki-data.js b/src/util/wiki-data.js
index e76722b..13b8609 100644
--- a/src/util/wiki-data.js
+++ b/src/util/wiki-data.js
@@ -89,6 +89,15 @@ export function sortByArtDate(data) {
 
 // Specific data utilities
 
+export function getAlbumCover(album, {to}) {
+    return to('media.albumCover', album.directory);
+}
+
+export function getAlbumListTag(album) {
+    // TODO: This is hard-coded! No. 8ad.
+    return (album.directory === 'unreleased-tracks' ? 'ul' : 'ol');
+}
+
 // This gets all the track o8jects defined in every al8um, and sorts them 8y
 // date released. Generally, albumData will pro8a8ly already 8e sorted 8efore
 // you pass it to this function, 8ut individual tracks can have their own
@@ -124,3 +133,25 @@ export function getArtistCommentary(artist, {justEverythingMan}) {
             .replace(/<\/?b>/g, '')
             .includes('<i>' + artist.name + ':</i>')));
 }
+
+export function getFlashCover(flash, {to}) {
+    return to('media.flashArt', flash.directory);
+}
+
+export function getFlashLink(flash) {
+    return `https://homestuck.com/story/${flash.page}`;
+}
+
+export function getTotalDuration(tracks) {
+    return tracks.reduce((duration, track) => duration + track.duration, 0);
+}
+
+export function getTrackCover(track, {to}) {
+    // Some al8ums don't have any track art at all, and in those, every track
+    // just inherits the al8um's own cover art.
+    if (track.coverArtists === null) {
+        return getAlbumCover(track.album, {to});
+    } else {
+        return to('media.trackCover', track.album.directory, track.directory);
+    }
+}