#!/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])