diff --git a/dune-project b/dune-project index 924f00d..8c748b6 100644 --- a/dune-project +++ b/dune-project @@ -21,14 +21,10 @@ dune (ANSITerminal (>= "0.8.5")) (cmdliner (>= "1.2.0")) - core_unix (ezcurl (>= "0.2.4")) (minttea (>= "0.0.2")) shape-the-term (terminal_size (>= "0.2.0")) - uuseg ) (tags (tui cli git github))) - -; See the complete stanza docs at https://dune.readthedocs.io/en/stable/dune-files.html#dune-project diff --git a/github_tui.opam b/github_tui.opam index 5735825..6bbe069 100644 --- a/github_tui.opam +++ b/github_tui.opam @@ -13,12 +13,10 @@ depends: [ "dune" {>= "3.12"} "ANSITerminal" {>= "0.8.5"} "cmdliner" {>= "1.2.0"} - "core_unix" "ezcurl" {>= "0.2.4"} "minttea" {>= "0.0.2"} "shape-the-term" "terminal_size" {>= "0.2.0"} - "uuseg" "odoc" {with-doc} ] build: [ diff --git a/lib/cli.ml b/lib/cli.ml index 6e4a9ee..6cf54d0 100644 --- a/lib/cli.ml +++ b/lib/cli.ml @@ -11,7 +11,7 @@ let path_arg = & opt string "." & info [ "d"; "directory" ] ~docv:"DIRECTORY_PATH" ~doc) -let gh_tui_term = Term.(const Tui.App.start $ repo_arg $ path_arg) +let gh_tui_term = Term.(const Tui.start $ repo_arg $ path_arg) let cmd = let doc = "TUI of a GitHub repository" in diff --git a/lib/dune b/lib/dune index 885f968..33ff28e 100644 --- a/lib/dune +++ b/lib/dune @@ -1,13 +1,7 @@ -(include_subdirs qualified) - (library (name github_tui) (libraries - ANSITerminal cmdliner - core_unix.command_unix ezcurl - minttea - shape-the-term - terminal_size - uuseg.string)) + ;; Internal dependencies + tui)) diff --git a/lib/extra/dune b/lib/extra/dune new file mode 100644 index 0000000..aeb4d5c --- /dev/null +++ b/lib/extra/dune @@ -0,0 +1,3 @@ +(library + (name extra) + (libraries shape-the-term)) diff --git a/lib/extra/extra.ml b/lib/extra/extra.ml new file mode 100644 index 0000000..9a7da6c --- /dev/null +++ b/lib/extra/extra.ml @@ -0,0 +1,2 @@ +module List = List_extra +module String = String_extra diff --git a/lib/list_extra.ml b/lib/extra/list_extra.ml similarity index 100% rename from lib/list_extra.ml rename to lib/extra/list_extra.ml diff --git a/lib/string_extra.ml b/lib/extra/string_extra.ml similarity index 100% rename from lib/string_extra.ml rename to lib/extra/string_extra.ml diff --git a/lib/fs/dune b/lib/fs/dune new file mode 100644 index 0000000..da81c55 --- /dev/null +++ b/lib/fs/dune @@ -0,0 +1,5 @@ +(library + (name fs) + (libraries + ;; Internal dependencies + pretty)) diff --git a/lib/fs.ml b/lib/fs/fs.ml similarity index 100% rename from lib/fs.ml rename to lib/fs/fs.ml diff --git a/lib/fs.mli b/lib/fs/fs.mli similarity index 100% rename from lib/fs.mli rename to lib/fs/fs.mli diff --git a/lib/pretty/dune b/lib/pretty/dune new file mode 100644 index 0000000..2558be0 --- /dev/null +++ b/lib/pretty/dune @@ -0,0 +1,7 @@ +(library + (name pretty) + (libraries + ANSITerminal + shell + ;; Internal dependencies + extra)) diff --git a/lib/line.ml b/lib/pretty/line.ml similarity index 81% rename from lib/line.ml rename to lib/pretty/line.ml index 90911ca..fc99b31 100644 --- a/lib/line.ml +++ b/lib/pretty/line.ml @@ -10,7 +10,7 @@ let fmt_chunk { styles; string } = ANSITerminal.sprintf styles "%s" string let replicate_chunk width s = if width <= 0 then { styles = []; string = "" } else - let filling = String_extra.repeat_txt width s in + let filling = Extra.String.repeat_txt width s in { styles = []; string = filling } type t = { @@ -23,14 +23,14 @@ let length line = line.length let of_chunks chunks = let length = List.fold_left - (fun acc { string; _ } -> acc + String_extra.width string) + (fun acc { string; _ } -> acc + Extra.String.width string) 0 chunks in { chunks; length } let prepend_chunk chunk line = let chunks = chunk :: line.chunks in - let length = String_extra.width chunk.string + line.length in + let length = Extra.String.width chunk.string + line.length in { chunks; length } let append line1 line2 = diff --git a/lib/line.mli b/lib/pretty/line.mli similarity index 100% rename from lib/line.mli rename to lib/pretty/line.mli diff --git a/lib/pretty.ml b/lib/pretty/pretty.ml similarity index 96% rename from lib/pretty.ml rename to lib/pretty/pretty.ml index af26887..f9e0059 100644 --- a/lib/pretty.ml +++ b/lib/pretty/pretty.ml @@ -64,7 +64,7 @@ and horizontal_to_lines ~width cols = (* WARNING: The leftmost horizontal fill will consume all the remaining width *) let remaining_width = width - size_taken in let rendered = render_to_lines ~width:remaining_width other in - let max_line_width = List_extra.max_on Line.length rendered in + let max_line_width = Extra.List.max_on Line.length rendered in (size_taken + max_line_width, Rendered rendered) in (* TODO: Adding to the end of the list is suboptimal *) @@ -99,4 +99,4 @@ and horizontal_to_lines ~width cols = | hd :: tl -> List.fold_left zip_lines hd tl let render ~width doc = - doc |> render_to_lines ~width |> List.map Line.fmt |> String_extra.unlines + doc |> render_to_lines ~width |> List.map Line.fmt |> Extra.String.unlines diff --git a/lib/pretty.mli b/lib/pretty/pretty.mli similarity index 100% rename from lib/pretty.mli rename to lib/pretty/pretty.mli diff --git a/lib/shell/dune b/lib/shell/dune new file mode 100644 index 0000000..853cfb8 --- /dev/null +++ b/lib/shell/dune @@ -0,0 +1,2 @@ +(library + (name shell)) diff --git a/lib/shell.ml b/lib/shell/shell.ml similarity index 100% rename from lib/shell.ml rename to lib/shell/shell.ml diff --git a/lib/tui/dune b/lib/tui/dune new file mode 100644 index 0000000..836fdec --- /dev/null +++ b/lib/tui/dune @@ -0,0 +1,11 @@ +(library + (name tui) + (libraries + ANSITerminal + minttea + terminal_size + ;; Internal dependencies + extra + fs + pretty + scroll)) diff --git a/lib/tui/scroll/dune b/lib/tui/scroll/dune new file mode 100644 index 0000000..7b06792 --- /dev/null +++ b/lib/tui/scroll/dune @@ -0,0 +1,2 @@ +(library + (name scroll)) diff --git a/lib/scroll.ml b/lib/tui/scroll/scroll.ml similarity index 100% rename from lib/scroll.ml rename to lib/tui/scroll/scroll.ml diff --git a/lib/scroll.mli b/lib/tui/scroll/scroll.mli similarity index 100% rename from lib/scroll.mli rename to lib/tui/scroll/scroll.mli diff --git a/lib/tui/app.ml b/lib/tui/tui.ml similarity index 100% rename from lib/tui/app.ml rename to lib/tui/tui.ml diff --git a/lib/tui/tui.mli b/lib/tui/tui.mli new file mode 100644 index 0000000..dc25363 --- /dev/null +++ b/lib/tui/tui.mli @@ -0,0 +1 @@ +val start : string -> string -> unit diff --git a/lib/tui/widget.ml b/lib/tui/widget.ml index 47de726..04984ca 100644 --- a/lib/tui/widget.ml +++ b/lib/tui/widget.ml @@ -76,7 +76,7 @@ let file_contents_to_doc ~(file_contents : Fs.file_contents) = let offset = file_contents.offset in let contents_span = - List_extra.of_sub_array ~offset ~len:span file_contents.lines + Extra.List.of_sub_array ~offset ~len:span file_contents.lines in let scroll_doc = scroll ~lines ~span ~offset in @@ -96,11 +96,11 @@ let file_name_padding = 6 let max_file_name_len files = files - |> Array.map (fun file -> file |> Fs.file_name |> String_extra.width) + |> Array.map (fun file -> file |> Fs.file_name |> Extra.String.width) |> Array.fold_left max 0 let fmt_file ~max_name_len (tree : Fs.tree) = - let pad = String_extra.fill_right max_name_len in + let pad = Extra.String.fill_right max_name_len in match tree with | File (name, _) -> file_char ^ " " ^ pad name | Dir (name, [||]) -> empty_dir_char ^ " " ^ pad name @@ -112,9 +112,9 @@ let current_level_to_doc (cursor : Fs.dir_cursor) ~has_next ~is_file_chosen = let max_len = max_name_len + file_name_padding in (* Frame *) - let top = "╭" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "╮" in - let mid = "├" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "┤" in - let bot = "╰" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "╯" in + let top = "╭" ^ Extra.String.repeat_txt (max_len - 2) "─" ^ "╮" in + let mid = "├" ^ Extra.String.repeat_txt (max_len - 2) "─" ^ "┤" in + let bot = "╰" ^ Extra.String.repeat_txt (max_len - 2) "─" ^ "╯" in (* Line *) let fmt_selected_name file = "│ " ^ fmt_file ~max_name_len file ^ " ├" in @@ -129,7 +129,7 @@ let current_level_to_doc (cursor : Fs.dir_cursor) ~has_next ~is_file_chosen = |> List.mapi (fun i file -> if i = cursor.pos && has_next then fmt_selected_name file else fmt_name file) - |> List_extra.in_between ~sep:mid + |> Extra.List.in_between ~sep:mid |> (fun lines -> [ top ] @ lines @ [ bot ]) |> List.mapi (fun i s -> if i = hi_pos - 1 || i = hi_pos || i = hi_pos + 1 then fmt style s @@ -142,9 +142,9 @@ let children_to_doc ~prev_total ~pos children = let max_len = max_name_len + file_name_padding in (* Frame *) - let top = " ╭" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "╮" in - let mid = "│ ├" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "┤" in - let bot = " ╰" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "╯" in + let top = " ╭" ^ Extra.String.repeat_txt (max_len - 2) "─" ^ "╮" in + let mid = "│ ├" ^ Extra.String.repeat_txt (max_len - 2) "─" ^ "┤" in + let bot = " ╰" ^ Extra.String.repeat_txt (max_len - 2) "─" ^ "╯" in (* Connector arrow *) let prev_rows_count = (2 * prev_total) + 1 in @@ -174,7 +174,7 @@ let children_to_doc ~prev_total ~pos children = children |> Array.to_list |> List.mapi fmt_name - |> List_extra.in_between ~sep:mid + |> Extra.List.in_between ~sep:mid |> (fun lines -> [ top ] @ lines @ [ bot ]) |> (fun lines -> let pad_before = List.init (max (connect_pos - 1) 0) (fun _ -> "") in