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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  | 
import {sortChronologically} from '#sort';
import {empty} from '#sugar';
export default {
  sprawl: ({albumData, wikiInfo}) => ({albumData, wikiInfo}),
  query(sprawl, spec) {
    const query = {spec};
    const groups = sprawl.wikiInfo.divideTrackListsByGroups;
    query.divideByGroups = !empty(groups);
    if (query.divideByGroups) {
      query.groups = groups;
      query.groupAlbums =
        groups
          .map(group =>
            group.albums.filter(album => album.tracks.length > 1));
    } else {
      query.undividedAlbums =
        sortChronologically(sprawl.albumData.slice())
          .filter(album => album.tracks.length > 1);
    }
    return query;
  },
  relations(relation, query) {
    const relations = {};
    relations.page =
      relation('generateListingPage', query.spec);
    if (query.divideByGroups) {
      relations.groupLinks =
        query.groups
          .map(group => relation('linkGroup', group));
      relations.groupAlbumLinks =
        query.groupAlbums
          .map(albums => albums
            .map(album =>
              relation('generateListRandomPageLinksAlbumLink', album)));
    } else {
      relations.undividedAlbumLinks =
        query.undividedAlbums
          .map(album =>
            relation('generateListRandomPageLinksAlbumLink', album));
    }
    return relations;
  },
  data(query) {
    const data = {};
    if (query.divideByGroups) {
      data.groupDirectories =
        query.groups
          .map(group => group.directory);
    }
    return data;
  },
  generate(data, relations, {html, language}) {
    const capsule = language.encapsulate('listingPage.other.randomPages');
    const miscellaneousChunkRows = [
      language.encapsulate(capsule, 'chunk.item.randomArtist', capsule => ({
        stringsKey: 'randomArtist',
        mainLink:
          html.tag('a',
            {href: '#', 'data-random': 'artist'},
            language.$(capsule, 'mainLink')),
        atLeastTwoContributions:
          html.tag('a',
            {href: '#', 'data-random': 'artist-more-than-one-contrib'},
            language.$(capsule, 'atLeastTwoContributions')),
      })),
      {stringsKey: 'randomAlbumWholeSite'},
      {stringsKey: 'randomTrackWholeSite'},
    ];
    const miscellaneousChunkRowAttributes = [
      null,
      {href: '#', 'data-random': 'album'},
      {href: '#','data-random': 'track'},
    ];
    return relations.page.slots({
      type: 'chunks',
      content: [
        html.tag('p',
          language.encapsulate(capsule, 'chooseLinkLine', capsule =>
            language.$(capsule, {
              fromPart:
                (relations.groupLinks
                  ? language.$(capsule, 'fromPart.dividedByGroups')
                  : language.$(capsule, 'fromPart.notDividedByGroups')),
              browserSupportPart:
                language.$(capsule, 'browserSupportPart'),
            }))),
        html.tag('p', {id: 'data-loading-line'},
          language.$(capsule, 'dataLoadingLine')),
        html.tag('p', {id: 'data-loaded-line'},
          language.$(capsule, 'dataLoadedLine')),
        html.tag('p', {id: 'data-error-line'},
          language.$(capsule, 'dataErrorLine')),
      ],
      showSkipToSection: true,
      chunkIDs:
        (data.groupDirectories
          ? [null, ...data.groupDirectories]
          : null),
      chunkTitles: [
        {stringsKey: 'misc'},
        ...
          (relations.groupLinks
            ? relations.groupLinks.map(groupLink => ({
                stringsKey: 'fromGroup',
                group: groupLink,
              }))
            : [{stringsKey: 'fromAlbum'}]),
      ],
      chunkTitleAccents: [
        null,
        ...
          (relations.groupLinks
            ? relations.groupLinks.map(() =>
                language.encapsulate(capsule, 'chunk.title.fromGroup.accent', capsule => ({
                  randomAlbum:
                    html.tag('a',
                      {href: '#', 'data-random': 'album-in-group-dl'},
                      language.$(capsule, 'randomAlbum')),
                  randomTrack:
                    html.tag('a',
                      {href: '#', 'data-random': 'track-in-group-dl'},
                      language.$(capsule, 'randomTrack')),
                })))
            : [null]),
      ],
      chunkRows: [
        miscellaneousChunkRows,
        ...
          (relations.groupAlbumLinks
            ? relations.groupAlbumLinks.map(albumLinks =>
                albumLinks.map(albumLink => ({
                  stringsKey: 'album',
                  album: albumLink,
                })))
            : [
                relations.undividedAlbumLinks.map(albumLink => ({
                  stringsKey: 'album',
                  album: albumLink,
                })),
              ]),
      ],
      chunkRowAttributes: [
        miscellaneousChunkRowAttributes,
        ...
          (relations.groupAlbumLinks
            ? relations.groupAlbumLinks.map(albumLinks =>
                albumLinks.map(() => null))
            : [relations.undividedAlbumLinks.map(() => null)]),
      ],
    });
  },
};
  |