|
@@ -12,81 +12,43 @@
|
|
|
*)
|
|
|
|
|
|
type dir = Dir of string
|
|
|
-
|
|
|
+type datetime = Datetime of string
|
|
|
type title = Title of string
|
|
|
-
|
|
|
type tag = Tag of string
|
|
|
-
|
|
|
type ext = Ext of string
|
|
|
-
|
|
|
-(* A tuple would suffice because everything is semantically strict typed. *)
|
|
|
-type parsed_name = {
|
|
|
- dirs : dir list;
|
|
|
- datetime : Datetime.t option;
|
|
|
- title : title;
|
|
|
- tags : tag list;
|
|
|
- exts : ext list;
|
|
|
-}
|
|
|
+type t = dir list * datetime option * title * tag list * ext list
|
|
|
|
|
|
(* https://caml.inria.fr/pub/docs/manual-ocaml/libref/Sys.html *)
|
|
|
|
|
|
module P = struct
|
|
|
open Tyre
|
|
|
|
|
|
- let dir' =
|
|
|
- let to_ s = Dir s and of_ (Dir o) = o in
|
|
|
- conv to_ of_ (pcre "[^/]*/")
|
|
|
+ let dir' = conv (fun s -> Dir s) (fun (Dir o) -> o) (pcre "[^/]*/")
|
|
|
|
|
|
let datetime =
|
|
|
- let to_ (((((dy, dm), dd), th), tm), ts) =
|
|
|
- let i = int_of_string in
|
|
|
- Datetime.create ((i dy, i dm, i dd), (i th, i tm, i ts))
|
|
|
- and of_
|
|
|
- ( (Datetime.Year dy, Datetime.Month dm, Datetime.Day dd),
|
|
|
- (Datetime.Hour th, Datetime.Minute tm, Datetime.Second ts) ) =
|
|
|
- let s = string_of_int in
|
|
|
- (((((s dy, s dm), s dd), s th), s tm), s ts)
|
|
|
- in
|
|
|
- conv to_ of_
|
|
|
- (pcre "[0-9]{4}" <* char '-'
|
|
|
- <&> pcre "01|02|03|04|05|06|07|08|09|10|11|12"
|
|
|
- <* char '-' <&> pcre "[0-3][0-9]" <* char '-' <&> pcre "[0-2][0-9]"
|
|
|
- <&> pcre "[0-5][0-9]" <&> pcre "[0-5][0-9]")
|
|
|
-
|
|
|
- (* brings the trailing - *)
|
|
|
- let string_of_datetime
|
|
|
- ( (Datetime.Year dy, Datetime.Month dm, Datetime.Day dd),
|
|
|
- (Datetime.Hour th, Datetime.Minute tm, Datetime.Second ts) ) =
|
|
|
- Format.sprintf "%04d-%02d-%02d-%02d%02d%02d-" dy dm dd th tm ts
|
|
|
-
|
|
|
- let tit' =
|
|
|
- let to_ s = Title s and of_ (Title o) = o in
|
|
|
- conv to_ of_ (pcre "[^/]*?")
|
|
|
-
|
|
|
- let tag' =
|
|
|
- let to_ s = Tag s and of_ (Tag o) = o in
|
|
|
- conv to_ of_ (pcre "[^_.]+")
|
|
|
-
|
|
|
+ conv
|
|
|
+ (fun s -> Datetime s)
|
|
|
+ (fun (Datetime o) -> o)
|
|
|
+ (pcre
|
|
|
+ ("[0-9]{4}" ^ "-" ^ "01|02|03|04|05|06|07|08|09|10|11|12" ^ "-"
|
|
|
+ ^ "[0-3][0-9]" ^ "-" ^ "[0-2][0-9]" ^ "[0-5][0-9]" ^ "[0-5][0-9]"))
|
|
|
+
|
|
|
+ let tit' = conv (fun s -> Title s) (fun (Title o) -> o) (pcre "[^/]*?")
|
|
|
+ let tag' = conv (fun s -> Tag s) (fun (Tag o) -> o) (pcre "[^_.]+")
|
|
|
let sep' = "_"
|
|
|
-
|
|
|
let sep = "_--"
|
|
|
-
|
|
|
let tags' = str sep *> list (str sep' *> tag')
|
|
|
-
|
|
|
- let ext' =
|
|
|
- let to_ s = Ext s and of_ (Ext o) = o in
|
|
|
- conv to_ of_ (pcre "[.][^.]*")
|
|
|
+ let ext' = conv (fun s -> Ext s) (fun (Ext o) -> o) (pcre "[.][^.]*")
|
|
|
|
|
|
(* https://gabriel.radanne.net/papers/tyre/tyre_paper.pdf#page=9 *)
|
|
|
let full =
|
|
|
- let to_ (dirs, (datetime, ((title, ta), exts))) =
|
|
|
- let tags = match ta with None -> [] | Some t -> t in
|
|
|
- { dirs; datetime; title; tags; exts }
|
|
|
- and of_ { dirs; datetime; title; tags; exts } =
|
|
|
- let ta = match tags with [] -> None | t -> Some t in
|
|
|
- (dirs, (datetime, ((title, ta), exts)))
|
|
|
- in
|
|
|
- conv to_ of_
|
|
|
+ conv
|
|
|
+ (fun (dirs, (datetime, ((title, ta), exts))) ->
|
|
|
+ let tags = match ta with None -> [] | Some t -> t in
|
|
|
+ (dirs, datetime, title, tags, exts))
|
|
|
+ (fun (dirs, datetime, title, tags, exts) ->
|
|
|
+ let ta = match tags with [] -> None | t -> Some t in
|
|
|
+ (dirs, (datetime, ((title, ta), exts))))
|
|
|
(list dir'
|
|
|
<&> (opt (datetime <* char '-')
|
|
|
<&> (tit' <&> opt tags' <&> list ext')
|
|
@@ -95,24 +57,19 @@ module P = struct
|
|
|
let full' = compile full
|
|
|
end
|
|
|
|
|
|
-let parse str : parsed_name =
|
|
|
+let parse str : t =
|
|
|
match Tyre.exec P.full' str with
|
|
|
| Error _ -> failwith "gibt's nicht."
|
|
|
| Ok n -> n
|
|
|
|
|
|
-let unparse p : string =
|
|
|
- (* Tyre.eval P.full p *)
|
|
|
- let dt =
|
|
|
- match p.datetime with None -> "" | Some dt -> P.string_of_datetime dt
|
|
|
- and tagpart =
|
|
|
- p.tags
|
|
|
- |> List.map (function Tag o -> o)
|
|
|
- |> List.cons P.sep |> String.concat P.sep'
|
|
|
- in
|
|
|
- p.exts
|
|
|
- |> List.map (function Ext o -> o)
|
|
|
- |> List.cons tagpart
|
|
|
- |> List.cons (match p.title with Title t -> t)
|
|
|
- |> List.cons dt
|
|
|
- |> List.append (p.dirs |> List.map (function Dir o -> o))
|
|
|
- |> String.concat ""
|
|
|
+let unparse p : string = Tyre.eval P.full p
|
|
|
+
|
|
|
+let tag_add (drs, tim, tit, tags, xts) tag =
|
|
|
+ (drs, tim, tit, tags |> List.cons tag |> List.sort_uniq compare, xts)
|
|
|
+
|
|
|
+let tag_del (drs, tim, tit, tags, xts) tag =
|
|
|
+ ( drs,
|
|
|
+ tim,
|
|
|
+ tit,
|
|
|
+ tags |> List.sort_uniq compare |> List.filter (fun x -> tag <> x),
|
|
|
+ xts )
|