From 561478ac81367c87718a66e7b2b4c074759d131c Mon Sep 17 00:00:00 2001 From: orbifx Date: Sun, 13 Nov 2022 13:15:15 +0000 Subject: [PATCH] New `edit ` command and updated readme --- cli/dune | 2 +- cli/edit.ml | 16 ++++++++++++++++ cli/read.ml | 22 +--------------------- cli/txt.ml | 3 ++- lib/archive.ml | 17 +++++++++++++++++ readme | 10 ---------- readme.txt | 25 +++++++++++++++++++++++++ 7 files changed, 62 insertions(+), 33 deletions(-) create mode 100644 cli/edit.ml delete mode 100644 readme create mode 100644 readme.txt diff --git a/cli/dune b/cli/dune index 04b1ced..8602fa3 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 read recent) + (modules txt authors convert conversion edit file index last listing new topics html atom gemini publish pull read recent) (libraries text_parse.converter text_parse.parsers logarion msgpck curl str cmdliner)) diff --git a/cli/edit.ml b/cli/edit.ml new file mode 100644 index 0000000..45def8e --- /dev/null +++ b/cli/edit.ml @@ -0,0 +1,16 @@ +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 (Logarion.Archive.apply_sys_util "EDITOR" "nano") $ recurse $ time $ reverse $ number $ authed $ topics $ id), + Term.info "edit" ~doc: "edit a text" ~man:[ `S "DESCRIPTION"; + `P "Launches $EDITOR with text path as parameter. If -R is used, the ID search space + includes texts found in subdirectories too" ] diff --git a/cli/read.ml b/cli/read.ml index 73230bb..7f5d5b7 100644 --- a/cli/read.ml +++ b/cli/read.ml @@ -1,24 +1,4 @@ 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 = @@ -32,7 +12,7 @@ let term = ~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.(const (Archive.apply_sys_util "PAGER" "less") $ recurse $ time $ reverse $ number $ authed $ topics $ id), Term.info "read" ~doc: "read a text" ~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 4268cf5..fe97af9 100644 --- a/cli/txt.ml +++ b/cli/txt.ml @@ -3,12 +3,13 @@ let version = "%%VERSION%%" open Cmdliner let default_cmd = let doc = "Discover, collect & exchange texts" in - let man = [ `S "Contact"; `P "" ] in + let man = [ `S "Contact"; `P "" ] in Term.(ret (const (`Help (`Pager, None)))), Term.info "txt" ~version ~doc ~man let () = match Term.eval_choice default_cmd [ Authors.term; Convert.term; + Edit.term; File.term; File.unfile_term; Index.term; Last.term; diff --git a/lib/archive.ml b/lib/archive.ml index 2d781c1..68343b3 100644 --- a/lib/archive.ml +++ b/lib/archive.ml @@ -14,3 +14,20 @@ let keyworded query_string = let topics query_string = let q = String_set.query query_string in fun n -> String_set.(predicate q (Text.set "Topics" n)) + +let apply_sys_util env def_env r order_opt reverse_opt number_opt authors_opt topics_opt id_opt = + let predicates = if id_opt <> "" then [ ided id_opt ] else [] + @ predicate authored authors_opt + @ predicate topics topics_opt in + let predicate text = List.fold_left (fun a e -> a && e text) true predicates in + let util = try Sys.getenv env with Not_found -> def_env in + let print_text acc (_t, fnames) = Printf.sprintf "%s %s" acc (List.hd fnames) in + let paths = match order_opt with + | false -> File_store.fold ~r ~predicate print_text "" + | true -> + let order = match reverse_opt with true -> File_store.newest | false -> File_store.oldest in + match number_opt with + | Some number -> File_store.fold ~r ~predicate ~order ~number print_text "" + | None -> File_store.fold ~r ~predicate ~order print_text "" + in if paths = "" then () + else (ignore @@ Sys.command @@ Printf.sprintf "%s %s" util paths) diff --git a/readme b/readme deleted file mode 100644 index 2f78940..0000000 --- a/readme +++ /dev/null @@ -1,10 +0,0 @@ -Logarion - discover, collect & exchange plain text files - -Guide: -Header format: - -Source: -Licence: EUPL - -IRC: diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..d3a86fd --- /dev/null +++ b/readme.txt @@ -0,0 +1,25 @@ +ID: ka4wtj +Title: Logarion + +## Guides + +Exploring & pulling texts from Logarion repositories. +<3sqd84.html> + +Creating texts & publishing on the net. + + + +## Contacts + +* Mailing list (anonymous) +* + + +## References + +### Header format + + +### Source +