let ext = ".atom"
let esc = Converter.Html.esc
let element tag content = "<" ^ tag ^ ">" ^ content ^ "" ^ tag ^ ">"
let opt_element tag_name content =
if content <> ""
then element tag_name content
else ""
module P = Parsers.Plain_text.Make (Converter.Html)
let id txt = "urn:txtid:" ^ Kosuzu.(txt.Text.id) ^ "\n"
let title text = "
" ^ esc text.Kosuzu.Text.title ^ "\n"
let authors text =
let u acc addr = acc ^ element "uri" addr in
let open Kosuzu in
let fn txt a =
a ^ "" ^ (opt_element "name" @@ esc txt.Person.name)
^ (List.fold_left u "" txt.Person.addresses)
^ "\n" in
Person.Set.fold fn text.Text.authors ""
let updated txt = let open Kosuzu in
""^ Date.(txt.Text.date |> listing |> rfc_string) ^"\n"
let htm_entry base_url text =
let open Kosuzu in
let u = Text.short_id text in
"\n\n"
^ title text ^ id text ^ updated text ^ authors text
^ (opt_element "summary" @@ esc @@ Text.str "abstract" text)
^ String_set.fold (fun elt a -> a ^ "\n") (Text.set "topics" text) ""
^ "\n"
let gmi_entry base_url text =
let open Kosuzu in
let u = Text.short_id text in
"\n\n"
^ title text ^ id text ^ updated text ^ authors text
^ (opt_element "summary" @@ esc @@ Text.str "abstract" text)
^ String_set.fold (fun elt a -> a ^ "\n") (Text.set "topics" text) ""
^ "\n"
let base_url kv protocol = try
let locs = Kosuzu.Store.KV.find "Locations" kv in
let _i = Str.(search_forward (regexp (protocol ^ "://[^;]*")) locs 0) in
Str.(matched_string locs)
with Not_found -> Printf.eprintf "Missing location for %s, add it to txt.conf\n" protocol; ""
let indices alternate_type c =
let file name = Kosuzu.File_store.file (Filename.concat c.Conversion.dir name) in
let title = try Kosuzu.Store.KV.find "Title" c.Conversion.kv with Not_found -> "" in
let entry, fname, protocol_regexp = match alternate_type with
| "text/gemini" -> gmi_entry, "gmi.atom", "gemini"
| "text/html" | _ -> htm_entry, "feed.atom", "https?"
in
let base_url = base_url c.kv protocol_regexp in
let self = Filename.concat base_url fname in
file fname @@ (*TODO: alternate & self per url*)
{||}
^ title ^ {|urn:txtid:|} ^ c.Conversion.id ^ ""
^ Kosuzu.Date.now () ^ "\n"
^ List.fold_left (fun acc t -> acc ^ entry base_url t) "" c.texts
^ ""
let converter format = Conversion.{ ext; page = None; indices = Some (indices format) }