summaryrefslogtreecommitdiff
path: root/build-programs.py
blob: e914e663488936b391f319416c1382249e5c7f63 (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
#!/usr/bin/env python3

import html
import re
from subprocess import run
from sys import argv

from helpers import relative_path


PROGRAM_RE = re.compile('\n'.join((
    r'NOM : (?P<name>[^\n]+)',
    r'COMPOSITEURS : (?P<composers>[^\n]+)',
    r'DUR[ÉE]E : (?P<duration>[^\n]+)',
    'DESCRIPTION :',
    '(?P<description>.+?)',
    'MORCEAUX :',
    r'(?P<pieces>(?:[^\n]+\n)*[^\n]+)'
)), flags=re.DOTALL)

def read_programs(programs):
    with open(programs) as f:
        return tuple(re.finditer(PROGRAM_RE, f.read()))


BLOCK_TEMPLATE = '''\
<details class="program">
  <summary>
    <div class="name">{name}</div>
    <div class="composers">{composers}</div>
    <img class="button open" src="{imgdir}/chevron-down.svg">
    <img class="button close" src="{imgdir}/chevron-up.svg">
  </summary>
<p class="info duration">{duration}</p>
{description}
<ol class="info pieces">
{pieces}
</ol>
</details>
'''

def piece(p):
    if p in ('entracte', 'intermission'):
        return f'<li class="intermission">{p}</li>'
    return f'<li>{html.escape(p)}</li>'

def pandoc(md):
    return run(
        ('pandoc', '--wrap=none'),
        input=md, capture_output=True, text=True, check=True
    ).stdout

def print_program(info):
    info['name'] = re.sub(
        '<p>(.+)</p>', r'\1', pandoc(info['name'])
    )
    info['description'] = pandoc(info['description'])
    info['pieces'] = '\n'.join(map(piece, info['pieces'].splitlines()))

    print(BLOCK_TEMPLATE.format_map(info))


def main(programs_src):
    imgdir = relative_path(to='images', ref=programs_src)

    for p in read_programs(programs_src):
        info = p.groupdict()
        info['imgdir'] = imgdir
        print_program(info)


if __name__ == '__main__':
    main(argv[1])