···238238 let out = Xmlm.make_output @@ `Channel ch in
239239 (* Eio_util.xmlm_dest_of_writer w in *)
240240 Render_xml.render_tree_page ~base_url doc out
241241- end;
242242- begin
243243- base_url |> Option.iter @@ fun base_url ->
244244- let path = Eio.Path.(cwd / "output" / E.route Rss addr) in
245245- Eio.Path.with_open_out ~create path @@ fun flow ->
246246- Eio.Buf_write.with_flow flow @@ fun w ->
247247- let out = Xmlm.make_output @@ Eio_util.xmlm_dest_of_writer w in
248248- Render_rss.render_tree_page ~base_url doc out
249241 end
250242251243let render_json ~cwd docs =
-74
lib/render/Render_rss.ml
···11-open Prelude
22-open Bwd
33-open Core
44-55-module E = Render_effect.Perform
66-77-module Printer = Xml_printer
88-type printer = Printer.printer
99-1010-let render_rfc_822 date =
1111- let day = Option.value ~default:1 @@ Date.day date in
1212- let month =
1313- match Option.value ~default:1 @@ Date.month date with
1414- | 1 -> "Jan"
1515- | 2 -> "Feb"
1616- | 3 -> "Mar"
1717- | 4 -> "Apr"
1818- | 5 -> "May"
1919- | 6 -> "Jun"
2020- | 7 -> "Jul"
2121- | 8 -> "Aug"
2222- | 9 -> "Sep"
2323- | 10 -> "Oct"
2424- | 11 -> "Nov"
2525- | 12 -> "Dec"
2626- | i -> failwith @@ Format.sprintf "render_rfc_822: invalid month %i" i
2727- in
2828- Format.asprintf "%i %s %i" day month @@ Date.year date
2929-3030-let render_tree_info ~base_url ~addr (doc : Sem.tree) : printer =
3131- Printer.seq [
3232- Printer.tag "title" [] [
3333- Printer.text @@ Option.value ~default:"Untitled" @@
3434- begin
3535- doc.fm.title |> Option.map @@ fun title ->
3636- String_util.sentence_case @@
3737- Render_text.Printer.contents @@
3838- Render_text.render title
3939- end
4040- ];
4141- Printer.tag "link" [] [
4242- Printer.text @@ Format.asprintf "%s/%s" base_url @@ E.route Xml addr
4343- ];
4444- doc.fm.dates |> Fun.flip List.nth_opt 0 |> Printer.option begin fun date ->
4545- Printer.tag "pubDate" [] [
4646- Printer.text @@ render_rfc_822 date
4747- ]
4848- end
4949- ]
5050-5151-let render_item ~base_url (doc : Sem.tree) : printer =
5252- match doc.fm.addr with
5353- | None -> failwith "render_item: no addr"
5454- | Some addr ->
5555- Printer.tag "item" [] [
5656- render_tree_info ~base_url ~addr doc
5757- ]
5858-5959-6060-let render_channel ~base_url (doc : Sem.tree) : printer =
6161- match doc.fm.addr with
6262- | None -> failwith "render_channel: no addr"
6363- | Some addr ->
6464- let children = E.children addr in
6565- Printer.tag "channel" [] [
6666- render_tree_info ~base_url ~addr doc;
6767- Printer.iter (render_item ~base_url) children
6868- ]
6969-7070-let render_tree_page ~base_url (doc : Sem.tree) : printer =
7171- Printer.document @@
7272- Printer.tag "rss" [Printer.attr "version" "2.0"] [
7373- render_channel ~base_url doc
7474- ]