diff options
| -rwxr-xr-x | build-feed.py | 98 |
1 files changed, 39 insertions, 59 deletions
diff --git a/build-feed.py b/build-feed.py index a8cb733..a6b0890 100755 --- a/build-feed.py +++ b/build-feed.py @@ -2,7 +2,9 @@ from sys import argv from urllib.parse import urljoin -from xml.etree.ElementTree import Element, SubElement, indent, tostring + +from lxml.builder import E +from lxml.etree import CDATA, indent, tostring from helpers import ( DATE_FORMATTERS, @@ -36,66 +38,50 @@ LOCALIZED_FORMATS = { } -def text_element(tag, text, /, **kwargs): - elt = Element(tag, **kwargs) - elt.text = text - return elt - - -def block(tag, content): - return f'<{tag}>{content}</{tag}>' - - def cdata_concert(concert, lang): formatters = DATE_FORMATTERS[lang] blocks = [] - if concert.warning is None: - blocks.append(block('p', concert.warning)) + if concert.warning is not None: + blocks.append(E.p(concert.warning)) blocks.extend(( - block('p', formatters['date'](concert.time)), - block('p', formatters['time'](concert.time)), - block('p', concert.address.replace('\n', '<br>')) + E.p(formatters['date'](concert.time)), + E.p(formatters['time'](concert.time)), + # TODO: NEED TO USE FUNC/ITERTOOLS SHENANIGANS TO WEAVE E.br INTO THIS + E.p(concert.address.replace('\n', '<br>')), + E.ol( + *(E.li(touchup_plaintext(p)) for p in concert.pieces.splitlines()) + ), + *tuple(E.p(line) for line in concert.instructions.splitlines()), )) - piece_list = '\n'.join( - block('li', touchup_plaintext(p)) for p in concert.pieces.splitlines() - ) - blocks.append(block('ol', piece_list)) - - blocks.extend( - block('p', touchup_plaintext(line)) - for line in concert.instructions.splitlines() - ) - - cdata = '\n'.join((blocks)) - - return f'<![CDATA[{cdata}]]' + return CDATA('\n'.join( + tostring(b, encoding='utf-8').decode() for b in blocks + )) def generate_concert(concert, concerts_url, lang): formatters = LOCALIZED_FORMATS[lang] - item = Element('item') - with tmplocale(lang): title = formatters['title'](concert) - item.append(text_element('title', title)) anchor = f'concert-{concert.time.strftime("%F")}' - item.append(text_element('link', f'{concerts_url}#{anchor}')) - cdata = cdata_concert(concert, lang) - item.append(text_element('description', cdata)) - - return item + return E.item( + E.title(title), + E.link(f'{concerts_url}#{anchor}'), + E.description(cdata_concert(concert, lang)), + ) def generate_concerts(concerts_src, concerts_url, lang): - for c in read_concerts(concerts_src): - yield generate_concert(c, concerts_url, lang) + return tuple( + generate_concert(c, concerts_url, lang) + for c in read_concerts(concerts_src) + ) def main(concerts_src, feed_dst, domain): @@ -106,26 +92,20 @@ def main(concerts_src, feed_dst, domain): index_url = urljoin(url, text['indexpath']) concerts_url = urljoin(index_url, 'concerts.html') - rss = Element('rss', version='2.0') - - channel = SubElement(rss, 'channel') - - channel.extend(( - text_element('title', text['title']), - text_element('link', index_url), - text_element('description', text['description']), - )) - - image = SubElement(channel, 'image') - image.extend(( - text_element('url', urljoin(url, 'images/logo.svg')), - text_element('link', concerts_url), - )) - - channel.append(text_element('language', lang)) - - items = generate_concerts(concerts_src, concerts_url, lang) - channel.extend(tuple(items)) + rss = E.rss( + E.channel( + E.title(text['title']), + E.link(index_url), + E.description(text['description']), + E.image( + E.url(urljoin(url, 'images/logo.svg')), + E.link(concerts_url), + ), + E.language(lang), + *generate_concerts(concerts_src, concerts_url, lang), + ), + version='2.0', + ) indent(rss) |
