quatuorbellefeuille.com

Content, build scripts and admin scripts for the Bellefeuille Quartet website.
git clone https://git.kevinlegouguec.net/quatuorbellefeuille.com
Log | Files | Refs

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])