From: Art Cancro Date: Tue, 7 Jun 2011 15:24:43 +0000 (-0400) Subject: When generating an RSS feed for a Blog room, omit comments; feed items are top level... X-Git-Tag: v8.11~661 X-Git-Url: https://code.citadel.org/?a=commitdiff_plain;h=99fb55af6e6e18b3c190de29eef4ebadab2010b1;p=citadel.git When generating an RSS feed for a Blog room, omit comments; feed items are top level posts only. --- diff --git a/webcit/feed_generator.c b/webcit/feed_generator.c index 648309cc4..8aa3f0912 100644 --- a/webcit/feed_generator.c +++ b/webcit/feed_generator.c @@ -37,8 +37,7 @@ void feed_rss_one_message(long msgnum) { StrBuf *Line = NewStrBufPlain(NULL, 1024); char buf[1024]; - /* FIXME if this is a blog room we only want to include top-level messages */ - + /* Phase 1: read the message into memory */ serv_printf("MSG4 %ld", msgnum); serv_getln(buf, sizeof buf); if (buf[0] != '1') return; @@ -47,64 +46,80 @@ void feed_rss_one_message(long msgnum) { StrBufAppendPrintf(ServerResponse, "%s\n", buf); } - wc_printf(""); - wc_printf("%s/readfwd?go=", ChrPtr(site_prefix)); - urlescputs(ChrPtr(WC->CurRoom.name)); - wc_printf("?start_reading_at=%ld", msgnum); - + /* Phase 2: help SkyNet become self-aware */ + BufPtr = NULL; while (StrBufSipLine(Line, ServerResponse, &BufPtr), ((BufPtr!=StrBufNOTNULL)&&(BufPtr!=NULL)) ) { - safestrncpy(buf, ChrPtr(Line), sizeof buf); - if (in_body) { - if (in_messagetext) { - StrBufAppendBufPlain(messagetext, buf, -1, 0); - StrBufAppendBufPlain(messagetext, HKEY("\r\n"), 0); - } - else if (IsEmptyStr(buf)) { - in_messagetext = 1; - } - } - else if (!strncasecmp(buf, "subj=", 5)) { - wc_printf(""); - escputs(&buf[5]); - wc_printf(""); - ++found_title; - } - else if (!strncasecmp(buf, "exti=", 5)) { - wc_printf(""); - escputs(&buf[5]); - wc_printf(""); - ++found_guid; - } - else if (!strncasecmp(buf, "time=", 5)) { - http_datestring(pubdate, sizeof pubdate, atol(&buf[5])); - wc_printf("%s", pubdate); - } - else if (!strncasecmp(buf, "wefw=", 5)) { + if (StrLength(Line) == 0) ++in_body; + if ((StrLength(Line) > 5) && (!strncasecmp(ChrPtr(Line), "wefw=", 5))) { is_top_level_post = 0; /* presence of references means it's a reply/comment */ } - else if (!strncasecmp(buf, "text", 4)) { - if (!found_title) { - wc_printf("Message #%ld", msgnum); + } + + /* + * Phase 3: output the message in RSS form + * (suppress replies [comments] if this is a blog room) + */ + if ( (WC->CurRoom.view != VIEW_BLOG) || (is_top_level_post == 1) ) { + wc_printf(""); + wc_printf("%s/readfwd?go=", ChrPtr(site_prefix)); + urlescputs(ChrPtr(WC->CurRoom.name)); + wc_printf("?start_reading_at=%ld", msgnum); + + BufPtr = NULL; + in_body = 0; + in_messagetext = 0; + while (StrBufSipLine(Line, ServerResponse, &BufPtr), ((BufPtr!=StrBufNOTNULL)&&(BufPtr!=NULL)) ) { + safestrncpy(buf, ChrPtr(Line), sizeof buf); + if (in_body) { + if (in_messagetext) { + StrBufAppendBufPlain(messagetext, buf, -1, 0); + StrBufAppendBufPlain(messagetext, HKEY("\r\n"), 0); + } + else if (IsEmptyStr(buf)) { + in_messagetext = 1; + } + } + else if (!strncasecmp(buf, "subj=", 5)) { + wc_printf(""); + escputs(&buf[5]); + wc_printf(""); + ++found_title; + } + else if (!strncasecmp(buf, "exti=", 5)) { + wc_printf(""); + escputs(&buf[5]); + wc_printf(""); + ++found_guid; + } + else if (!strncasecmp(buf, "time=", 5)) { + http_datestring(pubdate, sizeof pubdate, atol(&buf[5])); + wc_printf("%s", pubdate); } - if (!found_guid) { - wc_printf("%ld@%s", - msgnum, - ChrPtr(WC->serv_info->serv_humannode) - ); + else if (!strncasecmp(buf, "text", 4)) { + if (!found_title) { + wc_printf("Message #%ld", msgnum); + } + if (!found_guid) { + wc_printf("%ld@%s", + msgnum, + ChrPtr(WC->serv_info->serv_humannode) + ); + } + wc_printf(""); + in_body = 1; + messagetext = NewStrBuf(); } - wc_printf(""); - in_body = 1; - messagetext = NewStrBuf(); } - } + + if (in_body) { + cdataout((char*)ChrPtr(messagetext)); + FreeStrBuf(&messagetext); + wc_printf(""); + } - if (in_body) { - cdataout((char*)ChrPtr(messagetext)); - FreeStrBuf(&messagetext); - wc_printf(""); + wc_printf(""); } - wc_printf(""); FreeStrBuf(&Line); FreeStrBuf(&ServerResponse); return;