build-programs.py (1748B)
1 #!/usr/bin/env python3 2 3 import html 4 import re 5 from subprocess import run 6 from sys import argv 7 8 from helpers import relative_path 9 10 11 PROGRAM_RE = re.compile('\n'.join(( 12 r'NOM : (?P<name>[^\n]+)', 13 r'COMPOSITEURS : (?P<composers>[^\n]+)', 14 r'DUR[ÉE]E : (?P<duration>[^\n]+)', 15 'DESCRIPTION :', 16 '(?P<description>.+?)', 17 'MORCEAUX :', 18 r'(?P<pieces>(?:[^\n]+\n)*[^\n]+)' 19 )), flags=re.DOTALL) 20 21 def read_programs(programs): 22 with open(programs) as f: 23 return tuple(re.finditer(PROGRAM_RE, f.read())) 24 25 26 BLOCK_TEMPLATE = '''\ 27 <details class="program"> 28 <summary> 29 <div class="name">{name}</div> 30 <div class="composers">{composers}</div> 31 <img class="button open" src="{imgdir}/chevron-down.svg"> 32 <img class="button close" src="{imgdir}/chevron-up.svg"> 33 </summary> 34 <p class="info duration">{duration}</p> 35 {description} 36 <ol class="info pieces"> 37 {pieces} 38 </ol> 39 </details> 40 ''' 41 42 def piece(p): 43 if p in ('entracte', 'intermission'): 44 return f'<li class="intermission">{p}</li>' 45 return f'<li>{html.escape(p)}</li>' 46 47 def pandoc(md): 48 return run( 49 ('pandoc', '--wrap=none'), 50 input=md, capture_output=True, text=True, check=True 51 ).stdout 52 53 def print_program(info): 54 info['name'] = re.sub( 55 '<p>(.+)</p>', r'\1', pandoc(info['name']) 56 ) 57 info['description'] = pandoc(info['description']) 58 info['pieces'] = '\n'.join(map(piece, info['pieces'].splitlines())) 59 60 print(BLOCK_TEMPLATE.format_map(info)) 61 62 63 def main(programs_src): 64 imgdir = relative_path(to='images', ref=programs_src) 65 66 for p in read_programs(programs_src): 67 info = p.groupdict() 68 info['imgdir'] = imgdir 69 print_program(info) 70 71 72 if __name__ == '__main__': 73 main(argv[1])