From e2a185f1f45696d3c3102196f02f6e7c1e597357 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 20 Apr 2008 04:19:06 -0500 Subject: [PATCH] Web framework work in progress --- .../server/boilerplate/boilerplate.factor | 23 ++- .../server/components/components-tests.factor | 2 + .../http/server/components/components.factor | 95 +++++++--- .../server/components/farkup/farkup.factor | 6 +- extra/http/server/forms/forms.factor | 5 +- .../http/server/templating/chloe/chloe.factor | 29 ++- .../server/validators/validators-tests.factor | 6 + .../http/server/validators/validators.factor | 7 +- extra/webapps/planet/authors.txt | 1 + extra/webapps/planet/blog-summary.xml | 7 + extra/webapps/planet/edit-blog.xml | 40 ++++ extra/webapps/planet/entry-summary.xml | 10 + extra/webapps/planet/entry.xml | 9 + extra/webapps/planet/mini-planet.xml | 7 + extra/webapps/planet/page.xml | 64 +++++++ extra/webapps/planet/planet.css | 30 +++ extra/webapps/planet/planet.factor | 174 ++++++++++++++++++ extra/webapps/planet/planet.xml | 37 ++++ extra/webapps/planet/view-blog.xml | 41 +++++ 19 files changed, 557 insertions(+), 36 deletions(-) create mode 100755 extra/webapps/planet/authors.txt create mode 100644 extra/webapps/planet/blog-summary.xml create mode 100644 extra/webapps/planet/edit-blog.xml create mode 100644 extra/webapps/planet/entry-summary.xml create mode 100644 extra/webapps/planet/entry.xml create mode 100644 extra/webapps/planet/mini-planet.xml create mode 100644 extra/webapps/planet/page.xml create mode 100644 extra/webapps/planet/planet.css create mode 100755 extra/webapps/planet/planet.factor create mode 100644 extra/webapps/planet/planet.xml create mode 100644 extra/webapps/planet/view-blog.xml diff --git a/extra/http/server/boilerplate/boilerplate.factor b/extra/http/server/boilerplate/boilerplate.factor index 4e847cff70..6c62452ec2 100644 --- a/extra/http/server/boilerplate/boilerplate.factor +++ b/extra/http/server/boilerplate/boilerplate.factor @@ -1,7 +1,8 @@ ! Copyright (c) 2008 Slava Pestov ! See http://factorcode.org/license.txt for BSD license. USING: accessors kernel namespaces boxes sequences strings -io io.streams.string +io io.streams.string arrays +html.elements http http.server http.server.templating ; @@ -28,6 +29,18 @@ SYMBOL: style : write-style ( -- ) style get >string write ; +SYMBOL: atom-feed + +: set-atom-feed ( title url -- ) + 2array atom-feed get >box ; + +: write-atom-feed ( -- ) + atom-feed get value>> [ + + ] when* ; + SYMBOL: nested-template? SYMBOL: next-template @@ -40,6 +53,7 @@ M: f call-template drop call-next-template ; : with-boilerplate ( body template -- ) [ title get [ title set ] unless + atom-feed get [ atom-feed set ] unless style get [ SBUF" " clone style set ] unless [ @@ -54,5 +68,8 @@ M: f call-template drop call-next-template ; ] with-scope ; inline M: boilerplate call-responder - [ responder>> call-responder clone ] [ template>> ] bi - [ [ with-boilerplate ] 2curry ] curry change-body ; + tuck responder>> call-responder + dup "content-type" header "text/html" = [ + clone swap template>> + [ [ with-boilerplate ] 2curry ] curry change-body + ] [ nip ] if ; diff --git a/extra/http/server/components/components-tests.factor b/extra/http/server/components/components-tests.factor index 6d3a048ac4..ff87bb71fb 100755 --- a/extra/http/server/components/components-tests.factor +++ b/extra/http/server/components/components-tests.factor @@ -129,3 +129,5 @@ TUPLE: test-tuple text number more-text ; [ t ] [ "wake up sheeple" dup "n" validate = ] unit-test [ ] [ "password" "p" set ] unit-test + +[ ] [ "pub-date" "d" set ] unit-test diff --git a/extra/http/server/components/components.factor b/extra/http/server/components/components.factor index 50353c6b87..bdcdd95c71 100755 --- a/extra/http/server/components/components.factor +++ b/extra/http/server/components/components.factor @@ -1,9 +1,10 @@ ! Copyright (C) 2008 Slava Pestov ! See http://factorcode.org/license.txt for BSD license. -USING: html.elements http.server.validators accessors namespaces -kernel io math.parser assocs classes words classes.tuple arrays -sequences splitting mirrors hashtables fry combinators -continuations math ; +USING: accessors namespaces kernel io math.parser assocs classes +words classes.tuple arrays sequences splitting mirrors +hashtables fry combinators continuations math +calendar.format html.elements +http.server.validators ; IN: http.server.components ! Renderer protocol @@ -59,9 +60,14 @@ SYMBOL: values : values-tuple values get mirror-object ; +: render-view-or-summary ( component -- value renderer ) + [ id>> value ] [ component-string ] [ renderer>> ] tri ; + : render-view ( component -- ) - [ id>> value ] [ component-string ] [ renderer>> ] tri - render-view* ; + render-view-or-summary render-view* ; + +: render-summary ( component -- ) + render-view-or-summary render-summary* ; ( id -- component ) + url new-string + 5 >>min-length + 60 >>max-length ; + +M: url validate* + call-next-method dup empty? [ v-url ] unless ; + ! Don't send passwords back to the user TUPLE: password-renderer < field ; @@ -206,20 +223,20 @@ M: captcha validate* drop v-captcha ; ! Text areas -TUPLE: textarea-renderer rows cols ; +TUPLE: text-renderer rows cols ; -: new-textarea-renderer ( class -- renderer ) +: new-text-renderer ( class -- renderer ) new 60 >>cols 20 >>rows ; -: ( -- renderer ) - textarea-renderer new-textarea-renderer ; +: ( -- renderer ) + text-renderer new-text-renderer ; -M: textarea-renderer render-view* +M: text-renderer render-view* drop write ; -M: textarea-renderer render-edit* +M: text-renderer render-edit*