diff options
Diffstat (limited to '')
-rw-r--r-- | archive.h | 8 | ||||
-rw-r--r-- | atom.c | 110 |
2 files changed, 60 insertions, 58 deletions
diff --git a/archive.h b/archive.h index 3328340..8576df5 100644 --- a/archive.h +++ b/archive.h @@ -172,6 +172,14 @@ void concatData( void concatThreads(struct List threads, const struct Envelope *envelopes); void concatIndex(struct List threads, const struct Envelope *envelopes); +static inline struct ISO8601 { + char s[sizeof("0000-00-00T00:00:00Z")]; +} iso8601(time_t time) { + struct ISO8601 buf; + strftime(buf.s, sizeof(buf.s), "%FT%TZ", gmtime(&time)); + return buf; +} + struct Variable { const char *name; const char *value; diff --git a/atom.c b/atom.c index ddfb3f6..16215df 100644 --- a/atom.c +++ b/atom.c @@ -41,22 +41,6 @@ static char *atomID(const struct Envelope *envelope) { return templateString("mid:[messageID]", vars, escapeURL); } -static int atomAuthor(FILE *file, struct Address addr) { - const char *template = { - Q(<author>) - Q(<name>[name]</name>) - Q(<email>[mailbox]@[host]</email>) - Q(</author>) - }; - struct Variable vars[] = { - { "name", addressName(addr) }, - { "mailbox", addr.mailbox }, - { "host", addr.host }, - {0}, - }; - return templateRender(file, template, vars, escapeXML); -} - static char *atomEntryURL(const struct Envelope *envelope) { struct Variable vars[] = { { "messageID", envelope->messageID }, @@ -66,26 +50,36 @@ static char *atomEntryURL(const struct Envelope *envelope) { return templateString("/" PATH_MESSAGE, vars, escapeURL); } -static const char *atomUpdated(time_t time) { - static char buf[sizeof("0000-00-00T00:00:00Z")]; - strftime(buf, sizeof(buf), "%FT%TZ", gmtime(&time)); - return buf; +static int atomAuthor(FILE *file, struct Address addr) { + const char *template = Q( + <author> + <name>[name]</name> + <email>[mailbox]@[host]</email> + </author> + ); + struct Variable vars[] = { + { "name", addressName(addr) }, + { "mailbox", addr.mailbox }, + { "host", addr.host }, + {0}, + }; + return templateRender(file, template, vars, escapeXML); } int atomEntryOpen(FILE *file, const struct Envelope *envelope) { - const char *template = { - Q(<entry>) - Q(<id>[id]</id>) - Q(<title>[title]</title>) - Q(<updated>[updated]</updated>) - Q(<link rel="alternate" type="application/mbox" href="[base][url]"/>) - }; char *id = atomID(envelope); char *url = atomEntryURL(envelope); + const char *template = Q( + <entry> + <id>[id]</id> + <title>[title]</title> + <updated>[updated]</updated> + <link rel="alternate" type="application/mbox" href="[base][url]"/> + ); struct Variable vars[] = { { "id", id }, { "title", envelope->subject }, - { "updated", atomUpdated(envelope->time) }, + { "updated", iso8601(envelope->time).s }, { "base", baseURL }, { "url", url }, {0}, @@ -99,13 +93,13 @@ int atomEntryOpen(FILE *file, const struct Envelope *envelope) { } int atomContent(FILE *file, const char *content) { - const char *template = { - Q(<content type="xhtml">) - Q(<div xmlns="http://www.w3.org/1999/xhtml">) - Q(<pre>[content]</pre>) - Q(</div>) - Q(</content>) - }; + const char *template = Q( + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + <pre>[content]</pre> + </div> + </content> + ); struct Variable vars[] = { { "content", content }, {0}, @@ -126,27 +120,28 @@ static char *atomThreadURL(const struct Envelope *envelope, const char *type) { return templateString("/" PATH_THREAD, vars, escapeURL); } +#define XML_DECL "<?" Q(xml version="1.0" encoding="utf-8") "?>" + int atomThreadOpen(FILE *file, const struct Envelope *envelope) { - const char *template = { - "<?" Q(xml version="1.0" encoding="utf-8") "?>" - Q(<feed xmlns="http://www.w3.org/2005/Atom">) - Q(<generator uri="[generator]">bubger</generator>) - Q(<id>[id]</id>) - Q(<title>[title]</title>) - Q(<updated>[updated]</updated>) - Q(<link rel="self" href="[base][atom]"/>) - Q(<link rel="alternate" type="text/html" href="[base][html]"/>) - Q(<link rel="alternate" type="application/mbox" href="[base][mbox]"/>) - }; char *id = atomID(envelope); char *atom = atomThreadURL(envelope, "atom"); char *html = atomThreadURL(envelope, "html"); char *mbox = atomThreadURL(envelope, "mbox"); + const char *template = XML_DECL Q( + <feed xmlns="http://www.w3.org/2005/Atom"> + <generator uri="[generator]">bubger</generator> + <id>[id]</id> + <title>[title]</title> + <updated>[updated]</updated> + <link rel="self" href="[base][atom]"/> + <link rel="alternate" type="text/html" href="[base][html]"/> + <link rel="alternate" type="application/mbox" href="[base][mbox]"/> + ); struct Variable vars[] = { { "generator", GENERATOR_URL }, { "id", id }, { "title", envelope->subject }, - { "updated", atomUpdated(time(NULL)) }, + { "updated", iso8601(time(NULL)).s }, { "base", baseURL }, { "atom", atom }, { "html", html }, @@ -168,21 +163,20 @@ int atomThreadClose(FILE *file) { } int atomIndexOpen(FILE *file) { - const char *template = { - "<?" Q(xml version="1.0" encoding="utf-8") "?>" - Q(<feed xmlns="http://www.w3.org/2005/Atom">) - Q(<generator uri="[generator]">bubger</generator>) - Q(<id>mailto:[mailto]</id>) - Q(<title>[title]</title>) - Q(<updated>[updated]</updated>) - Q(<link rel="self" href="[base]/index.atom"/>) - Q(<link rel="alternate" type="text/html" href="[base]/index.html"/>) - }; + const char *template = XML_DECL Q( + <feed xmlns="http://www.w3.org/2005/Atom"> + <generator uri="[generator]">bubger</generator> + <id>mailto:[mailto]</id> + <title>[title]</title> + <updated>[updated]</updated> + <link rel="self" href="[base]/index.atom"/> + <link rel="alternate" type="text/html" href="[base]/index.html"/> + ); struct Variable vars[] = { { "generator", GENERATOR_URL }, { "mailto", baseMailto }, { "title", baseTitle }, - { "updated", atomUpdated(time(NULL)) }, + { "updated", iso8601(time(NULL)).s }, { "base", baseURL }, {0}, }; |