Commit
+125 -171 +/-4 browse
1 | diff --git a/lib/cmd.ml b/lib/cmd.ml |
2 | index 4c52c94..c2c167c 100644 |
3 | --- a/lib/cmd.ml |
4 | +++ b/lib/cmd.ml |
5 | @@ -190,7 +190,6 @@ Select a note that matches the filter criteria and open it in your text editor. |
6 | | None -> failwith "not found"] |
7 | |
8 | let list_notes = |
9 | - let open Note.Display in |
10 | let open Command.Let_syntax in |
11 | Command.basic ~summary:"list existing notes" |
12 | ~readme:(fun () -> |
13 | @@ -219,8 +218,10 @@ is provided then all notes will be listed. |
14 | Note.Filter.find_many ?strategy:filter_kind ~args:filter_args |
15 | get_notes |
16 | in |
17 | - let text_styles = cfg.styles in |
18 | - to_stdout ~columns ~style ~text_styles notes] |
19 | + let styles = cfg.styles in |
20 | + let cells = Note.to_cells ~columns ~styles notes in |
21 | + Display.to_stdout ~style cells; |
22 | + ] |
23 | |
24 | let sync = |
25 | Command.basic ~summary:"sync notes to a remote server" |
26 | diff --git a/lib/display.ml b/lib/display.ml |
27 | new file mode 100644 |
28 | index 0000000..4036af7 |
29 | --- /dev/null |
30 | +++ b/lib/display.ml |
31 | @@ -0,0 +1,70 @@ |
32 | + open Core |
33 | + open ANSITerminal |
34 | + |
35 | + type cell = string * int * int |
36 | + |
37 | + type row = cell list |
38 | + |
39 | + let fixed_spacing cells = |
40 | + (* find the maximum cell length per column *) |
41 | + let maximum_values = |
42 | + List.fold ~init:[] |
43 | + ~f:(fun accm row -> |
44 | + List.mapi |
45 | + ~f:(fun i col -> |
46 | + let col_length = snd3 col in |
47 | + let current_max = |
48 | + match List.nth accm i with Some len -> len | None -> 0 |
49 | + in |
50 | + if col_length > current_max then col_length + 2 else current_max) |
51 | + row) |
52 | + cells |
53 | + in |
54 | + maximum_values |
55 | + |
56 | + let fix_right cells = |
57 | + let widths = fixed_spacing cells in |
58 | + let term_width, _ = size () in |
59 | + let _, right = List.split_n widths 1 in |
60 | + let col_one = List.nth_exn widths 0 in |
61 | + [ col_one + (term_width - List.fold ~init:5 ~f:( + ) widths) ] @ right |
62 | + |
63 | + let apply cells widths = |
64 | + (* let maximums = fixed_spacing cells in *) |
65 | + let cells = |
66 | + List.map |
67 | + ~f:(fun row -> |
68 | + List.mapi |
69 | + ~f:(fun i entry -> |
70 | + let max = List.nth_exn widths i in |
71 | + let text, length, padding = entry in |
72 | + let padding = padding + (max - length) in |
73 | + let padding = if padding > 0 then padding else 0 in |
74 | + (text, length, padding)) |
75 | + row) |
76 | + cells |
77 | + in |
78 | + List.fold ~init:[] |
79 | + ~f:(fun accm row -> |
80 | + accm |
81 | + @ [ |
82 | + List.fold ~init:"" |
83 | + ~f:(fun accm cell -> |
84 | + let text, _, padding = cell in |
85 | + String.concat [ accm; text; String.make padding ' ' ]) |
86 | + row; |
87 | + ]) |
88 | + cells |
89 | + |
90 | + let to_stdout ~style cells = |
91 | + match style with |
92 | + | `Simple -> |
93 | + List.iter |
94 | + ~f:(fun cell -> |
95 | + print_endline |
96 | + (let value = List.nth_exn cell 0 in |
97 | + let text = fst3 value in |
98 | + text)) |
99 | + cells |
100 | + | `Fixed -> List.iter ~f:print_endline (apply cells (fixed_spacing cells)) |
101 | + | `Wide -> List.iter ~f:print_endline (apply cells (fix_right cells)) |
102 | diff --git a/lib/note.ml b/lib/note.ml |
103 | index fe4328c..636a293 100644 |
104 | --- a/lib/note.ml |
105 | +++ b/lib/note.ml |
106 | @@ -22,7 +22,8 @@ let get_title t = |
107 | in |
108 | match title with |
109 | | Some title -> title |
110 | - (* Since we couldn't determine the title from frontmatter now we will infer the title by looking at the markdown *) |
111 | + (* Since we couldn't determine the title from frontmatter now we will |
112 | + infer the title by looking at the markdown *) |
113 | | None -> ( |
114 | let title = |
115 | List.find |
116 | @@ -66,7 +67,6 @@ let get_data t = |
117 | | "JSON" | "Json" | "json" -> |
118 | Some (Ezjsonm.value (Ezjsonm.from_string data)) |
119 | | "YAML" | "Yaml" | "yaml" -> Some (Yaml.of_string_exn data) |
120 | - (* TODO Sexp, ...?? *) |
121 | | _ -> None ) |
122 | | _ -> None) |
123 | t.markdown |
124 | @@ -202,131 +202,58 @@ module Filter = struct |
125 | notes |
126 | end |
127 | |
128 | - module Display = struct |
129 | - open ANSITerminal |
130 | + open ANSITerminal |
131 | |
132 | - type cell = string * int * int |
133 | + let paint_tag (styles : Config.StylePair.t list) text : string = |
134 | + match List.find ~f:(fun entry -> String.equal entry.pattern text) styles with |
135 | + | Some entry -> sprintf entry.styles "%s" text |
136 | + | None -> sprintf [ Foreground Default ] "%s" text |
137 | |
138 | - type row = cell list |
139 | - |
140 | - let paint_tag (styles : Config.StylePair.t list) text : string = |
141 | - match |
142 | - List.find ~f:(fun entry -> String.equal entry.pattern text) styles |
143 | - with |
144 | - | Some entry -> sprintf entry.styles "%s" text |
145 | - | None -> sprintf [ Foreground Default ] "%s" text |
146 | - |
147 | - let to_cells columns styles notes = |
148 | - let header = |
149 | - List.map |
150 | - ~f:(fun column -> |
151 | - let text_value = Config.Column.to_string column in |
152 | - let text_length = String.length text_value in |
153 | - let text_value = sprintf [ Bold; Underlined ] "%s" text_value in |
154 | - (text_value, text_length, 1)) |
155 | - columns |
156 | - in |
157 | - let note_cells = |
158 | - let default_padding = 1 in |
159 | - List.fold ~init:[] |
160 | - ~f:(fun accm note -> |
161 | - accm |
162 | - @ [ |
163 | - List.map |
164 | - ~f:(fun column -> |
165 | - match column with |
166 | - | `Title -> |
167 | - let text_value = get_title note in |
168 | - (text_value, String.length text_value, default_padding) |
169 | - | `Description -> |
170 | - let text_value = get_description note in |
171 | - (text_value, String.length text_value, default_padding) |
172 | - | `Tags -> |
173 | - let text_value = String.concat ~sep:"|" (get_tags note) in |
174 | - let text_length = String.length text_value in |
175 | - let tags = get_tags note in |
176 | - let tags = |
177 | - List.map ~f:(fun tag -> paint_tag styles tag) tags |
178 | - in |
179 | - let text_value = String.concat ~sep:"|" tags in |
180 | - (text_value, text_length, default_padding) |
181 | - | `WordCount -> |
182 | - let text_value = |
183 | - Core.sprintf "%d" |
184 | - (List.length (Util.to_words note.markdown)) |
185 | - in |
186 | - (text_value, String.length text_value, default_padding) |
187 | - | `Slug -> |
188 | - let text_value = Slug.to_string note.slug in |
189 | - (text_value, String.length text_value, default_padding)) |
190 | - columns; |
191 | - ]) |
192 | - notes |
193 | - in |
194 | - [ header ] @ note_cells |
195 | - |
196 | - let fixed_spacing cells = |
197 | - (* find the maximum cell length per column *) |
198 | - let maximum_values = |
199 | - List.fold ~init:[] |
200 | - ~f:(fun accm row -> |
201 | - List.mapi |
202 | - ~f:(fun i col -> |
203 | - let col_length = snd3 col in |
204 | - let current_max = |
205 | - match List.nth accm i with Some len -> len | None -> 0 |
206 | - in |
207 | - if col_length > current_max then col_length + 2 else current_max) |
208 | - row) |
209 | - cells |
210 | - in |
211 | - maximum_values |
212 | - |
213 | - let fix_right cells = |
214 | - let widths = fixed_spacing cells in |
215 | - let term_width, _ = size () in |
216 | - let _, right = List.split_n widths 1 in |
217 | - let col_one = List.nth_exn widths 0 in |
218 | - [ col_one + (term_width - List.fold ~init:5 ~f:( + ) widths) ] @ right |
219 | - |
220 | - let apply cells widths = |
221 | - (* let maximums = fixed_spacing cells in *) |
222 | - let cells = |
223 | - List.map |
224 | - ~f:(fun row -> |
225 | - List.mapi |
226 | - ~f:(fun i entry -> |
227 | - let max = List.nth_exn widths i in |
228 | - let text, length, padding = entry in |
229 | - let padding = padding + (max - length) in |
230 | - let padding = if padding > 0 then padding else 0 in |
231 | - (text, length, padding)) |
232 | - row) |
233 | - cells |
234 | - in |
235 | + let to_cells ~columns ~styles notes = |
236 | + let header = |
237 | + List.map |
238 | + ~f:(fun column -> |
239 | + let text_value = Config.Column.to_string column in |
240 | + let text_length = String.length text_value in |
241 | + let text_value = sprintf [ Bold; Underlined ] "%s" text_value in |
242 | + (text_value, text_length, 1)) |
243 | + columns |
244 | + in |
245 | + let note_cells = |
246 | + let default_padding = 1 in |
247 | List.fold ~init:[] |
248 | - ~f:(fun accm row -> |
249 | + ~f:(fun accm note -> |
250 | accm |
251 | @ [ |
252 | - List.fold ~init:"" |
253 | - ~f:(fun accm cell -> |
254 | - let text, _, padding = cell in |
255 | - String.concat [ accm; text; String.make padding ' ' ]) |
256 | - row; |
257 | + List.map |
258 | + ~f:(fun column -> |
259 | + match column with |
260 | + | `Title -> |
261 | + let text_value = get_title note in |
262 | + (text_value, String.length text_value, default_padding) |
263 | + | `Description -> |
264 | + let text_value = get_description note in |
265 | + (text_value, String.length text_value, default_padding) |
266 | + | `Tags -> |
267 | + let text_value = String.concat ~sep:"|" (get_tags note) in |
268 | + let text_length = String.length text_value in |
269 | + let tags = get_tags note in |
270 | + let tags = |
271 | + List.map ~f:(fun tag -> paint_tag styles tag) tags |
272 | + in |
273 | + let text_value = String.concat ~sep:"|" tags in |
274 | + (text_value, text_length, default_padding) |
275 | + | `WordCount -> |
276 | + let text_value = |
277 | + Core.sprintf "%d" |
278 | + (List.length (Util.to_words note.markdown)) |
279 | + in |
280 | + (text_value, String.length text_value, default_padding) |
281 | + | `Slug -> |
282 | + let text_value = Slug.to_string note.slug in |
283 | + (text_value, String.length text_value, default_padding)) |
284 | + columns; |
285 | ]) |
286 | - cells |
287 | - |
288 | - let to_stdout ~columns ~style ~text_styles notes = |
289 | - let cells = to_cells columns text_styles notes in |
290 | - match style with |
291 | - | `Simple -> |
292 | - List.iter |
293 | - ~f:(fun cell -> |
294 | - print_endline |
295 | - (let value = List.nth_exn cell 0 in |
296 | - let text = fst3 value in |
297 | - text)) |
298 | - cells |
299 | - | `Fixed -> List.iter ~f:print_endline (apply cells (fixed_spacing cells)) |
300 | - | `Wide -> List.iter ~f:print_endline (apply cells (fix_right cells)) |
301 | - end |
302 | + notes |
303 | + in |
304 | + [ header ] @ note_cells |
305 | diff --git a/lib/note.mli b/lib/note.mli |
306 | deleted file mode 100644 |
307 | index b5a17e1..0000000 |
308 | --- a/lib/note.mli |
309 | +++ /dev/null |
310 | @@ -1,44 +0,0 @@ |
311 | - type t |
312 | - |
313 | - val build : ?tags:string list -> ?content:string -> title:string -> Slug.t -> t |
314 | - (** build a new note *) |
315 | - |
316 | - val get_title : t -> string |
317 | - (** access the title of a note *) |
318 | - |
319 | - val get_description : t -> string |
320 | - (** access the description of a note *) |
321 | - |
322 | - val get_path : t -> string |
323 | - (** access the absolute path of a note *) |
324 | - |
325 | - val to_string : t -> string |
326 | - (** convert a note into a string *) |
327 | - |
328 | - val of_string : data:string -> Slug.t -> t |
329 | - (** decode a note from a string *) |
330 | - |
331 | - module Encoding : sig |
332 | - val to_string : style:[< `Raw | `Json | `Yaml ] -> t -> string |
333 | - end |
334 | - |
335 | - module Filter : sig |
336 | - type strategy = Keys | Fulltext |
337 | - |
338 | - val find_one : ?strategy:strategy -> args:string list -> t list -> t option |
339 | - |
340 | - val find_many : ?strategy:strategy -> args:string list -> t list -> t list |
341 | - end |
342 | - |
343 | - module Display : sig |
344 | - type cell = string * int * int |
345 | - |
346 | - type row = cell list |
347 | - |
348 | - val to_stdout : |
349 | - columns:Config.Column.t list -> |
350 | - style:Config.ListStyle.t -> |
351 | - text_styles:Config.StylePair.t list -> |
352 | - t list -> |
353 | - unit |
354 | - end |