aboutsummaryrefslogtreecommitdiff
path: root/gemini-to-web/src/gemini_to_web/rss.py
blob: 40bb025aec1fe7ab5bc2815baefddb26d9174658 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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=None)
    argument_parser.add_argument("--subtitle", default=None)
    argument_parser.add_argument("base_url")
    argument_parser.add_argument("base_dir", type=pathlib.Path)
    args = argument_parser.parse_args()

    input_ = sys.stdin.read()
    parsed = parser.parse(input_)
    parsed = list(parsed)

    title = args.title
    if not title:
        title = [p for p in parsed if isinstance(p, parser.HeadingLine) and p.level == 1][0].heading_text

    subtitle = args.subtitle
    if not subtitle:
        subtitle = [p for p in parsed if isinstance(p, parser.HeadingLine) and p.level == 2][0].heading_text

    fg = feed.FeedGenerator()
    fg.title(title)
    fg.subtitle(subtitle)
    fg.link(href=args.base_url, rel="self")

    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="")