]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/webapps/wiki/wiki.factor
Update wiki, pastebin, planet for new furnace.rss code
[factor.git] / extra / webapps / wiki / wiki.factor
index dd2e1291f95f5248e557da3c1a76343c6f3d634f..c7c43715a734aaa8e37671b81639fc822028f4c0 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel hashtables calendar
 namespaces splitting sequences sorting math.order
-html.components
+html.components rss
 http.server
 http.server.dispatchers
 furnace
@@ -10,10 +10,26 @@ furnace.actions
 furnace.auth
 furnace.auth.login
 furnace.boilerplate
+furnace.rss
 validators
 db.types db.tuples lcs farkup urls ;
 IN: webapps.wiki
 
+: title-url ( title action -- url )
+    "$wiki/" prepend >url swap "title" set-query-param ;
+
+: view-url ( title -- url ) "view" title-url ;
+
+: edit-url ( title -- url ) "edit" title-url ;
+
+: revisions-url ( title -- url ) "revisions" title-url ;
+
+: revision-url ( id -- url )
+    "$wiki/revision" >url swap "id" set-query-param ;
+
+: user-edits-url ( author -- url )
+    "$wiki/user-edits" >url swap "author" set-query-param ;
+
 TUPLE: wiki < dispatcher ;
 
 TUPLE: article title revision ;
@@ -39,6 +55,16 @@ revision "REVISIONS" {
     { "content" "CONTENT" TEXT +not-null+ }
 } define-persistent
 
+M: revision feed-entry-title
+    [ title>> ] [ drop " by " ] [ author>> ] tri 3append ;
+
+M: revision feed-entry-date date>> ;
+
+M: revision feed-entry-url id>> revision-url ;
+
+: reverse-chronological-order ( seq -- sorted )
+    [ [ date>> ] compare invert-comparison ] sort ;
+
 : <revision> ( id -- revision )
     revision new swap >>id ;
 
@@ -47,18 +73,16 @@ revision "REVISIONS" {
 : validate-title ( -- )
     { { "title" [ v-one-line ] } } validate-params ;
 
+: validate-author ( -- )
+    { { "author" [ v-username ] } } validate-params ;
+
 : <main-article-action> ( -- action )
     <action>
-        [
-            <url>
-                "$wiki/view" >>path
-                "Front Page" "title" set-query-param
-            <redirect>
-        ] >>display ;
+        [ "Front Page" view-url <redirect> ] >>display ;
 
 : <view-article-action> ( -- action )
     <action>
-        "title" >>rest-param
+        "title" >>rest
 
         [
             validate-title
@@ -70,17 +94,14 @@ revision "REVISIONS" {
                 revision>> <revision> select-tuple from-object
                 { wiki "view" } <chloe-content>
             ] [
-                <url>
-                    "$wiki/edit" >>path
-                    swap "title" set-query-param
-                <redirect>
+                edit-url <redirect>
             ] ?if
         ] >>display ;
 
 : <view-revision-action> ( -- action )
     <page-action>
         [
-            { { "id" [ v-integer ] } } validate-params
+            validate-integer-id
             "id" value <revision>
             select-tuple from-object
         ] >>init
@@ -117,53 +138,53 @@ revision "REVISIONS" {
                 now >>date
                 logged-in-user get username>> >>author
                 "content" value >>content
-            [ add-revision ]
-            [
-                <url>
-                    "$wiki/view" >>path
-                    swap title>> "title" set-query-param
-                <redirect>
-            ] bi
+            [ add-revision ] [ title>> view-url <redirect> ] bi
         ] >>submit ;
 
+: list-revisions ( -- seq )
+    f <revision> "title" value >>title select-tuples
+    reverse-chronological-order ;
+
 : <list-revisions-action> ( -- action )
     <page-action>
         [
             validate-title
-            f <revision> "title" value >>title select-tuples
-            [ [ date>> ] compare invert-comparison ] sort
-            "revisions" set-value
+            list-revisions "revisions" set-value
         ] >>init
-
         { wiki "revisions" } >>template ;
 
+: <list-revisions-feed-action> ( -- action )
+    <feed-action>
+        [ validate-title ] >>init
+        [ "Revisions of " "title" value append ] >>title
+        [ "title" value revisions-url ] >>url
+        [ list-revisions ] >>entries ;
+
 : <rollback-action> ( -- action )
     <action>
-        [
-            { { "id" [ v-integer ] } } validate-params
-        ] >>validate
-        
+        [ validate-integer-id ] >>validate
+
         [
             "id" value <revision> select-tuple clone f >>id
-            [ add-revision ]
-            [
-                <url>
-                    "$wiki/view" >>path
-                    swap title>> "title" set-query-param
-                <redirect>
-            ] bi
+            [ add-revision ] [ title>> view-url <redirect> ] bi
         ] >>submit ;
 
+: list-changes ( -- seq )
+    "id" value <revision> select-tuples
+    reverse-chronological-order ;
+
 : <list-changes-action> ( -- action )
     <page-action>
-        [
-            f <revision> select-tuples
-            [ [ date>> ] compare invert-comparison ] sort
-            "changes" set-value
-        ] >>init
+        [ list-changes "changes" set-value ] >>init
 
         { wiki "changes" } >>template ;
 
+: <list-changes-feed-action> ( -- action )
+    <feed-action>
+        [ URL" $wiki/changes" ] >>url
+        [ "All changes" ] >>title
+        [ list-changes ] >>entries ;
+
 : <delete-action> ( -- action )
     <action>
         [ validate-title ] >>validate
@@ -204,38 +225,50 @@ revision "REVISIONS" {
 
         { wiki "articles" } >>template ;
 
+: list-user-edits ( -- seq )
+    f <revision> "author" value >>author select-tuples
+    reverse-chronological-order ;
+
 : <user-edits-action> ( -- action )
     <page-action>
         [
-            { { "author" [ v-username ] } } validate-params
-            f <revision> "author" value >>author
-            select-tuples "user-edits" set-value
+            validate-author
+            list-user-edits "user-edits" set-value
         ] >>init
-
         { wiki "user-edits" } >>template ;
 
+: <user-edits-feed-action> ( -- action )
+    <feed-action>
+        [ validate-author ] >>init
+        [ "Edits by " "author" value append ] >>title
+        [ "author" value user-edits-url ] >>url
+        [ list-user-edits ] >>entries ;
+
 SYMBOL: can-delete-wiki-articles?
 
 can-delete-wiki-articles? define-capability
 
+: <article-boilerplate> ( responder -- responder' )
+    <boilerplate>
+        { wiki "page-common" } >>template ;
+
 : <wiki> ( -- dispatcher )
     wiki new-dispatcher
-        <dispatcher>
-            <main-article-action> "" add-responder
-            <view-article-action> "view" add-responder
-            <view-revision-action> "revision" add-responder
-            <list-revisions-action> "revisions" add-responder
-            <diff-action> "diff" add-responder
-            <edit-article-action> <protected>
-                "edit wiki articles" >>description
-                "edit" add-responder
-        <boilerplate>
-            { wiki "page-common" } >>template
-        >>default
+        <main-article-action> <article-boilerplate> "" add-responder
+        <view-article-action> <article-boilerplate> "view" add-responder
+        <view-revision-action> <article-boilerplate> "revision" add-responder
+        <list-revisions-action> <article-boilerplate> "revisions" add-responder
+        <list-revisions-feed-action> "revisions.atom" add-responder
+        <diff-action> <article-boilerplate> "diff" add-responder
+        <edit-article-action> <article-boilerplate> <protected>
+            "edit wiki articles" >>description
+            "edit" add-responder
         <rollback-action> "rollback" add-responder
         <user-edits-action> "user-edits" add-responder
         <list-articles-action> "articles" add-responder
         <list-changes-action> "changes" add-responder
+        <user-edits-feed-action> "user-edits.atom" add-responder
+        <list-changes-feed-action> "changes.atom" add-responder
         <delete-action> <protected>
             "delete wiki articles" >>description
             { can-delete-wiki-articles? } >>capabilities