diff --git a/cli/atom.ml b/cli/atom.ml index f050bfc..7831237 100644 --- a/cli/atom.ml +++ b/cli/atom.ml @@ -1,3 +1,5 @@ +let ext = ".atom" + let esc = Converter.Html.esc let element tag content = "<" ^ tag ^ ">" ^ content ^ "" @@ -44,14 +46,28 @@ let gmi_entry base_url text = ^ String_set.fold (fun elt a -> a ^ "") (Text.set "topics" text) "" ^ "\n" -let feed title archive_id base_url alternate_type texts = - let entry, self = match alternate_type with - | "text/gemini" -> gmi_entry, base_url^"/gmi.atom" - | "text/html" | _ -> htm_entry, base_url^"/feed.atom" in - {||} - ^ title ^ {|urn:uuid:|} ^ archive_id ^ "" - ^ Logarion.Date.now () ^ "\n" - ^ List.fold_left (fun acc t -> acc ^ entry base_url t) "" texts - ^ "" +let base_url kv protocol = try + let locs = Logarion.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" protocol; "" + +let indices alternate_type c = + let file name = Logarion.File_store.file (Filename.concat c.Conversion.dir name) in + let title = try Logarion.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 @@ + {||} + ^ title ^ {|urn:uuid:|} ^ c.Conversion.id ^ "" + ^ Logarion.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) } diff --git a/cli/conversion.ml b/cli/conversion.ml index a69122f..80b74dc 100644 --- a/cli/conversion.ml +++ b/cli/conversion.ml @@ -9,6 +9,6 @@ type t = { type fn_t = { ext: string; - page: t -> Logarion.Text.t -> string; - indices: t -> unit; + page: (t -> Logarion.Text.t -> string) option; + indices: (t -> unit) option; } diff --git a/cli/convert.ml b/cli/convert.ml index a2b0276..39f6cbd 100644 --- a/cli/convert.ml +++ b/cli/convert.ml @@ -9,20 +9,21 @@ let convert cs r (text, files) = match Text.str "Content-Type" text with let dest = Filename.concat r.Conversion.dir (Text.short_id text) in List.fold_left (fun a f -> - let dest = dest ^ f.Conversion.ext in - if is_older source dest then (File_store.file dest (f.Conversion.page r text); true) else false - || a) + match f.Conversion.page with None -> false || a + | Some page -> + let dest = dest ^ f.Conversion.ext in + (if is_older source dest then (File_store.file dest (page r text); true) else false) + || a) false cs | x -> Printf.eprintf "Can't convert Content-Type: %s file: %s" x text.Text.title; false let converters types kv = + let n = String.split_on_char ',' types in let t = [] in - let t = if ("htm" = types || "all" = types) then - (let htm = Html.init kv in - Conversion.{ ext = Html.ext; page = Html.page htm; indices = Html.indices htm })::t - else t in - let t = if ("gmi" = types || "all" = types) then - Conversion.{ ext = Gemini.ext; page = Gemini.page; indices = Gemini.indices}::t else t in + let t = if List.(mem "all" n || mem "htm" n) then (Html.converter kv)::t else t in + let t = if List.(mem "all" n || mem "atom" n) then (Atom.converter "text/html")::t else t in + let t = if List.(mem "all" n || mem "gmi" n) then (Gemini.converter)::t else t in + let t = if List.(mem "all" n || mem "gmi-atom" n) then (Atom.converter "text/gemini")::t else t in t let directory converters noindex dir id kv = @@ -35,7 +36,7 @@ let directory converters noindex dir id kv = let topic_roots = try List.rev @@ String_set.list_of_csv (Store.KV.find "Topics" kv) with Not_found -> Topic_set.roots topics in let repo = Conversion.{ repo with topic_roots; topics; texts } in - if not noindex then List.iter (fun c -> c.Conversion.indices repo) converters; + if not noindex then List.iter (fun c -> match c.Conversion.indices with None -> () | Some f -> f repo) converters; Printf.printf "Converted: %d Indexed: %d\n" count (List.length texts) let at_path types noindex path = @@ -47,8 +48,7 @@ let at_path types noindex path = | Ok { info; peers; _ } -> let kv = let f = Filename.concat dir ".convert.conf" in (* TODO: better place to store convert conf? *) if Sys.file_exists f then File_store.of_kv_file f else Store.KV.empty in - let kv = if Store.KV.mem "Title" kv then kv - else Store.KV.add "Title" info.Header_pack.title kv in + let kv = if Store.KV.mem "Title" kv then kv else Store.KV.add "Title" info.Header_pack.title kv in let kv = Store.KV.add "Locations" (String.concat ";\n" info.Header_pack.locations) kv in let kv = Store.KV.add "Peers" (String.concat ";\n" Header_pack.(to_str_list peers)) kv in let cs = converters types kv in diff --git a/cli/gemini.ml b/cli/gemini.ml index 598aa1a..e083f81 100644 --- a/cli/gemini.ml +++ b/cli/gemini.ml @@ -90,19 +90,11 @@ let indices r = let file name = File_store.file (Filename.concat r.Conversion.dir name) in let index_name = try Store.KV.find "Gemini-index" r.kv with Not_found -> "index.gmi" in let title = try Store.KV.find "Title" r.Conversion.kv with Not_found -> "" in - - if index_name <> "" then - file index_name (topic_main_index r title r.topic_roots r.texts); - + if index_name <> "" then file index_name (topic_main_index r title r.topic_roots r.texts); file "index.date.gmi" (date_index title r.texts); - List.iter (fun topic -> file ("index." ^ topic ^ ".gmi") (topic_sub_index title r.topics topic r.texts)) - r.topic_roots; + r.topic_roots - let base_url = try - let _i = Str.(search_forward (regexp "gemini?://[^;]*") (Store.KV.find "Locations" r.kv) 0) in - Str.(matched_string (Store.KV.find "Locations" r.kv)) - with Not_found -> prerr_endline "Missing location for Gemini"; "" in - file "gmi.atom" (Atom.feed title r.id base_url "text/gemini" r.texts) +let converter = Conversion.{ ext; page = Some page; indices = Some indices} diff --git a/cli/html.ml b/cli/html.ml index 2f73d68..f8e4c93 100644 --- a/cli/html.ml +++ b/cli/html.ml @@ -14,8 +14,8 @@ let init kv = let footer = to_string "HTM-footer" kv in { templates = { header; footer} } -let wrap c htm text_title body = - let site_title = try Logarion.Store.KV.find "Title" c.Conversion.kv +let wrap conv htm text_title body = + let site_title = try Logarion.Store.KV.find "Title" conv.Conversion.kv with Not_found -> "" in let replace x = let open Str in global_replace (regexp "{{archive-title}}") site_title x @@ -57,7 +57,8 @@ let page htm conversion text = let authors = (Person.Set.to_string text.authors ^ " ") in let keywords = str_set "keywords" text in let header = - let time x = {|" in + let time x = Printf.sprintf {||} + (Date.rfc_string x) (Date.pretty_date x) in let topic_links x = let to_linked t a = let ts = Topic_set.of_string t in @@ -66,7 +67,7 @@ let page htm conversion text = "
" ^ opt_kv "Title:" text.title ^ opt_kv "Authors:" authors - ^ opt_kv "Date: " (time (Date.(pretty_date @@ listing text.date))) + ^ opt_kv "Date: " (time (Date.listing text.date)) ^ opt_kv "Series: " (str_set "series" text) ^ opt_kv "Topics: " (topic_links (set "topics" text)) ^ opt_kv "Keywords: " keywords @@ -161,24 +162,15 @@ let topic_sub_index conv htm topic_map topic_root metas = (* ^ {||}^ String.capitalize_ascii topic_root ^{| feed |}*) ^ listing_index topic_map [topic_root] "" metas) -open Logarion let indices htm c = let file name = Logarion.File_store.file (Filename.concat c.Conversion.dir name) in - let index_name = try Store.KV.find "HTM-index" c.Conversion.kv with Not_found -> "index.html" in - let title = try Store.KV.find "Title" c.Conversion.kv with Not_found -> "" in - - if index_name <> "" then - file index_name (topic_main_index c htm c.topic_roots c.texts); - + let index_name = try Logarion.Store.KV.find "HTM-index" c.Conversion.kv with Not_found -> "index.html" in + if index_name <> "" then file index_name (topic_main_index c htm c.topic_roots c.texts); file "index.date.htm" (date_index c htm c.texts); - List.iter (fun root -> file ("index." ^ root ^ ".htm") (topic_sub_index c htm c.topics root c.texts)) - c.topic_roots; + c.topic_roots - let base_url = try - let locs = Store.KV.find "Locations" c.kv in - let _i = Str.(search_forward (regexp "https?://[^;]*") locs 0) in - Str.(matched_string locs) - with Not_found -> prerr_endline "Missing location for HTTP(S)"; "" in - file "feed.atom" (Atom.feed title c.id base_url "text/html" c.texts) +let converter kv = + let htm = init kv in + Conversion.{ ext; page = Some (page htm); indices = Some (indices htm) }