about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--atom.c38
-rw-r--r--bubger.19
2 files changed, 33 insertions, 14 deletions
diff --git a/atom.c b/atom.c
index b49a2b7..782b265 100644
--- a/atom.c
+++ b/atom.c
@@ -34,17 +34,17 @@
 
 #include "archive.h"
 
-static char *atomID(const struct Envelope *envelope) {
+static char *atomID(const char *messageID) {
 	struct Variable vars[] = {
-		{ "messageID", envelope->messageID },
+		{ "messageID", messageID },
 		{0},
 	};
 	return templateString("mid:[messageID]", vars, escapeURL);
 }
 
-static char *atomEntryURL(const struct Envelope *envelope) {
+static char *atomEntryURL(const char *messageID) {
 	struct Variable vars[] = {
-		{ "messageID", envelope->messageID },
+		{ "messageID", messageID },
 		{ "type", "mbox" },
 		{0},
 	};
@@ -68,14 +68,18 @@ static int atomAuthor(FILE *file, struct Address addr) {
 }
 
 int atomEntryOpen(FILE *file, const struct Envelope *envelope) {
-	char *id = atomID(envelope);
-	char *url = atomEntryURL(envelope);
+	char *id = atomID(envelope->messageID);
+	char *url = atomEntryURL(envelope->messageID);
+	char *ref = (envelope->inReplyTo ? atomID(envelope->inReplyTo) : NULL);
 	const char *template = Q(
 		<entry>
 		<id>[id]</id>
 		<title>[title]</title>
 		<updated>[updated]</updated>
 		<link rel="alternate" type="application/mbox" href="[base][url]"/>
+		[+ref]
+		<thr:in-reply-to ref="[ref]"/>
+		[-]
 	);
 	struct Variable vars[] = {
 		{ "id", id },
@@ -83,6 +87,7 @@ int atomEntryOpen(FILE *file, const struct Envelope *envelope) {
 		{ "updated", iso8601(envelope->time).s },
 		{ "base", baseURL },
 		{ "url", url },
+		{ "ref", ref },
 		{0},
 	};
 	int error = 0
@@ -90,6 +95,7 @@ int atomEntryOpen(FILE *file, const struct Envelope *envelope) {
 		|| atomAuthor(file, envelope->from);
 	free(id);
 	free(url);
+	free(ref);
 	return error;
 }
 
@@ -112,9 +118,9 @@ int atomEntryClose(FILE *file) {
 	return templateRender(file, Q(</entry>), NULL, NULL);
 }
 
-static char *atomThreadURL(const struct Envelope *envelope, const char *type) {
+static char *atomThreadURL(const char *messageID, const char *type) {
 	struct Variable vars[] = {
-		{ "messageID", envelope->messageID },
+		{ "messageID", messageID },
 		{ "type", type },
 		{0},
 	};
@@ -124,12 +130,14 @@ static char *atomThreadURL(const struct Envelope *envelope, const char *type) {
 #define XML_DECL "<?" Q(xml version="1.0" encoding="utf-8") "?>"
 
 int atomThreadOpen(FILE *file, const struct Envelope *envelope) {
-	char *id = atomID(envelope);
-	char *atom = atomThreadURL(envelope, "atom");
-	char *html = atomThreadURL(envelope, "html");
-	char *mbox = atomThreadURL(envelope, "mbox");
+	char *id = atomID(envelope->messageID);
+	char *atom = atomThreadURL(envelope->messageID, "atom");
+	char *html = atomThreadURL(envelope->messageID, "html");
+	char *mbox = atomThreadURL(envelope->messageID, "mbox");
 	const char *template = XML_DECL Q(
-		<feed xmlns="http://www.w3.org/2005/Atom">
+		<feed
+			xmlns="http://www.w3.org/2005/Atom"
+			xmlns:thr="http://purl.org/syndication/thread/1.0">
 		<generator uri="[generator]">bubger</generator>
 		<id>[id]</id>
 		<title>[title]</title>
@@ -176,7 +184,9 @@ int atomIndexOpen(FILE *file, const char *name) {
 	char *atom = atomIndexURL(name, "atom");
 	char *html = atomIndexURL(name, "html");
 	const char *template = XML_DECL Q(
-		<feed xmlns="http://www.w3.org/2005/Atom">
+		<feed
+			xmlns="http://www.w3.org/2005/Atom"
+			xmlns:thr="http://purl.org/syndication/thread/1.0">
 		<generator uri="[generator]">bubger</generator>
 		<id>[base][atom]</id>
 		<title>[+name][name] - [-][title]</title>
diff --git a/bubger.1 b/bubger.1
index 0e5d7fe..4edfd36 100644
--- a/bubger.1
+++ b/bubger.1
@@ -338,6 +338,15 @@ bubger		TO "list+bubger@causal.agency"
 .%U https://tools.ietf.org/html/rfc4287
 .%D December 2005
 .Re
+.It
+.Rs
+.%A J. Snell
+.%T Atom Threading Extensions
+.%I IETF
+.%R RFC 4685
+.%U https://tools.ietf.org/html/rfc4685
+.%D September 2006
+.Re
 .El
 .
 .Sh AUTHORS