| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							|  |  |  | USING: kernel accessors sequences sorting math.order math.parser | 
					
						
							| 
									
										
										
										
											2008-06-16 04:34:17 -04:00
										 |  |  | urls validators db db.types db.tuples calendar present namespaces | 
					
						
							| 
									
										
										
										
											2008-06-15 03:38:12 -04:00
										 |  |  | html.forms | 
					
						
							|  |  |  | html.components | 
					
						
							|  |  |  | http.server.dispatchers | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | furnace | 
					
						
							|  |  |  | furnace.actions | 
					
						
							| 
									
										
										
										
											2008-06-17 01:10:46 -04:00
										 |  |  | furnace.redirection | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | furnace.auth | 
					
						
							|  |  |  | furnace.auth.login | 
					
						
							|  |  |  | furnace.boilerplate | 
					
						
							|  |  |  | furnace.syndication ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | IN: webapps.blogs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: blogs < dispatcher ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | SYMBOL: can-administer-blogs? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | can-administer-blogs? define-capability | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | : view-post-url ( id -- url )
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |     present "$blogs/post/" prepend >url ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : view-comment-url ( parent id -- url )
 | 
					
						
							|  |  |  |     [ view-post-url ] dip >>anchor ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : list-posts-url ( -- url )
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |     "$blogs/" >url ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | : posts-by-url ( author -- url )
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |     "$blogs/by/" prepend >url ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: entity id author date content ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: entity-url ( entity -- url )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: entity feed-entry-url entity-url ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | entity f { | 
					
						
							|  |  |  |     { "id" "ID" INTEGER +db-assigned-id+ } | 
					
						
							|  |  |  |     { "author" "AUTHOR" { VARCHAR 256 } +not-null+ } ! uid | 
					
						
							|  |  |  |     { "date" "DATE" TIMESTAMP +not-null+ } | 
					
						
							|  |  |  |     { "content" "CONTENT" TEXT +not-null+ } | 
					
						
							|  |  |  | } define-persistent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: entity feed-entry-date date>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: post < entity title comments ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: post feed-entry-title | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |     [ author>> ] [ title>> ] bi ": " swap 3append ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: post entity-url | 
					
						
							|  |  |  |     id>> view-post-url ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \ post "BLOG_POSTS" { | 
					
						
							|  |  |  |     { "title" "TITLE" { VARCHAR 256 } +not-null+ } | 
					
						
							|  |  |  | } define-persistent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <post> ( id -- post ) \ post new swap >>id ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: comment < entity parent ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | comment "COMMENTS" { | 
					
						
							|  |  |  |     { "parent" "PARENT" INTEGER +not-null+ } ! post id | 
					
						
							|  |  |  | } define-persistent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: comment feed-entry-title | 
					
						
							|  |  |  |     author>> "Comment by " prepend ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: comment entity-url | 
					
						
							|  |  |  |     [ parent>> ] [ id>> ] bi view-comment-url ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <comment> ( parent id -- post )
 | 
					
						
							|  |  |  |     comment new
 | 
					
						
							|  |  |  |         swap >>id | 
					
						
							|  |  |  |         swap >>parent ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : post ( id -- post )
 | 
					
						
							|  |  |  |     [ <post> select-tuple ] [ f <comment> select-tuples ] bi
 | 
					
						
							|  |  |  |     >>comments ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : reverse-chronological-order ( seq -- sorted )
 | 
					
						
							|  |  |  |     [ [ date>> ] compare invert-comparison ] sort ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : validate-author ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |     { { "author" [ v-username ] } } validate-params ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : list-posts ( -- posts )
 | 
					
						
							|  |  |  |     f <post> "author" value >>author | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |     select-tuples [ dup id>> f <comment> f count-tuples >>comments ] map
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |     reverse-chronological-order ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <list-posts-action> ( -- action )
 | 
					
						
							|  |  |  |     <page-action> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         [ list-posts "posts" set-value ] >>init | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         { blogs "list-posts" } >>template ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <list-posts-feed-action> ( -- action )
 | 
					
						
							|  |  |  |     <feed-action> | 
					
						
							|  |  |  |         [ "Recent Posts" ] >>title | 
					
						
							|  |  |  |         [ list-posts ] >>entries | 
					
						
							|  |  |  |         [ list-posts-url ] >>url ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | : <posts-by-action> ( -- action )
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |     <page-action> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         "author" >>rest | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ | 
					
						
							|  |  |  |             validate-author | 
					
						
							|  |  |  |             list-posts "posts" set-value | 
					
						
							|  |  |  |         ] >>init | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         { blogs "posts-by" } >>template ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <posts-by-feed-action> ( -- action )
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |     <feed-action> | 
					
						
							| 
									
										
										
										
											2008-06-14 01:44:23 -04:00
										 |  |  |         "author" >>rest | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ validate-author ] >>init | 
					
						
							|  |  |  |         [ "Recent Posts by " "author" value append ] >>title | 
					
						
							|  |  |  |         [ list-posts ] >>entries | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         [ "author" value posts-by-url ] >>url ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <post-feed-action> ( -- action )
 | 
					
						
							|  |  |  |     <feed-action> | 
					
						
							| 
									
										
										
										
											2008-06-14 01:44:23 -04:00
										 |  |  |         "id" >>rest | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ validate-integer-id "id" value post "post" set-value ] >>init | 
					
						
							|  |  |  |         [ "post" value feed-entry-title ] >>title | 
					
						
							|  |  |  |         [ "post" value entity-url ] >>url | 
					
						
							|  |  |  |         [ "post" value comments>> ] >>entries ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <view-post-action> ( -- action )
 | 
					
						
							|  |  |  |     <page-action> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         "id" >>rest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             validate-integer-id | 
					
						
							|  |  |  |             "id" value post from-object | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             "id" value | 
					
						
							|  |  |  |             "new-comment" [ | 
					
						
							|  |  |  |                 "parent" set-value | 
					
						
							| 
									
										
										
										
											2008-06-15 03:38:12 -04:00
										 |  |  |             ] nest-form | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         ] >>init | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         { blogs "view-post" } >>template ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : validate-post ( -- )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { "title" [ v-one-line ] } | 
					
						
							|  |  |  |         { "content" [ v-required ] } | 
					
						
							|  |  |  |     } validate-params ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <new-post-action> ( -- action )
 | 
					
						
							|  |  |  |     <page-action> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ | 
					
						
							|  |  |  |             validate-post | 
					
						
							| 
									
										
										
										
											2008-06-16 04:34:17 -04:00
										 |  |  |             logged-in-user get username>> "author" set-value | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         ] >>validate | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             f <post> | 
					
						
							| 
									
										
										
										
											2008-06-15 03:38:12 -04:00
										 |  |  |                 dup { "title" "content" } to-object | 
					
						
							| 
									
										
										
										
											2008-06-16 04:34:17 -04:00
										 |  |  |                 logged-in-user get username>> >>author | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |                 now >>date | 
					
						
							|  |  |  |             [ insert-tuple ] [ entity-url <redirect> ] bi
 | 
					
						
							|  |  |  |         ] >>submit | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         { blogs "new-post" } >>template | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      <protected> | 
					
						
							|  |  |  |         "make a new blog post" >>description ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : authorize-author ( author -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-16 04:34:17 -04:00
										 |  |  |     logged-in-user get username>> =
 | 
					
						
							|  |  |  |     can-administer-blogs? have-capability? or
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |     [ login-required ] unless ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : do-post-action ( -- )
 | 
					
						
							|  |  |  |     validate-integer-id | 
					
						
							|  |  |  |     "id" value <post> select-tuple from-object ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <edit-post-action> ( -- action )
 | 
					
						
							|  |  |  |     <page-action> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 19:54:50 -04:00
										 |  |  |         "id" >>rest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         [ do-post-action ] >>init | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         [ do-post-action validate-post ] >>validate | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ "author" value authorize-author ] >>authorize | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         [ | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |             "id" value <post> | 
					
						
							| 
									
										
										
										
											2008-06-15 03:38:12 -04:00
										 |  |  |             dup { "title" "author" "date" "content" } to-object | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |             [ update-tuple ] [ entity-url <redirect> ] bi
 | 
					
						
							|  |  |  |         ] >>submit | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         { blogs "edit-post" } >>template | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <protected> | 
					
						
							|  |  |  |         "edit a blog post" >>description ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : delete-post ( id -- )
 | 
					
						
							|  |  |  |     [ <post> delete-tuples ] [ f <comment> delete-tuples ] bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | : <delete-post-action> ( -- action )
 | 
					
						
							|  |  |  |     <action> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         [ do-post-action ] >>validate | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ "author" value authorize-author ] >>authorize | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |             [ "id" value delete-post ] with-transaction | 
					
						
							|  |  |  |             "author" value posts-by-url <redirect> | 
					
						
							|  |  |  |         ] >>submit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      <protected> | 
					
						
							|  |  |  |         "delete a blog post" >>description ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <delete-author-action> ( -- action )
 | 
					
						
							|  |  |  |     <action> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ validate-author ] >>validate | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ "author" value authorize-author ] >>authorize | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |             [ | 
					
						
							|  |  |  |                 f <post> "author" value >>author select-tuples [ id>> delete-post ] each
 | 
					
						
							|  |  |  |                 f f <comment> "author" value >>author delete-tuples | 
					
						
							|  |  |  |             ] with-transaction | 
					
						
							|  |  |  |             "author" value posts-by-url <redirect> | 
					
						
							|  |  |  |         ] >>submit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      <protected> | 
					
						
							|  |  |  |         "delete a blog post" >>description ;
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : validate-comment ( -- )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { "parent" [ v-integer ] } | 
					
						
							|  |  |  |         { "content" [ v-required ] } | 
					
						
							|  |  |  |     } validate-params ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <new-comment-action> ( -- action )
 | 
					
						
							|  |  |  |     <action> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             validate-comment | 
					
						
							| 
									
										
										
										
											2008-06-16 04:34:17 -04:00
										 |  |  |             logged-in-user get username>> "author" set-value | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         ] >>validate | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             "parent" value f <comment> | 
					
						
							|  |  |  |                 "content" value >>content | 
					
						
							| 
									
										
										
										
											2008-06-16 04:34:17 -04:00
										 |  |  |                 logged-in-user get username>> >>author | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |                 now >>date | 
					
						
							|  |  |  |             [ insert-tuple ] [ entity-url <redirect> ] bi
 | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         ] >>submit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      <protected> | 
					
						
							|  |  |  |         "make a comment" >>description ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | : <delete-comment-action> ( -- action )
 | 
					
						
							|  |  |  |     <action> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ | 
					
						
							|  |  |  |             validate-integer-id | 
					
						
							|  |  |  |             { { "parent" [ v-integer ] } } validate-params | 
					
						
							|  |  |  |         ] >>validate | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             "parent" value <post> select-tuple | 
					
						
							|  |  |  |             author>> authorize-author | 
					
						
							|  |  |  |         ] >>authorize | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         [ | 
					
						
							|  |  |  |             f "id" value <comment> delete-tuples | 
					
						
							|  |  |  |             "parent" value view-post-url <redirect> | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         ] >>submit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <protected> | 
					
						
							|  |  |  |             "delete a comment" >>description ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  | : <blogs> ( -- dispatcher )
 | 
					
						
							|  |  |  |     blogs new-dispatcher | 
					
						
							|  |  |  |         <list-posts-action> "" add-responder | 
					
						
							|  |  |  |         <list-posts-feed-action> "posts.atom" add-responder | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         <posts-by-action> "by" add-responder | 
					
						
							|  |  |  |         <posts-by-feed-action> "by.atom" add-responder | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |         <view-post-action> "post" add-responder | 
					
						
							|  |  |  |         <post-feed-action> "post.atom" add-responder | 
					
						
							| 
									
										
										
										
											2008-06-13 01:47:47 -04:00
										 |  |  |         <new-post-action> "new-post" add-responder | 
					
						
							|  |  |  |         <edit-post-action> "edit-post" add-responder | 
					
						
							|  |  |  |         <delete-post-action> "delete-post" add-responder | 
					
						
							|  |  |  |         <new-comment-action> "new-comment" add-responder | 
					
						
							|  |  |  |         <delete-comment-action> "delete-comment" add-responder | 
					
						
							| 
									
										
										
										
											2008-06-06 19:18:05 -04:00
										 |  |  |     <boilerplate> | 
					
						
							|  |  |  |         { blogs "blogs-common" } >>template ;
 |