Template the last bits of the blog view.
authorWilfried Goesgens <willi@arangodb.com>
Sat, 12 Dec 2015 18:58:45 +0000 (19:58 +0100)
committerWilfried Goesgens <willi@arangodb.com>
Sat, 12 Dec 2015 18:58:45 +0000 (19:58 +0100)
webcit/blogview_renderer.c
webcit/sitemap.c
webcit/static/t/view_blog/post_start.hml [new file with mode: 0644]
webcit/static/t/view_blog/post_stop.html [new file with mode: 0644]
webcit/static/t/view_blog/show_commentlink.html [new file with mode: 0644]
webcit/static/t/view_blog/show_no_comments.html [new file with mode: 0644]
webcit/static/t/view_blog/sitemap.xml [new file with mode: 0644]
webcit/webcit.h

index 9432181e75d93746d53364cd486e1de0a692c27d..0a0510a295af2128adbfdfdc070e5115f4618fd3 100644 (file)
 #include "webserver.h"
 #include "dav.h"
 
+CtxType CTX_BLOGPOST = CTX_NONE;
 
 typedef struct __BLOG {
-       HashList *BLOG;
+       HashList *BLOGPOSTS;
        long p;
        int gotonext;
        StrBuf *Charset;
        StrBuf *Buf;
 } BLOG;
 
+/* 
+ * Array type for a blog post.  The first message is the post; the rest are comments
+ */
+typedef struct _blogpost {
+       int top_level_id;
+       long *msgs;             /* Array of msgnums for messages we are displaying */
+       int num_msgs;           /* Number of msgnums stored in 'msgs' */
+       int alloc_msgs;         /* Currently allocated size of array */
+       int unread_oments;
+}blogpost;
+
+
+/*
+ * XML sitemap generator -- go through the message list for a Blog room
+ */
+void sitemap_do_blog(void) {
+       wcsession *WCC = WC;
+       blogpost oneBP;
+       int num_msgs = 0;
+       int i;
+       SharedMessageStatus Stat;
+       message_summary *Msg = NULL;
+       StrBuf *Buf = NewStrBuf();
+       StrBuf *FoundCharset = NewStrBuf();
+       WCTemplputParams SubTP;
+
+       memset(&Stat, 0, sizeof Stat);
+       memset(&oneBP, 0, sizeof(blogpost));
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+       StackContext(NULL, &SubTP, &oneBP, CTX_BLOGPOST, 0, NULL);
+
+       Stat.maxload = INT_MAX;
+       Stat.lowest_found = (-1);
+       Stat.highest_found = (-1);
+       num_msgs = load_msg_ptrs("MSGS ALL", NULL, &Stat, NULL);
+       if (num_msgs < 1) return;
+
+       for (i=0; i<num_msgs; ++i) {
+               Msg = GetMessagePtrAt(i, WCC->summ);
+               if (Msg != NULL) {
+                       ReadOneMessageSummary(Msg, FoundCharset, Buf);
+                       /* Show only top level posts, not comments */
+                       if ((Msg->reply_inreplyto_hash != 0) && (Msg->reply_references_hash == 0)) {
+                               oneBP.top_level_id = Msg->reply_inreplyto_hash;
+                               DoTemplate(HKEY("view_blog_sitemap"), WCC->WBuf, &SubTP);
+                       }
+               }
+       }
+       UnStackContext(&SubTP);
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&FoundCharset);
+}
+
+
 
 /*
  * Generate a permalink for a post
  * (Call with NULL arguments to make this function wcprintf() the permalink
  * instead of writing it to the template)
  */
-void tmplput_blog_permalink(StrBuf *Target, WCTemplputParams *TP) {
-       StrBuf *buf = NewStrBufPlain(HKEY("/readfwd?go="));
-       StrBufUrlescAppend(buf, WC->CurRoom.name, 0);
-       StrBufAppendPrintf(buf, "?p=%d", WC->bptlid);
-       StrBufAppendTemplate(Target, TP, buf, 0);
-       FreeStrBuf(&buf);
+void tmplput_blog_toplevel_id(StrBuf *Target, WCTemplputParams *TP) {
+       blogpost *bp = (blogpost*) CTX(CTX_BLOGPOST);
+       char buf[SIZ];
+       snprintf(buf, SIZ, "%d", bp->top_level_id);
+       StrBufAppendTemplateStr(Target, TP, buf, 0);
+}
+
+void tmplput_blog_comment_count(StrBuf *Target, WCTemplputParams *TP) {
+       blogpost *bp = (blogpost*) CTX(CTX_BLOGPOST);
+       char buf[SIZ];
+       snprintf(buf, SIZ, "%d", bp->num_msgs -1);
+       StrBufAppendTemplateStr(Target, TP, buf, 0);
+}
+void tmplput_blog_comment_unread_count(StrBuf *Target, WCTemplputParams *TP) {
+       blogpost *bp = (blogpost*) CTX(CTX_BLOGPOST);
+       char buf[SIZ];
+       snprintf(buf, SIZ, "%d", bp->unread_oments);
+       StrBufAppendTemplateStr(Target, TP, buf, 0);
 }
 
 
+
 /*
  * Render a single blog post and (optionally) its comments
  */
-void blogpost_render(struct blogpost *bp, int with_comments)
+void blogpost_render(blogpost *bp, int with_comments)
 {
+       wcsession *WCC = WC;
+       WCTemplputParams SubTP;
        const StrBuf *Mime;
        int i;
 
-       WC->bptlid = bp->top_level_id;  /* This is used in templates; do not remove it */
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+       StackContext(NULL, &SubTP, bp, CTX_BLOGPOST, 0, NULL);
 
        /* Always show the top level post, unless we somehow ended up with an empty list */
        if (bp->num_msgs > 0) {
@@ -57,37 +128,26 @@ void blogpost_render(struct blogpost *bp, int with_comments)
 
        if (with_comments) {
                /* Show any existing comments, then offer the comment box */
-               wc_printf("<a class=\"blog_show_comments_link\" name=\"comments\"></a>\n");
-               wc_printf(_("%d comments"), bp->num_msgs - 1);
-               wc_printf(" | <a class=\"blog_permalink_link\" href=\"");
-               tmplput_blog_permalink(NULL, NULL);
-               wc_printf("\">%s</a>", _("permalink"));
-               wc_printf("</div>\n");
+               DoTemplate(HKEY("view_blog_show_commentlink"), WCC->WBuf, &SubTP);
+
                for (i=1; i<bp->num_msgs; ++i) {
                        read_message(WC->WBuf, HKEY("view_blog_comment"), bp->msgs[i], NULL, &Mime);
                }
-               do_template("view_blog_comment_box");
+               DoTemplate(HKEY("view_blog_comment_box"), WCC->WBuf, &SubTP);
        }
 
        else {
                /* Show only the number of comments */
-               wc_printf("<a class=\"blog_show_comments_link\" href=\"readfwd?p=%d?go=", bp->top_level_id);
-               urlescputs(ChrPtr(WC->CurRoom.name));
-               wc_printf("#comments\">");
-               wc_printf(_("%d comments"), bp->num_msgs - 1);
-               wc_printf(" %d %s", bp->unread_oments, _("new"));
-               wc_printf("</a> | <a class=\"blog_permalink_link\" href=\"");
-               tmplput_blog_permalink(NULL, NULL);
-               wc_printf("\">%s</a>", _("permalink"));
-               wc_printf("<hr>\n</div>\n");
+               DoTemplate(HKEY("view_blog_show_no_comments"), WCC->WBuf, &SubTP);
        }
+       UnStackContext(&SubTP);
 }
 
 
 /*
- * Destructor for "struct blogpost"
+ * Destructor for "blogpost"
  */
-void blogpost_destroy(struct blogpost *bp) {
+void blogpost_destroy(blogpost *bp) {
        if (bp->alloc_msgs > 0) {
                free(bp->msgs);
        }
@@ -107,7 +167,7 @@ int blogview_GetParamsGetServerCall(SharedMessageStatus *Stat,
                                    long flen)
 {
        BLOG *BL = (BLOG*) malloc(sizeof(BLOG)); 
-       BL->BLOG = NewHash(1, lFlathash);
+       BL->BLOGPOSTS = NewHash(1, lFlathash);
        
        /* are we looking for a specific post? */
        BL->p = lbstr("p");
@@ -139,7 +199,7 @@ int blogview_LoadMsgFromServer(SharedMessageStatus *Stat,
                              int i)
 {
        BLOG *BL = (BLOG*) *ViewSpecific;
-       struct blogpost *bp = NULL;
+       blogpost *bp = NULL;
 
        ReadOneMessageSummary(Msg, BL->Charset, BL->Buf);
 
@@ -156,25 +216,25 @@ int blogview_LoadMsgFromServer(SharedMessageStatus *Stat,
         * Add our little bundle of blogworthy wonderfulness to the hash table
         */
        if (Msg->reply_references_hash == 0) {
-               bp = malloc(sizeof(struct blogpost));
+               bp = malloc(sizeof(blogpost));
                if (!bp) return(200);
-               memset(bp, 0, sizeof (struct blogpost));
+               memset(bp, 0, sizeof (blogpost));
                bp->top_level_id = Msg->reply_inreplyto_hash;
-               Put(BL->BLOG,
+               Put(BL->BLOGPOSTS,
                    (const char *)&Msg->reply_inreplyto_hash,
                    sizeof(Msg->reply_inreplyto_hash),
                    bp,
                    (DeleteHashDataFunc)blogpost_destroy);
        }
        else {
-               GetHash(BL->BLOG,
+               GetHash(BL->BLOGPOSTS,
                        (const char *)&Msg->reply_references_hash,
                        sizeof(Msg->reply_references_hash),
                        (void *)&bp);
        }
 
        /*
-        * Now we have a 'struct blogpost' to which we can add a message.  It's either the
+        * Now we have a 'blogpost' to which we can add a message.  It's either the
         * blog post itself or a comment attached to it; either way, the code is the same from
         * this point onward.
         */
@@ -208,8 +268,8 @@ int blogview_LoadMsgFromServer(SharedMessageStatus *Stat,
  * With big thanks to whoever wrote http://www.c.happycodings.com/Sorting_Searching/code14.html
  */
 static int blogview_sortfunc(const void *a, const void *b) { 
-       struct blogpost * const *one = a;
-       struct blogpost * const *two = b;
+       blogpost * const *one = a;
+       blogpost * const *two = b;
 
        if ( (*one)->msgs[0] > (*two)->msgs[0] ) return(-1);
        if ( (*one)->msgs[0] < (*two)->msgs[0] ) return(+1);
@@ -223,18 +283,24 @@ static int blogview_sortfunc(const void *a, const void *b) {
  */
 int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
 {
+       wcsession *WCC = WC;
        BLOG *BL = (BLOG*) *ViewSpecific;
        HashPos *it;
        const char *Key;
        void *Data;
        long len;
        int i;
-       struct blogpost **blogposts = NULL;
+       blogpost **blogposts = NULL;
        int num_blogposts = 0;
        int num_blogposts_alloc = 0;
        int with_comments = 0;
        int firstp = 0;
        int maxp = 0;
+       WCTemplputParams SubTP;
+       blogpost oneBP;
+
+        memset(&SubTP, 0, sizeof(WCTemplputParams));    
+       memset(&oneBP, 0, sizeof(blogpost));
 
        /* Comments are shown if we are only viewing a single blog post */
        with_comments = (BL->p != 0);
@@ -242,18 +308,19 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
        firstp = ibstr("firstp");   /* start reading at... */
        maxp   = ibstr("maxp");     /* max posts to show... */
        if (maxp < 1) maxp = 5;     /* default; move somewhere else? */
+       putlbstr("maxp", maxp);
 
-       it = GetNewHashPos(BL->BLOG, 0);
+       it = GetNewHashPos(BL->BLOGPOSTS, 0);
 
        if ((BL->gotonext) && (BL->p == 0)) {
                /* did we come here via gotonext? lets find out whether
                 * this blog has just one blogpost with new comments just display 
                 * this one.
                 */
-               struct blogpost *unread_bp = NULL;
+               blogpost *unread_bp = NULL;
                int unread_count = 0;
-               while (GetNextHashPos(BL->BLOG, it, &len, &Key, &Data)) {
-                       struct blogpost *one_bp = (struct blogpost *) Data;
+               while (GetNextHashPos(BL->BLOGPOSTS, it, &len, &Key, &Data)) {
+                       blogpost *one_bp = (blogpost *) Data;
                        if (one_bp->unread_oments > 0) {
                                unread_bp = one_bp;
                                unread_count++;
@@ -266,11 +333,11 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
                        return 0;
                }
 
-               RewindHashPos(BL->BLOG, it, 0);
+               RewindHashPos(BL->BLOGPOSTS, it, 0);
        }
 
        /* Iterate through the hash list and copy the data pointers into an array */
-       while (GetNextHashPos(BL->BLOG, it, &len, &Key, &Data)) {
+       while (GetNextHashPos(BL->BLOGPOSTS, it, &len, &Key, &Data)) {
                if (num_blogposts >= num_blogposts_alloc) {
                        if (num_blogposts_alloc == 0) {
                                num_blogposts_alloc = 100;
@@ -278,9 +345,9 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
                        else {
                                num_blogposts_alloc *= 2;
                        }
-                       blogposts = realloc(blogposts, (num_blogposts_alloc * sizeof (struct blogpost *)));
+                       blogposts = realloc(blogposts, (num_blogposts_alloc * sizeof (blogpost *)));
                }
-               blogposts[num_blogposts++] = (struct blogpost *) Data;
+               blogposts[num_blogposts++] = (blogpost *) Data;
        }
        DeleteHashPos(&it);
 
@@ -306,19 +373,18 @@ int blogview_render(SharedMessageStatus *Stat, void **ViewSpecific, long oper)
                        if ((i > 0) && (i == start_here)) {
                                int j = i - maxp;
                                if (j < 0) j = 0;
-                               wc_printf("<div class=\"newer_blog_posts\"><a href=\"readfwd?go=");
-                               urlescputs(ChrPtr(WC->CurRoom.name));
-                               wc_printf("?firstp=%d?maxp=%d\">", blogposts[j]->top_level_id, maxp);
-                               wc_printf("%s →</a></div>\n", _("Newer posts"));
+
+                               StackContext(NULL, &SubTP, &blogposts[j], CTX_BLOGPOST, 0, NULL);
+                               DoTemplate(HKEY("view_blog_post_start"), WCC->WBuf, &SubTP);
+                               UnStackContext(&SubTP);
                        }
                        if (i < (start_here + maxp)) {
                                blogpost_render(blogposts[i], with_comments);
                        }
                        else if (i == (start_here + maxp)) {
-                               wc_printf("<div class=\"older_blog_posts\"><a href=\"readfwd?go=");
-                               urlescputs(ChrPtr(WC->CurRoom.name));
-                               wc_printf("?firstp=%d?maxp=%d\">", blogposts[i]->top_level_id, maxp);
-                               wc_printf("← %s</a></div>\n", _("Older posts"));
+                               StackContext(NULL, &SubTP, &blogposts[i], CTX_BLOGPOST, 0, NULL);
+                               DoTemplate(HKEY("view_blog_post_stop"), WCC->WBuf, &SubTP);
+                               UnStackContext(&SubTP);
                        }
                }
 
@@ -338,7 +404,7 @@ int blogview_Cleanup(void **ViewSpecific)
 
        FreeStrBuf(&BL->Buf);
        FreeStrBuf(&BL->Charset);
-       DeleteHash(&BL->BLOG);
+       DeleteHash(&BL->BLOGPOSTS);
        free(BL);
        wDumpContent(1);
        return 0;
@@ -349,6 +415,8 @@ void
 InitModule_BLOGVIEWRENDERERS
 (void)
 {
+       RegisterCTX(CTX_BLOGPOST);
+
        RegisterReadLoopHandlerset(
                VIEW_BLOG,
                blogview_GetParamsGetServerCall,
@@ -359,5 +427,8 @@ InitModule_BLOGVIEWRENDERERS
                blogview_render,
                blogview_Cleanup
        );
-       RegisterNamespace("BLOG:PERMALINK", 0, 1, tmplput_blog_permalink, NULL, CTX_NONE);
+
+       RegisterNamespace("BLOG:TOPLEVEL:MSGID", 0, 0, tmplput_blog_toplevel_id, NULL, CTX_BLOGPOST);
+       RegisterNamespace("BLOG:COMMENTS:COUNT", 0, 0, tmplput_blog_comment_count, NULL, CTX_BLOGPOST);
+       RegisterNamespace("BLOG:COMMENTS:UNREAD:COUNT", 0, 0, tmplput_blog_comment_unread_count, NULL, CTX_BLOGPOST);
 }
index 20dace9577e0fdfd7d21c4a310b90df3e0a1b151..8c3ee463e87110632918a1f533c4367a53934e55 100644 (file)
@@ -46,43 +46,6 @@ void sitemap_do_bbs(void) {
 }
 
 
-/*
- * XML sitemap generator -- go through the message list for a Blog room
- */
-void sitemap_do_blog(void) {
-       wcsession *WCC = WC;
-       int num_msgs = 0;
-       int i;
-       SharedMessageStatus Stat;
-       message_summary *Msg = NULL;
-       StrBuf *Buf = NewStrBuf();
-       StrBuf *FoundCharset = NewStrBuf();
-
-       memset(&Stat, 0, sizeof Stat);
-       Stat.maxload = INT_MAX;
-       Stat.lowest_found = (-1);
-       Stat.highest_found = (-1);
-       num_msgs = load_msg_ptrs("MSGS ALL", NULL, &Stat, NULL);
-       if (num_msgs < 1) return;
-
-       for (i=0; i<num_msgs; ++i) {
-               Msg = GetMessagePtrAt(i, WCC->summ);
-               if (Msg != NULL) {
-                       ReadOneMessageSummary(Msg, FoundCharset, Buf);
-                       /* Show only top level posts, not comments */
-                       if ((Msg->reply_inreplyto_hash != 0) && (Msg->reply_references_hash == 0)) {
-                               WCC->bptlid = Msg->reply_inreplyto_hash;
-                               wc_printf("<url><loc>%s", ChrPtr(site_prefix));
-                               tmplput_blog_permalink(NULL, NULL);
-                               wc_printf("</loc></url>\r\n");
-                       }
-               }
-       }
-       FreeStrBuf(&Buf);
-       FreeStrBuf(&FoundCharset);
-}
-
-
 /*
  * XML sitemap generator -- go through the message list for a wiki room
  */
@@ -152,6 +115,7 @@ struct sitemap_room_list *sitemap_load_roomlist(void) {
        return(roomlist);
 }
 
+extern void sitemap_do_blog(void);
 
 /*
  * Entry point for RSS feed generator
diff --git a/webcit/static/t/view_blog/post_start.hml b/webcit/static/t/view_blog/post_start.hml
new file mode 100644 (file)
index 0000000..ac59da3
--- /dev/null
@@ -0,0 +1 @@
+<div class="newer_blog_posts"><a href='readfwd?go=<?THISROOM:NAME("U")>?firstp=<?BLOG:TOPLEVEL:MSGID()>?maxp=<?BSTR("maxp")>'><?_("Newer posts")> →</a></div>
diff --git a/webcit/static/t/view_blog/post_stop.html b/webcit/static/t/view_blog/post_stop.html
new file mode 100644 (file)
index 0000000..f48657e
--- /dev/null
@@ -0,0 +1 @@
+<div class="older_blog_posts"><a href='readfwd?go=<?THISROOM:NAME("U")>?firstp=<?BLOG:TOPLEVEL:MSGID()>?maxp=<?BSTR("maxp")>'>← <?_("Older posts")></a></div>
diff --git a/webcit/static/t/view_blog/show_commentlink.html b/webcit/static/t/view_blog/show_commentlink.html
new file mode 100644 (file)
index 0000000..3b83ca4
--- /dev/null
@@ -0,0 +1 @@
+<a class="blog_show_comments_link" name="comments"></a> <?BLOG:COMMENTS:COUNT()> <?_("comments")> | <a class="blog_permalink_link" href='/readfwd?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()>'><?_("permalink")></div>
diff --git a/webcit/static/t/view_blog/show_no_comments.html b/webcit/static/t/view_blog/show_no_comments.html
new file mode 100644 (file)
index 0000000..3f69031
--- /dev/null
@@ -0,0 +1,3 @@
+<a class="blog_show_comments_link" href='readfwd?p=<?THISROOM:NAME("U")>?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()>#comments'> <?BLOG:COMMENTS:COUNT()> <?_("comments")>
+<?BLOG:COMMENTS:UNREAD:COUNT()> <?_("new")></a> | 
+<a class="blog_permalink_link" href='/readfwd?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()>'><?_("permalink")></div>
diff --git a/webcit/static/t/view_blog/sitemap.xml b/webcit/static/t/view_blog/sitemap.xml
new file mode 100644 (file)
index 0000000..ebd91fb
--- /dev/null
@@ -0,0 +1 @@
+<url><loc><?SERV:SITE:PREFIX("X")>/readfwd?go=<?THISROOM:NAME("U")>?p=<?BLOG:TOPLEVEL:MSGID()></loc></url>
index ab448012a44782b82f2f3220e75b1dd6fa0e4141..624b1189383c2345f6c89a085cf0adcf30b9abba 100644 (file)
@@ -510,8 +510,6 @@ struct wcsession {
        HashList *InetCfg;                      /* Our inet server config for editing */
        ExpirePolicy Policy[maxpolicy];
 
-/* used by the blog viewer */
-       int bptlid;                             /* hash of thread currently being rendered */
 };
 
 
@@ -734,29 +732,6 @@ void http_datestring(char *buf, size_t n, time_t xtime);
 extern int time_to_die;                        /* Nonzero if server is shutting down */
 extern int DisableGzip;
 
-/* 
- * Array type for a blog post.  The first message is the post; the rest are comments
- */
-struct blogpost {
-       int top_level_id;
-       long *msgs;             /* Array of msgnums for messages we are displaying */
-       int num_msgs;           /* Number of msgnums stored in 'msgs' */
-       int alloc_msgs;         /* Currently allocated size of array */
-       int unread_oments;
-};
-
-
-/*
- * Data which gets returned from a call to blogview_learn_thread_references()
- */
-struct bltr {
-       int id;
-       int refs;
-};
-
-
-struct bltr blogview_learn_thread_references(long msgnum);
-void tmplput_blog_permalink(StrBuf *Target, WCTemplputParams *TP);
 void display_summary_page(void);
 
 HashList *GetValidDomainNames(StrBuf *Target, WCTemplputParams *TP);