fixup html, add rss feed
This commit is contained in:
@@ -66,6 +66,8 @@ for file in $(ls "$BLOG_DIR/posts"); do
|
|||||||
slug=$(sed -n '2p' $target_file | tr -d '\n')
|
slug=$(sed -n '2p' $target_file | tr -d '\n')
|
||||||
title=$(sed -n '3p' $target_file | tr -d '\n')
|
title=$(sed -n '3p' $target_file | tr -d '\n')
|
||||||
content=$(sed -n '4,$p' $target_file | tr -d '\n')
|
content=$(sed -n '4,$p' $target_file | tr -d '\n')
|
||||||
|
# Cool little sed to escape html
|
||||||
|
content=$(sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g; s/'"'"'/\'/g' "$content")
|
||||||
|
|
||||||
insert_post "$date" "$slug" "$title" "$content"
|
insert_post "$date" "$slug" "$title" "$content"
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ let () =
|
|||||||
Dream.get "/philosophy" @@ Dream.from_filesystem "html" "philosophy.html";
|
Dream.get "/philosophy" @@ Dream.from_filesystem "html" "philosophy.html";
|
||||||
Dream.get "/web-ring" @@ Dream.from_filesystem "html" "web-ring.html";
|
Dream.get "/web-ring" @@ Dream.from_filesystem "html" "web-ring.html";
|
||||||
Dream.get "/blog" Render.render_blog_index;
|
Dream.get "/blog" Render.render_blog_index;
|
||||||
Dream.scope "/blog" [Dream.origin_referrer_check] [
|
Dream.scope "/blog" [] [
|
||||||
|
Dream.get "/rss.xml" Render.render_rss_feed;
|
||||||
Dream.get "/:post" Render.render_blog_post
|
Dream.get "/:post" Render.render_blog_post
|
||||||
];
|
];
|
||||||
|
Dream.get "/**" (fun _ -> Render.handle_not_found ())
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -2,18 +2,15 @@ open Database
|
|||||||
open Lwt
|
open Lwt
|
||||||
|
|
||||||
module Render = struct
|
module Render = struct
|
||||||
let not_found_template = "404 Not found"
|
|
||||||
let error_template = "500 Server Error"
|
|
||||||
|
|
||||||
let header_template =
|
let header_template =
|
||||||
{eos|
|
{eos|<!DOCTYPE html>
|
||||||
<!DOCTYPE html>
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta name="description" content="Rawley.xyz, Rawley Fowler's blog and personal website">
|
<meta name="description" content="Rawley.xyz, Rawley Fowler's blog and personal website">
|
||||||
<title>rawley.xyz</title>
|
<title>rawley.xyz</title>
|
||||||
<link href="/static/index.css" rel="stylesheet">
|
<link href="/static/index.css" rel="stylesheet">
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="https://rawley.xyz/blog/rss.xml" title="rawley.xyz">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<body>
|
<body>
|
||||||
@@ -36,12 +33,10 @@ module Render = struct
|
|||||||
</li>
|
</li>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<main>
|
<main>|eos}
|
||||||
|eos}
|
|
||||||
|
|
||||||
let footer_template =
|
let footer_template =
|
||||||
{eos|
|
{eos|</main>
|
||||||
</main>
|
|
||||||
<footer>
|
<footer>
|
||||||
<hr>
|
<hr>
|
||||||
<p>
|
<p>
|
||||||
@@ -53,8 +48,19 @@ module Render = struct
|
|||||||
</p>
|
</p>
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>|eos}
|
||||||
|eos}
|
|
||||||
|
let not_found_template =
|
||||||
|
Printf.sprintf "%s %s %s"
|
||||||
|
header_template
|
||||||
|
"<h4>404 Not found<h4>"
|
||||||
|
footer_template
|
||||||
|
|
||||||
|
let error_template =
|
||||||
|
Printf.sprintf "%s %s %s"
|
||||||
|
header_template
|
||||||
|
"<h4>500 Server Error</h4>"
|
||||||
|
footer_template
|
||||||
|
|
||||||
let render_page content =
|
let render_page content =
|
||||||
Printf.sprintf
|
Printf.sprintf
|
||||||
@@ -69,16 +75,27 @@ module Render = struct
|
|||||||
|
|
||||||
let generate_link (p : BlogPost.t) =
|
let generate_link (p : BlogPost.t) =
|
||||||
Printf.sprintf
|
Printf.sprintf
|
||||||
{eos|
|
{eos|<div class="link-wrapper">
|
||||||
<div class="link-wrapper">
|
|
||||||
<a href="/blog/%s">%s</a>
|
<a href="/blog/%s">%s</a>
|
||||||
<i>%s</i>
|
<i>%s</i>
|
||||||
</div>
|
</dev>|eos}
|
||||||
|eos}
|
|
||||||
p.slug p.title p.date
|
p.slug p.title p.date
|
||||||
|
|
||||||
|
let generate_rss_item (p : BlogPost.t) =
|
||||||
|
Printf.sprintf
|
||||||
|
{eos|<item>
|
||||||
|
<title>%s</title>
|
||||||
|
<link>https://rawley.xyz/blog/%s</link>
|
||||||
|
<description></description>
|
||||||
|
</item>|eos}
|
||||||
|
p.title p.slug
|
||||||
|
|
||||||
let handle_error e =
|
let handle_error e =
|
||||||
print_endline (Caqti_error.show e); error_template |> Dream.html
|
print_endline (Caqti_error.show e);
|
||||||
|
Dream.html ?code:(Some 500) error_template
|
||||||
|
|
||||||
|
let handle_not_found () =
|
||||||
|
Dream.html ?code:(Some 404) not_found_template
|
||||||
|
|
||||||
let render_blog_post request =
|
let render_blog_post request =
|
||||||
let slug = Dream.param request "post" in
|
let slug = Dream.param request "post" in
|
||||||
@@ -88,7 +105,7 @@ module Render = struct
|
|||||||
| Error e -> handle_error e
|
| Error e -> handle_error e
|
||||||
| Ok p_opt ->
|
| Ok p_opt ->
|
||||||
match p_opt with
|
match p_opt with
|
||||||
| None -> not_found_template |> Dream.html
|
| None -> handle_not_found ()
|
||||||
| Some p ->
|
| Some p ->
|
||||||
Printf.sprintf "<h2>%s</h2>\r\n%s" p.title p.content
|
Printf.sprintf "<h2>%s</h2>\r\n%s" p.title p.content
|
||||||
|> render_page
|
|> render_page
|
||||||
@@ -106,4 +123,34 @@ module Render = struct
|
|||||||
render_page @@ Buffer.contents buff
|
render_page @@ Buffer.contents buff
|
||||||
else render_page "<br>No blog posts..." in
|
else render_page "<br>No blog posts..." in
|
||||||
Dream.html c
|
Dream.html c
|
||||||
|
|
||||||
|
let render_rss_feed (_ : Dream.request) =
|
||||||
|
let buff = Buffer.create 512 in
|
||||||
|
let add_str = Buffer.add_string buff in
|
||||||
|
let () =
|
||||||
|
add_str
|
||||||
|
{eos|<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<rss version="2.0">
|
||||||
|
<channel>
|
||||||
|
<title>rawley.xyz blog</title>
|
||||||
|
<description>Functional programming, math, and philosophy</description>
|
||||||
|
<image>
|
||||||
|
<url>https://rawley.xyz/static/rawley.xyz.png</url>
|
||||||
|
<link>https://rawley.xyz/</link>
|
||||||
|
</image>|eos}
|
||||||
|
in
|
||||||
|
let posts_t = Database.get_all_blog_posts () in
|
||||||
|
posts_t >>= function
|
||||||
|
| Error e -> handle_error e
|
||||||
|
| Ok posts ->
|
||||||
|
let () = List.iter (fun t -> generate_rss_item t |> add_str) posts in
|
||||||
|
let () =
|
||||||
|
add_str
|
||||||
|
{eos|</channel>
|
||||||
|
</rss>|eos}
|
||||||
|
in
|
||||||
|
Lwt.return @@
|
||||||
|
Dream.response
|
||||||
|
~headers:["Content-Type", "text/xml";]
|
||||||
|
(Buffer.contents buff)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ module Render :
|
|||||||
val render_page : string -> string
|
val render_page : string -> string
|
||||||
val generate_link : BlogPost.t -> string
|
val generate_link : BlogPost.t -> string
|
||||||
val handle_error : [< Caqti_error.t ] -> Dream.response Lwt.t
|
val handle_error : [< Caqti_error.t ] -> Dream.response Lwt.t
|
||||||
|
val handle_not_found : unit -> Dream.response Lwt.t
|
||||||
val render_blog_post : Dream.request -> Dream.response Lwt.t
|
val render_blog_post : Dream.request -> Dream.response Lwt.t
|
||||||
val render_blog_index : Dream.request -> Dream.response Lwt.t
|
val render_blog_index : Dream.request -> Dream.response Lwt.t
|
||||||
|
val render_rss_feed : Dream.request -> Dream.response Lwt.t
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user