let ext = ".atom" let esc = Converter.Html.esc let element tag content = "<" ^ tag ^ ">" ^ content ^ "" 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) }