#!/usr/bin/env python3 import html from os import path from pathlib import Path import re from subprocess import run from sys import argv PROGRAM_RE = re.compile('\n'.join(( r'NOM : (?P[^\n]+)', r'COMPOSITEURS : (?P[^\n]+)', 'DESCRIPTION :', '(?P.+?)', 'MORCEAUX :', r'(?P(?:- [^\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 = '''\
{name}
{composers}
{description}
    {pieces}
''' def piece(p): if p in ('entracte', 'intermission'): return f'
  • {p}
  • ' return f'
  • {html.escape(p)}
  • ' def pandoc(md): return run( ('pandoc',), input=md, capture_output=True, text=True, check=True ).stdout def print_program(info): info['name'] = re.sub( '

    (.+)

    ', r'\1', pandoc(info['name']) ) info['description'] = pandoc(info['description']) info['pieces'] = '\n'.join( piece(p[2:]) # Assume p.startswith('- '). for p in info['pieces'].splitlines() ) print(BLOCK_TEMPLATE.format_map(info)) def main(programs_src): # pathlib.Path(x).relative_to(y) cannot handle y not being under x, # os.path.relpath('x') yields '' rather than '.'. # 😮‍💨 imgdir = path.relpath('images', Path(programs_src).parent) for p in read_programs(programs_src): info = p.groupdict() info['imgdir'] = imgdir print_program(info) if __name__ == '__main__': main(argv[1])