Files
kosuzu/cmd/txt/publish.ml
yakumo.izuru 7919277b64 Bring back the publish subcommand (adapted)
git-svn-id: file:///srv/svn/repo/kosuzu/trunk@78 eb64cd80-c68d-6f47-b6a3-0ada418499da
2025-04-21 21:47:16 +00:00

74 lines
3.0 KiB
OCaml

let targets pubdir = List.fold_left
(fun a x ->
let path = Filename.concat pubdir (snd x) in
try if Sys.is_directory path then (fst x, path)::a else a with Sys_error _ -> a)
[]
["htm,atom", "public_html/"; "gmi,gmi-atom", "public_gemini/"; "", "public_gopher/"]
let wizard () =
print_endline "No txt.conf found. It's required for the repository name & id. Create one? (y/N)";
match input_line stdin with
|"y"->
let title =
print_endline "Title for repository: ";
input_line stdin in
let authors =
print_endline "Authors (format: name <name@email> <http://website>): ";
input_line stdin in
Kosuzu.File_store.file "txt.conf"
(Printf.sprintf "Id: %s\nTitle: %s\nAuthors: %s\n" (Kosuzu.Id.generate ()) title authors);
Kosuzu.File_store.of_kv_file ()
| _ -> print_endline "Create a txt.conf and run publish again"; exit 1
open Kosuzu
let publish pubdir ids =
let kv =
match Kosuzu.File_store.of_kv_file ()
with x when x = Kosuzu.Store.KV.empty -> wizard () | x -> x in
let predicate t = List.mem t.Text.id ids in
let pubdir_source, pubdir = match pubdir with Some d -> "--pubdir ", d | None ->
try "txt.conf:Pubdir", Kosuzu.Store.KV.find "Pubdir" kv with Not_found ->
try "$TXTPUBDIR", Sys.getenv "TXTPUBDIR" with Not_found -> "$TXTPUBDIR", ""
in
let targets = targets pubdir in
if targets = [] then
Printf.eprintf "No target directories in %s='%s' (for example %s)\n"
pubdir_source pubdir (Filename.concat pubdir "public_html")
else begin
let pub_dirs = List.map (fun x -> snd x) targets in
File_store.iter ~predicate (fun (_t, p) ->
try File.file ((List.hd p)::pub_dirs)
with Unix.Unix_error (Unix.EEXIST, _, _) -> ());
List.iter (fun t -> Printf.eprintf "%s %s\n" (fst t) (snd t);
Index.((load (snd t)) false None None None None);
Convert.at_path (fst t) false (snd t))
targets
end
open Cmdliner
let ids = Arg.(value & pos_all string [] & info [] ~docv: "Text ID")
let pubdir = Arg.(value & opt (some string) None & info ["p"; "pubdir"] ~docv: "Directory path" ~doc: "Set top directory for publishing files")
let publish_t = Term.(const publish $ pubdir $ ids)
let cmd =
let doc = "Convert texts into pubnix-style directories if they exist" in
let man = [
`S Manpage.s_description;
`P "This subcommand is meant for people who use this software in shared hosts such as SDF or Tildeverse";
`P "Currently supports conversion to public_gemini (.gmi), public_gopher (.txt), and public_html (.htm[l])";
`S Manpage.s_environment;
`P "TXTPUBDIR - Pubnix-style output directory" ]
in
let info = Cmd.info "publish" ~doc ~man in
Cmd.v info publish_t
(*
let term =
let ids = Arg.(value & pos_all string [] & info [] ~docv:"text ids") in
let pubdir = Arg.(value & opt (some string) None & info ["p"; "pubdir"] ~docv:"directory path"
~doc:"set top directory for publishing files") in
let doc = "convert texts into standard public dirs pubdir/public_{html,gemini,gopher} if they exist" in
Term.(const publish $ pubdir $ ids), Term.info "publish" ~doc ~man:[ `S "DESCRIPTION"; `P doc ]
*)