diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2020-12-02 12:28:19 -0500 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2020-12-02 12:51:22 -0500 |
| commit | abc83cbed6ebba15b5fc5a6f4f9524bb7e04db19 (patch) | |
| tree | 88933803e5ea21ce9e49e5f9affed8a3977cc52b | |
| parent | 0b2ff9352f3113fc164e79ed41a9e123fb76f8a6 (diff) | |
generate atom feed for releases
| -rwxr-xr-x | generate_feed.py | 55 | ||||
| -rw-r--r-- | nginx/nginx.conf | 2 | ||||
| -rwxr-xr-x | process_static | 12 | ||||
| -rw-r--r-- | static/releases.html | 1 |
4 files changed, 66 insertions, 4 deletions
diff --git a/generate_feed.py b/generate_feed.py new file mode 100755 index 00000000..b6c687af --- /dev/null +++ b/generate_feed.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +from datetime import datetime + +import lxml.html +from lxml import etree + +document = lxml.html.parse("static_tmp/releases.html").getroot() +releases = document.body.cssselect("#changelog h3") + +updated = None +entries = [] + +for release in releases: + title = release.attrib["id"] + time = datetime.strptime(title, "%Y.%m.%d.%H").isoformat() + "Z" + if updated is None: + updated = time + content = [] + element = release.getnext() + while element is not None and element.tag != "h3": + content.append(etree.tostring(element).decode()) + element = element.getnext() + entry = f"""\ + <entry> + <id>https://grapheneos.org/releases#{title}</id> + <link href="https://grapheneos.org/releases#{title}"/> + <title>{title}</title> + <updated>{time}</updated> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + {"".join(content)} + </div> + </content> + </entry>""" + entries.append(entry) + +feed = f"""<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + <id>https://grapheneos.org/releases#changelog</id> + <link href="http://grapheneos.org/releases#changelog"/> + <link rel="self" href="https://grapheneos.org/releases.atom"/> + <title>GrapheneOS changelog</title> + <updated>{updated}</updated> + <author> + <name>GrapheneOS</name> + <email>contact@grapheneos.org</email> + <uri>https://grapheneos.org/</uri> + </author> + {"".join(entries)} +</feed> +""" + +with open("static_tmp/releases.atom", "w") as f: + f.write(feed) diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 62fdd854..6b2871c5 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -156,7 +156,7 @@ http { gzip_static off; } - location ~ "\.(json|pdf|txt|xml)$" { + location ~ "\.(atom|json|pdf|txt|xml)$" { include /etc/nginx/snippets/security-headers.conf; add_header Cache-Control "public, max-age=1800"; } diff --git a/process_static b/process_static index 66f3efc9..4a941751 100755 --- a/process_static +++ b/process_static @@ -12,10 +12,16 @@ for file in static_tmp/**/*.@(json|webmanifest); do json_reformat -m < "$file" | sponge "$file" done -find static_tmp -name '*.xml' -exec xmllint --noblanks {} --output {} \; -find static_tmp -name '*.css' -exec csso {} -o {} \; find static_tmp -name '*.html' -exec html-minifier --collapse-whitespace --process-scripts "application/ld+json" --collapse-boolean-attributes --remove-attribute-quotes --remove-comments --remove-empty-attributes --remove-redundant-attributes --remove-script-type-attributes --remove-style-link-type-attributes --sort-attributes --sort-class-name {} -o {} \; + +./generate_feed.py + +for file in static_tmp/**/*.@(atom|xml); do + xmllint --noblanks "$file" --output "$file" +done + +find static_tmp -name '*.css' -exec csso {} -o {} \; find static_tmp -name '*.js' -exec terser --module -cmo {} {} \; -find static_tmp -regex '\(.+/LICENSE\|.+\.\(css\|html\|ico\|js\|json\|pdf\|svg\|txt\|webmanifest\|xml\)\)' \ +find static_tmp -regex '\(.+/LICENSE\|.+\.\(atom\|css\|html\|ico\|js\|json\|pdf\|svg\|txt\|webmanifest\|xml\)\)' \ -exec zopfli {} \; -exec touch -r {} {}.gz \; \ -exec brotli -k {} \; diff --git a/static/releases.html b/static/releases.html index fb39aa80..779d45aa 100644 --- a/static/releases.html +++ b/static/releases.html @@ -24,6 +24,7 @@ <link rel="stylesheet" href="/grapheneos.css?20"/> <link rel="manifest" href="/manifest.webmanifest"/> <link rel="canonical" href="https://grapheneos.org/releases"/> + <link rel="alternate" type="application/atom+xml" href="/releases.atom"/> <script type="module" src="/releases.js?13"></script> <script type="module" src="/redirect.js?7"></script> </head> |
