diff options
Diffstat (limited to 'gemini-to-web/src/gemini_to_web/rss.py')
| -rw-r--r-- | gemini-to-web/src/gemini_to_web/rss.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/gemini-to-web/src/gemini_to_web/rss.py b/gemini-to-web/src/gemini_to_web/rss.py new file mode 100644 index 0000000..a03a4aa --- /dev/null +++ b/gemini-to-web/src/gemini_to_web/rss.py @@ -0,0 +1,63 @@ +import argparse +import datetime +import pathlib +import sys + +from feedgen import feed +import htmlgenerator + +import gemini_to_web +from gemini_to_web import html +from gemini_to_web import parser + + +def cli_to_rss(): + argument_parser = argparse.ArgumentParser() + argument_parser.add_argument("--title", default="") + argument_parser.add_argument("--subtitle", default=None) + argument_parser.add_argument("--base-url", default="") + argument_parser.add_argument("base_dir", type=pathlib.Path) + args = argument_parser.parse_args() + + fg = feed.FeedGenerator() + fg.title(args.title) + fg.subtitle(args.subtitle) + fg.link(href=args.base_url, rel="self") + + input_ = sys.stdin.read() + parsed = parser.parse(input_) + parsed = list(parsed) + + entries = [] + for element in parsed: + match element: + case parser.LinkLine(url, link_name): + match = gemini_to_web.ENTRY_ELEMENT_TITLE.match(link_name) + if match: + entries.append((match.group(1), url, match.group(2))) + case _: + pass + + entries = sorted(entries, reverse=True) + entries = entries[0:10] + + for (date, url, title) in entries: + feed_entry = fg.add_entry() + feed_entry.link(href=args.base_url + "/" + url) + feed_entry.published( + datetime.datetime.combine( + datetime.date.fromisoformat(date), + datetime.datetime.min.time(), + tzinfo=datetime.UTC, + ) + ) + feed_entry.title(title) + parsed = parser.parse((args.base_dir / pathlib.Path(url).with_suffix(".gmi")).read_text()) + parsed = list(parsed) + parsed = parsed[1:] + content = html.to_html(parsed) + rendered = htmlgenerator.render(content[1], {}) + rendered = html.pretty(rendered) + feed_entry.content(rendered.encode("utf8"), type="html") + + print(fg.rss_str(pretty=True).decode("utf8"), end="") |
