Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 5.81 KB | None | 0 0
  1. #lang web-server/insta
  2.  
  3.   (require web-server/formlets
  4.            "model-3.rkt")
  5.  
  6.   ; start: request -> html-response
  7.   ; Consumes a request and produces a page that displays
  8.   ; all of the web content.
  9.   (define (start request)
  10.     (render-blog-page
  11.      (initialize-blog!
  12.       (build-path (current-directory)
  13.                   "the-blog-data.sqlite"))
  14.      request))
  15.  
  16.   ; new-post-formlet : formlet (values string? string?)
  17.   ; A formlet for requesting a title and body of a post
  18.   (define new-post-formlet
  19.     (formlet
  20.      (#%# ,{input-string . => . title}
  21.           ,{input-string . => . body})
  22.      (values title body)))
  23.  
  24.   ; render-blog-page: blog request -> html-response
  25.   ; Produces an html-response page of the content of the
  26.   ; blog.
  27.   (define (render-blog-page a-blog request)
  28.     (local [(define (response-generator make-url)
  29.               `(html (head (title "My Blog"))
  30.                      (body
  31.                       (h1 "My Blog")
  32.                       ,(render-posts a-blog make-url)
  33.                       (form ([action
  34.                               ,(make-url insert-post-handler)])
  35.                             ,@(formlet-display new-post-formlet)
  36.                             (input ([type "submit"]))))))
  37.  
  38.             (define (insert-post-handler request)
  39.               (define-values (title body)
  40.                 (formlet-process new-post-formlet request))
  41.               (blog-insert-post! a-blog title body)
  42.               (render-blog-page a-blog (redirect/get)))]
  43.  
  44.       (send/suspend/dispatch response-generator)))
  45.  
  46.   ; new-comment-formlet : formlet string
  47.   ; A formlet for requesting a comment
  48.   (define new-comment-formlet
  49.     input-string)
  50.  
  51.   ; render-post-detail-page: post request -> html-response
  52.   ; Consumes a post and produces a detail page of the post.
  53.   ; The user will be able to either insert new comments
  54.   ; or go back to render-blog-page.
  55.   (define (render-post-detail-page a-blog a-post request)
  56.     (local [(define (response-generator make-url)
  57.               `(html (head (title "Post Details"))
  58.                      (body
  59.                       (h1 "Post Details")
  60.                       (h2 ,(post-title a-post))
  61.                       (p ,(post-body a-post))
  62.                       ,(render-as-itemized-list
  63.                         (post-comments a-post))
  64.                       (form ([action
  65.                               ,(make-url insert-comment-handler)])
  66.                             ,@(formlet-display new-comment-formlet)
  67.                             (input ([type "submit"])))
  68.                       (a ([href ,(make-url back-handler)])
  69.                          "Back to the blog"))))
  70.  
  71.             (define (insert-comment-handler request)
  72.               (render-confirm-add-comment-page
  73.                a-blog
  74.                (formlet-process new-comment-formlet request)
  75.                a-post
  76.                request))
  77.  
  78.             (define (back-handler request)
  79.               (render-blog-page a-blog request))]
  80.  
  81.       (send/suspend/dispatch response-generator)))
  82.  
  83.   ; render-confirm-add-comment-page :
  84.   ; blog comment post request -> html-response
  85.   ; Consumes a comment that we intend to add to a post, as well
  86.   ; as the request. If the user follows through, adds a comment
  87.   ; and goes back to the display page. Otherwise, goes back to
  88.   ; the detail page of the post.
  89.   (define (render-confirm-add-comment-page a-blog a-comment
  90.                                            a-post request)
  91.     (local [(define (response-generator make-url)
  92.               `(html (head (title "Add a Comment"))
  93.                      (body
  94.                       (h1 "Add a Comment")
  95.                       "The comment: " (div (p ,a-comment))
  96.                       "will be added to "
  97.                       (div ,(post-title a-post))
  98.  
  99.                       (p (a ([href ,(make-url yes-handler)])
  100.                             "Yes, add the comment."))
  101.                       (p (a ([href ,(make-url cancel-handler)])
  102.                             "No, I changed my mind!")))))
  103.  
  104.             (define (yes-handler request)
  105.               (post-insert-comment! a-blog a-post a-comment)
  106.               (render-post-detail-page a-blog a-post (redirect/get)))
  107.  
  108.             (define (cancel-handler request)
  109.               (render-post-detail-page a-blog a-post request))]
  110.  
  111.       (send/suspend/dispatch response-generator)))
  112.  
  113.   ; render-post: post (handler -> string) -> html-response
  114.   ; Consumes a post, produces an html-response fragment of the post.
  115.   ; The fragment contains a link to show a detailed view of the post.
  116.   (define (render-post a-blog a-post make-url)
  117.     (local [(define (view-post-handler request)
  118.               (render-post-detail-page a-blog a-post request))]
  119.       `(div ([class "post"])
  120.             (a ([href ,(make-url view-post-handler)])
  121.                ,(post-title a-post))
  122.             (p ,(post-body a-post))
  123.             (div ,(number->string (length (post-comments a-post)))
  124.                  " comment(s)"))))
  125.  
  126.   ; render-posts: blog (handler -> string) -> html-response
  127.   ; Consumes a make-url, produces an html-response fragment
  128.   ; of all its posts.
  129.   (define (render-posts a-blog make-url)
  130.     (local [(define (render-post/make-url a-post)
  131.               (render-post a-blog a-post make-url))]
  132.       `(div ([class "posts"])
  133.             ,@(map render-post/make-url (blog-posts a-blog)))))
  134.  
  135.   ; render-as-itemized-list: (listof html-response) -> html-response
  136.   ; Consumes a list of items, and produces a rendering as
  137.   ; an unorderered list.
  138.   (define (render-as-itemized-list fragments)
  139.     `(ul ,@(map render-as-item fragments)))
  140.  
  141.   ; render-as-item: html-response -> html-response
  142.   ; Consumes an html-response, and produces a rendering
  143.   ; as a list item.
  144.   (define (render-as-item a-fragment)
  145.     `(li ,a-fragment))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement