From fde592dbbb97a89a498feb95f97bee674bd571e8 Mon Sep 17 00:00:00 2001 From: Marc Coquand Date: Mon, 13 May 2024 13:35:36 -0500 Subject: Refactor --- lib/grep.ml | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 lib/grep.ml (limited to 'lib/grep.ml') diff --git a/lib/grep.ml b/lib/grep.ml new file mode 100644 index 0000000..a6ba300 --- /dev/null +++ b/lib/grep.ml @@ -0,0 +1,69 @@ +let execution_directory = + Sys.getenv_opt "STICH_DIRECTORY" |> Option.value ~default:"/home/mccd/notes-example" + + +let grep_cmd = Sys.getenv_opt "STICH_GREP_CMD" |> Option.value ~default:"ugrep" + +let run_print ~dir args = + let open Shexp_process in + let open Shexp_process.Infix in + eval (chdir dir (call args |- read_all)) + + +let get_headlines () = + run_print + ~dir:execution_directory + [ grep_cmd; "^\\*"; "-H"; "-r"; "-n"; "--separator=|" ] + + +exception Not_A_Tuple of string * string + +(** Returns a tuple of file name and Content *) +let parse_headlines s = + String.split_on_char '\n' s + (* Testing in utop it seems like there is maybe a bug with bounded_split, 1 doesn't work for ':'. Therefore using a slower implementation. *) + |> List.filter_map (fun message -> + if String.equal message "" + then None + else ( + let split = Str.bounded_split (Str.regexp "|") message 3 in + match split with + (* file, line, content *) + | [ file_name; _; content ] -> Some (file_name, content) + | _ -> raise (Not_A_Tuple (String.concat " SPLIT " split, message)))) + |> Array.of_list + + +(** Used for pretty printing *) +let get_padding list = + Array.fold_left (fun n (file_name, _) -> Int.max n (String.length file_name)) 0 list + + +let pad str n = + let padding = n - String.length str in + String.concat "" [ str; String.make padding ' ' ] + + +(** Turns "2024-03-05.org:* Hello world" into "2024-03-05 | * Hello world" *) +let pretty_format parsed_headlines = + let padding = get_padding parsed_headlines in + Array.map + (fun (file_name, content) -> String.concat " | " [ pad file_name padding; content ]) + parsed_headlines + + +(** Full body parsing *) + +let get_full_content () = + run_print + ~dir:execution_directory + [ grep_cmd; "^\\*"; "-h"; "-r"; "-n"; "-C"; "9999"; "--separator='|'" ] + +(* let parse_file_headline collection full = *) +(* match full with *) +(* | s :: r -> *) +(* let split = Str.bounded_split (Str.regexp ":1:") s 1 in *) +(* (match split with *) +(* (\* file, line, content *\) *) +(* | [ file_name; content ] -> file_name, content *) +(* | rest -> *) -- cgit v1.2.3