Last active
December 28, 2016 04:05
-
-
Save tajpure/cad9ac367d99044c3e50 to your computer and use it in GitHub Desktop.
A Racket Blog
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#lang web-server/insta | |
; A blog is a (listof post) | |
; and a post is a (post title body) | |
(struct post (title body)) | |
; BLOG: blog | |
; The static blog. | |
(define BLOG | |
(list (post "Second Post" "This is anther post") | |
(post "First Post" "This is my first post"))) | |
; start: request -> response | |
; Consumes a request, and produces a page that displays all of the | |
; web content. | |
(define (start request) | |
(local [(define a-blog | |
(cond [(can-parse-post? (request-bindings request)) | |
(cons (parse-post (request-bindings request)) | |
BLOG)] | |
[else | |
BLOG]))] | |
(render-blog-page a-blog request))) | |
; can-parse-post?: bindings -> boolean | |
; Produces true if bindings contains values for 'title and 'body. | |
(define (can-parse-post? bindings) | |
(and (exists-binding? 'title bindings) | |
(exists-binding? 'body bindings))) | |
; parse-post: bindings -> post | |
; Consumes a bindings, and produces a post out of the bindings. | |
(define (parse-post bindings) | |
(post (extract-binding/single 'title bindings) | |
(extract-binding/single 'body bindings))) | |
; render-blog-page: blog request -> response | |
; Consumes a blog and a request, and produces an HTML page | |
; of the content of the blog. | |
(define (render-blog-page a-blog request) | |
(response/xexpr | |
'(html (head (titile "My Blog")) | |
(body | |
(h1 "My Blog") | |
,(render-post a-blog) | |
(form | |
(input ((name "title"))) | |
(input ((name "body"))) | |
(input ((type "submit")))))))) | |
; render-post: post -> xexpr | |
; Consumes a post, produces an xexpr fragment of the post. | |
(define (render-post a-post) | |
'(div ((class "post")) | |
,(post-title a-post) | |
(p, (post-body a-post)))) | |
; render-posts: blog -> xexpr | |
; Consumes a blog, produces an xexpr fragment | |
; of all its posts. | |
(define (render-posts a-blog) | |
'(div ((class "posts")) | |
,@(map render-post a-blog))) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment