From 6e89f7b085bd2ec63948296344ff7f89375169a3 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Tue, 22 Apr 2008 21:08:27 -0500 Subject: [PATCH] Working on planet factor rewrite --- extra/http/server/auth/login/login.factor | 2 +- .../server/boilerplate/boilerplate.factor | 2 +- .../http/server/components/components.factor | 29 +++++- extra/http/server/forms/forms.factor | 2 +- extra/http/server/server.factor | 29 +++--- .../http/server/templating/chloe/chloe.factor | 3 +- .../http/server/templating/fhtml/fhtml.factor | 2 +- .../http/server/templating/templating.factor | 17 +++- .../factor-website/factor-website.factor | 38 ++++++++ .../{planet => factor-website}/page.xml | 35 ++++--- extra/webapps/planet/admin.xml | 13 +++ extra/webapps/planet/entry.xml | 14 ++- extra/webapps/planet/planet.factor | 96 +++++++++++-------- extra/webapps/planet/planet.xml | 42 ++++---- extra/webapps/planet/postings.xml | 19 ++++ extra/webapps/todo/page.xml | 45 --------- extra/webapps/todo/todo.css | 16 ---- extra/webapps/todo/todo.factor | 34 +------ 18 files changed, 236 insertions(+), 202 deletions(-) create mode 100644 extra/webapps/factor-website/factor-website.factor rename extra/webapps/{planet => factor-website}/page.xml (89%) create mode 100644 extra/webapps/planet/admin.xml create mode 100644 extra/webapps/planet/postings.xml delete mode 100644 extra/webapps/todo/page.xml diff --git a/extra/http/server/auth/login/login.factor b/extra/http/server/auth/login/login.factor index b0cc0c21d1..7593f217f7 100755 --- a/extra/http/server/auth/login/login.factor +++ b/extra/http/server/auth/login/login.factor @@ -363,7 +363,7 @@ M: login call-responder ( path responder -- response ) : ( responder -- auth ) login new-dispatcher - swap >>default + swap >>default "login" add-responder "logout" add-responder no-users >>users ; diff --git a/extra/http/server/boilerplate/boilerplate.factor b/extra/http/server/boilerplate/boilerplate.factor index 6c62452ec2..eabcefeb7f 100644 --- a/extra/http/server/boilerplate/boilerplate.factor +++ b/extra/http/server/boilerplate/boilerplate.factor @@ -48,7 +48,7 @@ SYMBOL: next-template : call-next-template ( -- ) next-template get write ; -M: f call-template drop call-next-template ; +M: f call-template* drop call-next-template ; : with-boilerplate ( body template -- ) [ diff --git a/extra/http/server/components/components.factor b/extra/http/server/components/components.factor index bdcdd95c71..331231dfb3 100755 --- a/extra/http/server/components/components.factor +++ b/extra/http/server/components/components.factor @@ -280,6 +280,22 @@ TUPLE: date < string ; M: date component-string drop timestamp>string ; +! Link components + +GENERIC: link-title ( obj -- string ) +GENERIC: link-href ( obj -- url ) + +SINGLETON: link-renderer + +M: link-renderer render-view* + drop link-title write ; + +TUPLE: link < string ; + +: ( id -- component ) + link new-string + link-renderer >>renderer ; + ! List components SYMBOL: +plain+ SYMBOL: +ordered+ @@ -289,17 +305,20 @@ TUPLE: list-renderer component type ; C: list-renderer -: render-plain-list ( seq quot component -- ) - swap '[ , @ ] each ; inline +: render-plain-list ( seq component quot -- ) + '[ , component>> renderer>> @ ] each ; inline + +: render-li-list ( seq component quot -- ) + '[
  • @
  • ] render-plain-list ; inline : render-ordered-list ( seq quot component -- ) - swap
      '[
    1. , @
    2. ] each
    ; inline +
      render-li-list
    ; inline : render-unordered-list ( seq quot component -- ) - swap
      '[
    • , @
    • ] each
    ; inline +
      render-li-list
    ; inline : render-list ( value renderer quot -- ) - swap [ component>> ] [ type>> ] bi { + over type>> { { +plain+ [ render-plain-list ] } { +ordered+ [ render-ordered-list ] } { +unordered+ [ render-unordered-list ] } diff --git a/extra/http/server/forms/forms.factor b/extra/http/server/forms/forms.factor index f45bf6ec65..60f3da25b6 100644 --- a/extra/http/server/forms/forms.factor +++ b/extra/http/server/forms/forms.factor @@ -78,4 +78,4 @@ M: form render-view* dup view-template>> render-form ; M: form render-edit* - dup edit-template>> render-form ; + nip dup edit-template>> render-form ; diff --git a/extra/http/server/server.factor b/extra/http/server/server.factor index db03645a24..d3bd6c6bbe 100755 --- a/extra/http/server/server.factor +++ b/extra/http/server/server.factor @@ -160,23 +160,30 @@ drop SYMBOL: development-mode +: http-error. ( error -- ) + "Internal server error" [ + development-mode get [ + [ print-error nl :c ] with-html-stream + ] [ + 500 "Internal server error" + trivial-response-body + ] if + ] simple-page ; + : <500> ( error -- response ) 500 "Internal server error" - swap '[ - , "Internal server error" [ - development-mode get [ - [ print-error nl :c ] with-html-stream - ] [ - 500 "Internal server error" - trivial-response-body - ] if - ] simple-page - ] >>body ; + swap '[ , http-error. ] >>body ; : do-response ( response -- ) dup write-response request get method>> "HEAD" = - [ drop ] [ write-response-body ] if ; + [ drop ] [ + '[ + , write-response-body + ] [ + http-error. + ] recover + ] if ; LOG: httpd-hit NOTICE diff --git a/extra/http/server/templating/chloe/chloe.factor b/extra/http/server/templating/chloe/chloe.factor index 8142c5e3b7..685988dfaf 100644 --- a/extra/http/server/templating/chloe/chloe.factor +++ b/extra/http/server/templating/chloe/chloe.factor @@ -153,6 +153,7 @@ SYMBOL: tags { "form" [ form-tag ] } { "error" [ error-tag ] } { "if" [ if-tag ] } + { "comment" [ drop ] } { "call-next-template" [ drop call-next-template ] } [ "Unknown chloe tag: " swap append throw ] } case ; @@ -189,7 +190,7 @@ SYMBOL: tags ] if ] with-scope ; -M: chloe call-template +M: chloe call-template* path>> utf8 read-xml process-chloe ; INSTANCE: chloe template diff --git a/extra/http/server/templating/fhtml/fhtml.factor b/extra/http/server/templating/fhtml/fhtml.factor index 1cba4b9b2e..2cc053a0ca 100755 --- a/extra/http/server/templating/fhtml/fhtml.factor +++ b/extra/http/server/templating/fhtml/fhtml.factor @@ -76,7 +76,7 @@ TUPLE: fhtml path ; C: fhtml -M: fhtml call-template ( filename -- ) +M: fhtml call-template* ( filename -- ) '[ , path>> [ "quiet" on diff --git a/extra/http/server/templating/templating.factor b/extra/http/server/templating/templating.factor index f69dd9bfe0..610ec78fed 100644 --- a/extra/http/server/templating/templating.factor +++ b/extra/http/server/templating/templating.factor @@ -1,10 +1,21 @@ -USING: accessors kernel fry io.encodings.utf8 io.files -http http.server ; +USING: accessors kernel fry io io.encodings.utf8 io.files +http http.server debugger prettyprint continuations ; IN: http.server.templating MIXIN: template -GENERIC: call-template ( template -- ) +GENERIC: call-template* ( template -- ) + +ERROR: template-error template error ; + +M: template-error error. + "Error while processing template " write + [ template>> pprint ":" print nl ] + [ error>> error. ] + bi ; + +: call-template ( template -- ) + [ call-template* ] [ template-error ] recover ; M: template write-response-body* call-template ; diff --git a/extra/webapps/factor-website/factor-website.factor b/extra/webapps/factor-website/factor-website.factor new file mode 100644 index 0000000000..3483d4321e --- /dev/null +++ b/extra/webapps/factor-website/factor-website.factor @@ -0,0 +1,38 @@ +! Copyright (c) 2008 Slava Pestov +! See http://factorcode.org/license.txt for BSD license. +USING: accessors kernel sequences io.files io.sockets +db.sqlite smtp namespaces db +http.server.db +http.server.sessions +http.server.auth.login +http.server.auth.providers.db +http.server.sessions.storage.db +http.server.boilerplate +http.server.templating.chloe ; +IN: webapps.factor-website + +: factor-template ( path -- template ) + "resource:extra/webapps/factor-website/" swap ".xml" 3append ; + +: test-db "todo.db" resource-path sqlite-db ; + +: ( responder -- responder' ) + + users-in-db >>users + allow-registration + allow-password-recovery + allow-edit-profile + + "page" factor-template >>template + + sessions-in-db >>sessions + test-db ; + +: init-factor-website ( -- ) + "factorcode.org" 25 smtp-server set-global + "todo@factorcode.org" lost-password-from set-global + + test-db [ + init-sessions-table + init-users-table + ] with-db ; diff --git a/extra/webapps/planet/page.xml b/extra/webapps/factor-website/page.xml similarity index 89% rename from extra/webapps/planet/page.xml rename to extra/webapps/factor-website/page.xml index 1278c8174c..d929042320 100644 --- a/extra/webapps/planet/page.xml +++ b/extra/webapps/factor-website/page.xml @@ -10,52 +10,49 @@ - - + body, button { + font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif; + color:#444; + } + .link-button { padding: 0px; background: none; border: none; } - .inline { - display: inline; - } - - body, button { - font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif; - color:#444; - } - a, .link { color: #222; border-bottom:1px dotted #666; text-decoration:none; } - h1 a { - border: none; - } - a:hover, .link:hover { border-bottom:1px solid #66a; } .error { color: #a00; } - + .field-label { text-align: right; } + + .inline { + display: inline; + } + + .navbar { + background-color: #eee; + padding: 5px; + border: 1px solid #ccc; + } - -

    - diff --git a/extra/webapps/planet/admin.xml b/extra/webapps/planet/admin.xml new file mode 100644 index 0000000000..1a18cad94b --- /dev/null +++ b/extra/webapps/planet/admin.xml @@ -0,0 +1,13 @@ + + + + + Planet Factor Administration + + + +

    + Add Blog | Update +

    + +
    diff --git a/extra/webapps/planet/entry.xml b/extra/webapps/planet/entry.xml index a9383d16f2..bc89af3263 100644 --- a/extra/webapps/planet/entry.xml +++ b/extra/webapps/planet/entry.xml @@ -2,8 +2,16 @@ -

    -

    -

    +

    + +

    + +

    + +

    + +

    + +

    diff --git a/extra/webapps/planet/planet.factor b/extra/webapps/planet/planet.factor index 966bcc1d0b..464e2bbfb3 100755 --- a/extra/webapps/planet/planet.factor +++ b/extra/webapps/planet/planet.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors sequences sorting locals math -calendar alarms logging concurrency.combinators +calendar alarms logging concurrency.combinators namespaces db.types db.tuples db rss xml.writer http.server @@ -10,11 +10,22 @@ http.server.forms http.server.actions http.server.boilerplate http.server.templating.chloe -http.server.components ; +http.server.components +http.server.auth.login +webapps.factor-website ; IN: webapps.planet +TUPLE: planet-factor < dispatcher postings ; + +: planet-template ( name -- template ) + "resource:extra/webapps/planet/" swap ".xml" 3append ; + TUPLE: blog id name www-url atom-url ; +M: blog link-title name>> ; + +M: blog link-href www-url>> ; + blog "BLOGS" { { "id" "ID" INTEGER +native-id+ } @@ -29,8 +40,8 @@ blog "BLOGS" blog new swap >>id ; -: planet-template ( name -- template ) - "resource:extra/webapps/planet/" swap ".xml" 3append ; +: blogroll ( -- seq ) + f select-tuples [ [ name>> ] compare ] sort ; : ( -- form ) "entry"
    @@ -44,7 +55,7 @@ blog "BLOGS" "blog" "edit-blog" planet-template >>edit-template "view-blog" planet-template >>view-template - "blog-summary" planet-template >>summary-template + "blog-admin-link" planet-template >>summary-template "id" hidden >>renderer add-field @@ -60,15 +71,27 @@ blog "BLOGS" : ( -- form ) "planet-factor" - "planet" planet-template >>view-template - "mini-planet" planet-template >>summary-template + "postings" planet-template >>view-template + "postings-summary" planet-template >>summary-template "postings" +plain+ add-field + "blogroll" "blog" +unordered+ add-field ; + +: ( -- form ) + "admin" + "admin" planet-template >>view-template "blogroll" +unordered+ add-field ; -: blogroll ( -- seq ) - f select-tuples [ [ name>> ] compare ] sort ; +:: ( planet -- action ) + [let | form [ ] | + + [ + blank-values -TUPLE: planet-factor < dispatcher postings ; + blogroll "blogroll" set-value + + form view-form + ] >>display + ] ; :: ( planet -- action ) [let | form [ ] | @@ -90,7 +113,7 @@ TUPLE: planet-factor < dispatcher postings ; feed new "[ planet-factor ]" >>title "http://planet.factorcode.org" >>link - planet postings>> 30 safe-head >>entries ; + planet postings>> 16 safe-head >>entries ; :: ( planet -- action ) @@ -117,7 +140,8 @@ TUPLE: planet-factor < dispatcher postings ; : update-cached-postings ( planet -- ) "webapps.planet" [ - blogroll fetch-blogroll sort-entries >>postings drop + blogroll fetch-blogroll sort-entries 8 safe-head + >>postings drop ] with-logging ; :: ( planet -- action ) @@ -127,16 +151,11 @@ TUPLE: planet-factor < dispatcher postings ; "" f ] >>display ; -: start-update-task ( planet -- ) - [ update-cached-postings ] curry 10 minutes every drop ; - -:: ( -- responder ) +:: ( planet-factor -- responder ) [let | blog-form [ ] blog-ctor [ [ ] ] | - planet-factor new-dispatcher - dup >>default - dup "feed.xml" add-responder - dup "update" add-responder + + planet-factor >>default ! Administrative CRUD blog-ctor "" "delete-blog" add-responder @@ -144,30 +163,25 @@ TUPLE: planet-factor < dispatcher postings ; blog-form blog-ctor "view-blog" "edit-blog" add-responder ] ; -USING: namespaces io.files io.sockets -db.sqlite smtp -http.server.db -http.server.sessions -http.server.auth.login -http.server.auth.providers.db -http.server.sessions.storage.db ; - -: test-db "planet.db" resource-path sqlite-db ; - -: ( -- responder ) - +: ( -- responder ) + planet-factor new-dispatcher + dup >>default + dup "feed.xml" add-responder + dup "update" add-responder + dup "admin" add-responder - "page" planet-template >>template - ! - ! sessions-in-db >>sessions - test-db ; + "planet" planet-template >>template ; + +: ( -- responder ) + ; + +: start-update-task ( planet -- ) + [ update-cached-postings ] curry 10 minutes every drop ; : init-planet ( -- ) - ! test-db [ - ! init-blog-table - ! init-users-table - ! init-sessions-table - ! ] with-db + test-db [ + init-blog-table + ] with-db "planet" add-responder diff --git a/extra/webapps/planet/planet.xml b/extra/webapps/planet/planet.xml index dc762fafc6..772f81906d 100644 --- a/extra/webapps/planet/planet.xml +++ b/extra/webapps/planet/planet.xml @@ -2,36 +2,30 @@ - Planet Factor - + - + - - - + - -
    -

    - planet-factor is an Atom feed aggregator that collects the - contents of Factor-related blogs. It was inspired by - Planet Lisp. -

    -

    - - Syndicate -

    + | Admin -

    Blogroll

    + + + | Edit Profile + - + + | + + + - Admin: Add Blog - | - Update -
    +

    + +
    diff --git a/extra/webapps/planet/postings.xml b/extra/webapps/planet/postings.xml new file mode 100644 index 0000000000..f59a4f61b8 --- /dev/null +++ b/extra/webapps/planet/postings.xml @@ -0,0 +1,19 @@ + + + + + Planet Factor + + + + + + + +
    +

    Blogroll

    + + +
    + +
    diff --git a/extra/webapps/todo/page.xml b/extra/webapps/todo/page.xml deleted file mode 100644 index f40c79d299..0000000000 --- a/extra/webapps/todo/page.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - body, button { - font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif; - color:#444; - } - - a, .link { - color: #222; - border-bottom:1px dotted #666; - text-decoration:none; - } - - a:hover, .link:hover { - border-bottom:1px solid #66a; - } - - .error { color: #a00; } - - .field-label { - text-align: right; - } - - - - - - - - - - - - diff --git a/extra/webapps/todo/todo.css b/extra/webapps/todo/todo.css index c2e8a7fd79..2520a56128 100644 --- a/extra/webapps/todo/todo.css +++ b/extra/webapps/todo/todo.css @@ -10,22 +10,6 @@ color: #000000; } -.link-button { - padding: 0px; - background: none; - border: none; -} - -.navbar { - background-color: #eeeeee; - padding: 5px; - border: 1px solid #ccc; -} - -.inline { - display: inline; -} - pre { font-size: 75%; } diff --git a/extra/webapps/todo/todo.factor b/extra/webapps/todo/todo.factor index 917b9bf7a7..08555b92ed 100755 --- a/extra/webapps/todo/todo.factor +++ b/extra/webapps/todo/todo.factor @@ -1,12 +1,13 @@ ! Copyright (c) 2008 Slava Pestov ! See http://factorcode.org/license.txt for BSD license. -USING: accessors kernel locals sequences +USING: accessors kernel locals sequences namespaces db db.types db.tuples http.server.components http.server.components.farkup http.server.forms http.server.templating.chloe http.server.boilerplate http.server.crud http.server.auth http.server.actions http.server.db -http.server ; +http.server +webapps.factor-website ; IN: webapps.todo TUPLE: todo uid id priority summary description ; @@ -71,37 +72,10 @@ TUPLE: todo-responder < dispatcher ; "todo" todo-template >>template ] ; -! What follows below is somewhat akin to a 'deployment descriptor' -! for the todo application. The can be integrated -! into an existing web app that provides session management and -! login facilities, or can be used to run a -! self-contained todo instance. -USING: namespaces io.files io.sockets -db.sqlite smtp -http.server.sessions -http.server.auth.login -http.server.auth.providers.db -http.server.sessions.storage.db ; - -: test-db "todo.db" resource-path sqlite-db ; - : ( -- responder ) - - - users-in-db >>users - allow-registration - allow-password-recovery - allow-edit-profile - - "page" todo-template >>template - - sessions-in-db >>sessions - test-db ; + ; : init-todo ( -- ) - "factorcode.org" 25 smtp-server set-global - "todo@factorcode.org" lost-password-from set-global - test-db [ init-todo-table init-users-table