about summary refs log tree commit diff
path: root/atom.c
diff options
context:
space:
mode:
Diffstat (limited to 'atom.c')
-rw-r--r--atom.c38
1 files changed, 24 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>