From cdd739f0a31f08ff9dbb0bfa7796e271bc9fb58d Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Mon, 13 Apr 2020 15:21:32 -0400 Subject: Add elements in Atom --- atom.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'atom.c') diff --git a/atom.c b/atom.c index d3463ce..0572cab 100644 --- a/atom.c +++ b/atom.c @@ -22,6 +22,8 @@ #include "archive.h" +const char *atomBaseURL; + static char *atomID(const struct Envelope *envelope) { struct Variable vars[] = { { "messageID", envelope->messageID }, @@ -47,27 +49,39 @@ static int atomAuthor(FILE *file, struct Address addr) { return templateRender(file, template, vars, escapeXML); } +static char *atomEntryURL(const struct Envelope *envelope) { + struct Variable vars[] = { + { "name", pathMangle(envelope->messageID) }, + {0}, + }; + return templateURL("/message/[name].mbox", vars); +} + int atomEntryOpen(FILE *file, const struct Envelope *envelope) { - // TODO: to corresponding mbox, needs base URL. const char *template = TEMPLATE( [id] [title] [updated] + ); char *id = atomID(envelope); char updated[sizeof("0000-00-00T00:00:00Z")]; strftime(updated, sizeof(updated), "%FT%TZ", gmtime(&envelope->time)); + char *url = atomEntryURL(envelope); struct Variable vars[] = { { "id", id }, { "title", envelope->subject }, { "updated", updated }, + { "base", (atomBaseURL ? atomBaseURL : "") }, + { "url", url }, {0}, }; int error = 0 || templateRender(file, template, vars, escapeXML) || atomAuthor(file, envelope->from); free(id); + free(url); return error; } @@ -83,30 +97,51 @@ int atomEntryClose(FILE *file) { return templateRender(file, TEMPLATE(), NULL, NULL); } +static char *atomFeedURL(const struct Envelope *envelope, const char *type) { + struct Variable vars[] = { + { "name", pathMangle(envelope->messageID) }, + { "type", type }, + {0}, + }; + return templateURL("/thread/[name].[type]", vars); +} + int atomFeedOpen(FILE *file, const struct Envelope *envelope) { - // TODO: to the corresponding HTML, mbox. const char *template = TEMPLATE( <[q]xml version="1.0" encoding="utf-8"[q]> [id] [title] [updated] + + + ); char *id = atomID(envelope); time_t now = time(NULL); char updated[sizeof("0000-00-00T00:00:00Z")]; strftime(updated, sizeof(updated), "%FT%TZ", gmtime(&now)); + char *atom = atomFeedURL(envelope, "atom"); + char *html = atomFeedURL(envelope, "html"); + char *mbox = atomFeedURL(envelope, "mbox"); struct Variable vars[] = { { "q", "?" }, { "id", id }, { "title", envelope->subject }, { "updated", updated }, + { "base", (atomBaseURL ? atomBaseURL : "") }, + { "atom", atom }, + { "html", html }, + { "mbox", mbox }, {0}, }; int error = 0 || templateRender(file, template, vars, escapeXML) || atomAuthor(file, envelope->from); free(id); + free(atom); + free(html); + free(mbox); return error; } -- cgit 1.4.1