« get me outta code hell

generateAlbumArtInfoBox.js « dependencies « content « src - hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateAlbumArtInfoBox.js
blob: a3b4c02da89899a905f6a0eaef639ffab60fe703 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import {basename} from 'node:path';

import {empty} from '#sugar';

export default {
  relations: (relation, album) => ({
    wallpaperArtistContributionsLine:
      (album.wallpaperArtwork
        ? relation('generateReleaseInfoContributionsLine',
            album.wallpaperArtwork.artistContribs)
        : null),

    bannerArtistContributionsLine:
      (album.bannerArtwork
        ? relation('generateReleaseInfoContributionsLine',
            album.bannerArtwork.artistContribs)
        : null),

    linkTemplate:
      relation('linkTemplate'),
  }),

  data: (album) => ({
    wallpaperImagePath:
      (album.wallpaperArtwork && empty(album.wallpaperParts)
        ? album.wallpaperArtwork.path
        : null),

    wallpaperPartPaths:
      album.wallpaperParts
        .filter(part => part.asset)
        .map(part => ['media.albumWallpaperPart', album.directory, part.asset]),

    bannerImagePath:
      (album.bannerArtwork
        ? album.bannerArtwork.path
        : null),
  }),

  generate: (data, relations, {html, language}) =>
    html.tag('div', {class: 'album-art-info'},
      {[html.onlyIfContent]: true},
      {[html.joinChildren]: html.tag('hr', {class: 'cute'})},

      [
        language.encapsulate('releaseInfo', capsule =>
          html.tag('p',
            {[html.onlyIfContent]: true},
            {[html.joinChildren]: html.tag('br')},

            [
              relations.wallpaperArtistContributionsLine?.slots({
                stringKey: capsule + '.wallpaperArtBy',
                chronologyKind: 'wallpaperArt',
              }),

              relations.bannerArtistContributionsLine?.slots({
                stringKey: capsule + '.bannerArtBy',
                chronologyKind: 'bannerArt',
              }),
            ])),

        language.encapsulate('misc.downloadLayoutMedia', downloadCapsule =>
          html.tag('p',
            {[html.onlyIfContent]: true},
            {[html.joinChildren]: html.tag('br')},

            [
              language.encapsulate(downloadCapsule, workingCapsule => {
                const workingOptions = {};

                let any = false;

                if (data.wallpaperImagePath) {
                  any = true;
                  workingCapsule += '.withWallpaper';
                  workingOptions.wallpaper =
                    relations.linkTemplate.clone().slots({
                      path: data.wallpaperImagePath,
                      content: language.$(downloadCapsule, 'wallpaper'),
                    });
                }

                if (data.bannerImagePath) {
                  any = true;
                  workingCapsule += '.withBanner';
                  workingOptions.banner =
                    relations.linkTemplate.clone().slots({
                      path: data.bannerImagePath,
                      content: language.$(downloadCapsule, 'banner'),
                    });
                }

                if (any) {
                  return language.$(workingCapsule, workingOptions);
                } else {
                  return html.blank();
                }
              }),

              language.$(downloadCapsule, 'withWallpaperParts', {
                [language.onlyIfOptions]: ['parts'],

                parts:
                  language.formatUnitList(
                    data.wallpaperPartPaths.map(path =>
                      relations.linkTemplate.clone().slots({
                        path,
                        content: language.sanitize(basename(path.at(-1))),
                      }))),
              }),
            ])),
      ]),
};