« get me outta code hell

generateLyricsSection.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/generateLyricsSection.js
blob: f6b719a9f13ad340396e010379f770d2db8dcbfa (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
import {stitchArrays} from '#sugar';

export default {
  contentDependencies: [
    'generateContentHeading',
    'generateIntrapageDotSwitcher',
    'generateLyricsEntry',
    'transformContent',
  ],

  extraDependencies: ['html', 'language'],

  relations: (relation, entries) => ({
    heading:
      relation('generateContentHeading'),

    switcher:
      relation('generateIntrapageDotSwitcher'),

    entries:
      entries
        .map(entry => relation('generateLyricsEntry', entry)),

    annotations:
      entries
        .map(entry => entry.annotation)
        .map(annotation => relation('transformContent', annotation)),
  }),

  data: (entries) => ({
    ids:
      Array.from(
        {length: entries.length},
        (_, index) => 'lyrics-entry-' + index),
  }),

  generate: (data, relations, {html, language}) =>
    language.encapsulate('releaseInfo.lyrics', capsule =>
      html.tags([
        relations.heading
          .slots({
            attributes: {id: 'lyrics'},
            title: language.$(capsule),
          }),

        html.tag('p', {class: 'lyrics-switcher'},
          {[html.onlyIfContent]: true},

          language.$(capsule, 'switcher', {
            [language.onlyIfOptions]: ['entries'],

            entries:
              relations.switcher.slots({
                initialOptionIndex: 0,

                titles:
                  relations.annotations.map(annotation =>
                    annotation.slots({
                      mode: 'inline',
                      textOnly: true,
                    })),

                targetIDs:
                  data.ids,
              }),
          })),

        stitchArrays({
          entry: relations.entries,
          id: data.ids,
        }).map(({entry, id}, index) =>
            entry.slots({
              attributes: [
                {id},

                index >= 1 &&
                  {style: 'display: none'},
              ],
            })),
      ])),
};