summaryrefslogtreecommitdiff
path: root/build-feed.py
diff options
context:
space:
mode:
authorKévin Le Gouguec <kevin.legouguec@gmail.com>2022-02-21 22:09:12 +0100
committerKévin Le Gouguec <kevin.legouguec@gmail.com>2022-02-21 22:09:12 +0100
commit467f96cf68b121400c835683cf87b11db8c1c7b2 (patch)
treed771cc98030ca234bad980e066efc7ccf0cc996b /build-feed.py
parent0729fb76b52dcdaaf6d9b7f4dd60bc0099f067c3 (diff)
downloadquatuorbellefeuille.com-467f96cf68b121400c835683cf87b11db8c1c7b2.tar.xz
[wip] Add CDATA (cont'd)
Diffstat (limited to 'build-feed.py')
-rwxr-xr-xbuild-feed.py98
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)