fixup html, add rss feed

This commit is contained in:
rf
2022-09-24 12:27:10 -05:00
parent 6c59e99b50
commit dfd1b57a61
4 changed files with 71 additions and 18 deletions

View File

@@ -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/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g' "$content")
insert_post "$date" "$slug" "$title" "$content" insert_post "$date" "$slug" "$title" "$content"
done done

View File

@@ -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 ())
] ]

View File

@@ -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

View File

@@ -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