From b38baf8268559a129d84f6b43a48304efc8d08eb Mon Sep 17 00:00:00 2001 From: orbifx Date: Sun, 19 Jun 2022 22:01:11 +0100 Subject: [PATCH] Txt read & optional path printing for txt list --- cli/dune | 2 +- cli/listing.ml | 34 ++++++++++++++++------------------ cli/read.ml | 38 ++++++++++++++++++++++++++++++++++++++ cli/txt.ml | 1 + lib/archive.ml | 3 +++ 5 files changed, 59 insertions(+), 19 deletions(-) create mode 100644 cli/read.ml diff --git a/cli/dune b/cli/dune index b4d8a0d..f903e2b 100644 --- a/cli/dune +++ b/cli/dune @@ -1,5 +1,5 @@ (executable (name txt) (public_name txt) - (modules txt authors convert conversion file index last listing new topics html atom gemini publish pull) + (modules txt authors convert conversion file index last listing new topics html atom gemini publish pull read) (libraries text_parse.converter text_parse.parsers logarion msgpck curl str cmdliner)) diff --git a/cli/listing.ml b/cli/listing.ml index 5b2c634..3c81bfc 100644 --- a/cli/listing.ml +++ b/cli/listing.ml @@ -1,38 +1,36 @@ open Logarion module FS = File_store module A = Archive -let listing r order_opt reverse_opt number_opt authors_opt topics_opt = - let predicates = A.predicate A.authored authors_opt - @ A.predicate A.topics topics_opt in + +let listing r order_opt reverse_opt number_opt paths_opt authors_opt topics_opt = + let predicates = A.predicate A.authored authors_opt @ A.predicate A.topics topics_opt in let predicate text = List.fold_left (fun a e -> a && e text) true predicates in - let list_text a (t, fnames) = a ^ Printf.sprintf "%s %s %s 𐄁 %s [%s]\n" + let list_text (t, fnames) = Printf.printf "%s %s %s 𐄁 %s%s\n" (Text.short_id t) Date.(pretty_date @@ listing t.Text.date) (Person.Set.to_string ~names_only:true t.Text.authors) - t.Text.title (List.hd fnames) + t.Text.title (if paths_opt then (List.fold_left (Printf.sprintf "%s\n@ %s") "" fnames) else "") in - print_string @@ match order_opt with - | false -> FS.fold ~r ~predicate list_text "" + match order_opt with + | false -> FS.iter ~r ~predicate list_text | true -> let order = match reverse_opt with true -> FS.newest | false -> FS.oldest in match number_opt with - | Some number -> FS.fold ~r ~predicate ~order ~number list_text "" - | None -> FS.fold ~r ~predicate ~order list_text "" + | Some number -> FS.iter ~r ~predicate ~order ~number list_text + | None -> FS.iter ~r ~predicate ~order list_text open Cmdliner let term = - let recurse = Arg.(value & flag & info ["R"] - ~doc:"recursive, include texts in subdirectories too") in - let reverse = Arg.(value & flag & info ["r"] - ~doc:"reverse order") in - let time = Arg.(value & flag & info ["t"] - ~doc:"Sort by time, newest first") in + let recurse = Arg.(value & flag & info ["R"] ~doc:"recurse, include subdirs") in + let reverse = Arg.(value & flag & info ["r"] ~doc:"reverse order") in + let time = Arg.(value & flag & info ["t"] ~doc:"sort by time, newest first") in + let paths = Arg.(value & flag & info ["p"] ~doc:"show file paths") in let number = Arg.(value & opt (some int) None & info ["n"] ~docv:"number" ~doc:"number of entries to list") in let authed = Arg.(value & opt (some string) None & info ["authored"] ~docv:"comma-separated names" ~doc:"texts by authors") in let topics = Arg.(value & opt (some string) None & info ["topics"] ~docv:"comma-separated topics" ~doc:"texts with topics") in - Term.(const listing $ recurse $ time $ reverse $ number $ authed $ topics), + Term.(const listing $ recurse $ time $ reverse $ number $ paths $ authed $ topics), Term.info "list" ~doc:"list texts" ~man:[ `S "DESCRIPTION"; - `P "List header information for current directory. If -R is used, list header - information for texts found in subdirectories too, along with their filepaths" ] + `P "List header information for current directory. If -R is used, list header + information for texts found in subdirectories too, along with their filepaths" ] diff --git a/cli/read.ml b/cli/read.ml new file mode 100644 index 0000000..0d4328e --- /dev/null +++ b/cli/read.ml @@ -0,0 +1,38 @@ +open Logarion +module FS = File_store +module A = Archive + +let print r order_opt reverse_opt number_opt authors_opt topics_opt id_opt = + let predicates = if id_opt <> "" then [ A.ided id_opt ] else [] + @ A.predicate A.authored authors_opt + @ A.predicate A.topics topics_opt in + let predicate text = List.fold_left (fun a e -> a && e text) true predicates in + let pager = try Sys.getenv "PAGER" with Not_found -> "less" in + let print_text acc (_t, fnames) = Printf.sprintf "%s %s" acc (List.hd fnames) in + let paths = match order_opt with + | false -> FS.fold ~r ~predicate print_text "" + | true -> + let order = match reverse_opt with true -> FS.newest | false -> FS.oldest in + match number_opt with + | Some number -> FS.fold ~r ~predicate ~order ~number print_text "" + | None -> FS.fold ~r ~predicate ~order print_text "" + in if paths = "" then () + else (ignore @@ Sys.command @@ Printf.sprintf "%s %s" pager paths) + + +open Cmdliner +let term = + let id = Arg.(value & pos 0 string "" & info [] ~docv:"text ID") in + let recurse = Arg.(value & flag & info ["R"] ~doc:"recurse, include subdirs") in + let reverse = Arg.(value & flag & info ["r"] ~doc:"reverse order") in + let time = Arg.(value & flag & info ["t"] ~doc:"sort by time, newest first") in + let number = Arg.(value & opt (some int) None & info ["n"] + ~docv:"number" ~doc:"number of entries to list") in + let authed = Arg.(value & opt (some string) None & info ["authored"] + ~docv:"comma-separated names" ~doc:"texts by authors") in + let topics = Arg.(value & opt (some string) None & info ["topics"] + ~docv:"comma-separated topics" ~doc:"texts with topics") in + Term.(const print $ recurse $ time $ reverse $ number $ authed $ topics $ id), + Term.info "read" ~doc:"list texts" ~man:[ `S "DESCRIPTION"; + `P "List header information for current directory. If -R is used, list header + information for texts found in subdirectories too, along with their filepaths" ] diff --git a/cli/txt.ml b/cli/txt.ml index 494cb01..ce03ca0 100644 --- a/cli/txt.ml +++ b/cli/txt.ml @@ -16,5 +16,6 @@ let () = match Term.eval_choice default_cmd [ New.term; Publish.term; Pull.term; + Read.term; Topics.term; ] with `Error _ -> exit 1 | _ -> exit 0 diff --git a/lib/archive.ml b/lib/archive.ml index 7a375a7..2d781c1 100644 --- a/lib/archive.ml +++ b/lib/archive.ml @@ -4,6 +4,9 @@ let authored query_string = let q = Person.Set.of_query @@ String_set.query query_string in fun n -> Person.Set.predicate q n.Text.authors +let ided query_string = + fun n -> n.Text.id = query_string + let keyworded query_string = let q = String_set.query query_string in fun n -> String_set.(predicate q (Text.set "Keywords" n))