#!/usr/bin/env python3
from collections import OrderedDict
from datetime import datetime
from pathlib import Path
from sys import argv
from helpers import (
DATE_FORMATTERS,
guess_language,
read_concerts,
relative_path,
split_concerts,
tmplocale,
touchup_plaintext,
)
# TODO: change some jargon:
# - event => concert
# - canceled => warning
LOCALIZED_TEXT = {
'en': {
'past': 'Past concerts',
'next': 'Next concerts',
'alt': 'Illustration:',
'hint': 'Click on a concert to obtain more information.',
},
'fr': {
'past': 'Concerts passés',
'next': 'Prochains concerts',
'alt': 'Illustration :',
'hint': "Cliquez sur un concert pour obtenir plus d'informations.",
}
}
THUMBNAILS_TEMPLATE = '''\
{heading}
{thumbnails}
\
'''
THUMBNAIL_TEMPLATE = '''\
\
'''
def format_credits(illustration):
attribution = illustration.source_name
if illustration.source_link is not None:
attribution = (
f''
f'{illustration.source_name}'
''
)
if illustration.license_info is not None:
attribution += ' / ' + illustration.license_info.format()
return attribution
def format_thumbnail(concert, imgdir, lang):
eventclasses = ('event',)
with tmplocale(lang):
day = f'{concert.time.day} {concert.time.strftime("%B %Y")}'
summary = f'{concert.place}
{day}'
if concert.warning is not None:
eventclasses += ('canceled',)
summary = (f'{concert.warning}\n'
f' {summary}')
alt_prefix = LOCALIZED_TEXT[lang]['alt']
pic_attributes = OrderedDict((
('src', Path(imgdir, 'concerts', concert.illustration.file)),
('alt', f'{alt_prefix} {concert.illustration.alt_text}'),
('style', concert.illustration.style),
))
return THUMBNAIL_TEMPLATE.format_map({
'eventclasses': ' '.join(eventclasses),
'eventid': f'concert-{concert.time.strftime("%F")}',
'pic_attributes': ' '.join(
f'{key}="{value}"'
for key, value in pic_attributes.items()
if value is not None
),
'summary': summary,
'credits': format_credits(concert.illustration)
})
def print_thumbnails_section(concerts, imgdir, section, lang):
if not concerts:
return
thumbnails = '\n'.join(
format_thumbnail(c, imgdir, lang) for c in concerts
)
print(THUMBNAILS_TEMPLATE.format(heading=LOCALIZED_TEXT[lang][section],
time=section,
thumbnails=thumbnails))
def print_thumbnails(concerts, imgdir, lang):
today = datetime.fromordinal(
datetime.today().date().toordinal()
)
past_concerts, next_concerts = split_concerts(concerts, today)
print('')
print_thumbnails_section(next_concerts, imgdir, 'next', lang)
print_thumbnails_section(past_concerts, imgdir, 'past', lang)
print('
')
DETAILS_TEMPLATE = '''\
{details}
\
'''
def detail_block(tag, classes, content):
opener = f'<{tag} class="{" ".join(classes)}">'
closer = f'{tag}>'
if isinstance(content, str):
return f' {opener}{content}{closer}'
return '\n'.join((
' '+opener,
*(' '+line for line in content),
' '+closer,
))
def break_lines(lines):
return tuple(line+'
' for line in lines[:-1]) + (lines[-1],)
def print_concert_details(concert, lang):
concert_id = f'concert-{concert.time.strftime("%F")}'
classes = ('details',)
blocks = []
if concert.warning is not None:
classes += ('canceled',)
blocks.append(
detail_block('p', ('canceled',), concert.warning)
)
with tmplocale(lang):
day = DATE_FORMATTERS[lang]['date'](concert.time)
hour = DATE_FORMATTERS[lang]['time'](concert.time)
address_lines = break_lines(concert.address.splitlines())
piece_list = tuple(
f'{touchup_plaintext(line)}'
for line in concert.pieces.splitlines()
)
blocks.extend((
detail_block('p', ('detail', 'date'), day),
detail_block('p', ('detail', 'time'), hour),
detail_block('p', ('detail', 'place'), address_lines),
detail_block('ol', ('detail', 'program'), piece_list),
))
instructions = [
f' {touchup_plaintext(line)}
'
for line in concert.instructions.splitlines()
]
print(f' ')
print('\n'.join(blocks+instructions))
print('
')
def print_details(concerts, lang):
print('')
print(f'
{LOCALIZED_TEXT[lang]["hint"]}
')
for c in concerts:
print_concert_details(c, lang)
print('
')
def main(concerts_src):
imgdir = relative_path(to='images', ref=concerts_src)
lang = guess_language(concerts_src)
concerts = read_concerts(concerts_src)
print_thumbnails(concerts, imgdir, lang)
print_details(concerts, lang)
if __name__ == '__main__':
main(argv[1])