aboutsummaryrefslogtreecommitdiff
path: root/lib/grep.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/grep.ml')
-rw-r--r--lib/grep.ml69
1 files changed, 69 insertions, 0 deletions
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 -> *)