summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2020-12-02 12:28:19 -0500
committerDaniel Micay <danielmicay@gmail.com>2020-12-02 12:51:22 -0500
commitabc83cbed6ebba15b5fc5a6f4f9524bb7e04db19 (patch)
tree88933803e5ea21ce9e49e5f9affed8a3977cc52b
parent0b2ff9352f3113fc164e79ed41a9e123fb76f8a6 (diff)
generate atom feed for releases
-rwxr-xr-xgenerate_feed.py55
-rw-r--r--nginx/nginx.conf2
-rwxr-xr-xprocess_static12
-rw-r--r--static/releases.html1
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>