storage of ymd; change of date type

This commit is contained in:
Stavros Polymenis 2016-09-18 00:00:51 +01:00
parent 42df13ce29
commit dfac88e776
3 changed files with 38 additions and 9 deletions

View File

@ -3,7 +3,7 @@ all: web
web: logarion.cmx html.cmx src/web.ml web: logarion.cmx html.cmx src/web.ml
ocamlfind ocamlopt -o logarion-web -linkpkg \ ocamlfind ocamlopt -o logarion-web -linkpkg \
-package opium.unix,omd,str,tyxml,lens \ -package opium.unix,omd,str,tyxml,lens,ptime,ptime.clock.os \
logarion.cmx html.cmx src/web.ml logarion.cmx html.cmx src/web.ml
html.cmx: src/html.ml logarion.cmx html.cmx: src/html.ml logarion.cmx
@ -13,5 +13,5 @@ html.cmx: src/html.ml logarion.cmx
logarion.cmx: src/logarion.ml logarion.cmx: src/logarion.ml
ocamlfind ocamlopt -c -o logarion.cmx -linkpkg \ ocamlfind ocamlopt -c -o logarion.cmx -linkpkg \
-package omd,lens,lens.ppx_deriving \ -package omd,lens,lens.ppx_deriving,ptime \
src/logarion.ml src/logarion.ml

View File

@ -6,14 +6,14 @@ type author = {
} [@@deriving lens] } [@@deriving lens]
type date = { type date = {
edited: float; edited: Ptime.t option;
published: float; published: Ptime.t option;
} [@@deriving lens] } [@@deriving lens]
type meta = { type meta = {
title: string; title: string;
author: author; author: author;
dates: date; date: date;
categories: string list; categories: string list;
topics: string list; topics: string list;
keywords: string list; keywords: string list;
@ -30,7 +30,7 @@ open Str
let blank_meta = { let blank_meta = {
title = ""; author = { name = ""; email = "" }; title = ""; author = { name = ""; email = "" };
dates = { edited = 0.0; published = 0.0 }; date = { edited = None; published = None };
categories = []; topics = []; keywords = []; series = []; categories = []; topics = []; keywords = []; series = [];
abstract = "" abstract = ""
} }
@ -41,7 +41,7 @@ let blank_ymd =
let load_file f = let load_file f =
let ic = open_in f in let ic = open_in f in
let n = in_channel_length ic in let n = in_channel_length ic in
let s = String.create n in let s = Bytes.create n in
really_input ic s 0 n; really_input ic s 0 n;
close_in ic; close_in ic;
(s) (s)
@ -55,9 +55,12 @@ let meta_field line =
let meta_of_yaml yaml = let meta_of_yaml yaml =
let lines = split (regexp "\n") yaml in let lines = split (regexp "\n") yaml in
let fields = List.map meta_field lines in let fields = List.map meta_field lines in
let open Lens.Infix in
let field_map meta (k,v) = match k with let field_map meta (k,v) = match k with
| "title" -> { meta with title = v } | "title" -> { meta with title = v }
| "abstract" -> { meta with abstract = v } | "abstract" -> { meta with abstract = v }
| "published" -> ((meta_date |-- date_published) ^=
(match Ptime.of_rfc3339 v with Ok (t,_,_) -> Some t | Error _ -> None )) meta
| _ -> meta | _ -> meta
in in
List.fold_left field_map blank_meta fields List.fold_left field_map blank_meta fields
@ -69,6 +72,27 @@ let of_file s =
let m = meta_of_yaml yaml_str in let m = meta_of_yaml yaml_str in
{ meta = m; body = md_str } { meta = m; body = md_str }
let to_string ymd =
let buf = Buffer.create (String.length ymd.body + 256) in
let buf_acc = Buffer.add_string buf in
let str_of_ptime time = match time with
| Some t -> Ptime.to_rfc3339 t | None -> "" in
List.map buf_acc [
"---\n";
"title: "; ymd.meta.title;
"\nauthors:";
"\n- name: "; ymd.meta.author.name;
"\n email: "; ymd.meta.author.email;
"\ndate:";
"\n edited: "; str_of_ptime ymd.meta.date.edited;
"\n published: "; str_of_ptime ymd.meta.date.published;
"\ncategories: "; String.concat ", " ymd.meta.categories;
"\ntopics: "; String.concat ", " ymd.meta.topics;
"\n---\n"; ymd.body;
];
Buffer.contents buf
let titles () = let titles () =
let ymds = Array.to_list @@ Sys.readdir "ymd/" in let ymds = Array.to_list @@ Sys.readdir "ymd/" in
let t y = (of_file ("ymd/" ^ y)).meta.title in let t y = (of_file ("ymd/" ^ y)).meta.title in

View File

@ -28,19 +28,24 @@ let ymd_of_body_pairs pairs =
let open Logarion in let open Logarion in
let open Lens.Infix in let open Lens.Infix in
let field_of_pair ymd (key, value) = match key with let field_of_pair ymd (key, value) = match key with
| "title" -> ((ymd_meta |-- meta_title |-- title ^= List.hd value) ymd | "title" -> ((ymd_meta |-- meta_title) ^= List.hd value) ymd
| "author" -> ((ymd_meta |-- meta_author |-- author_name) ^= List.hd value) ymd | "author" -> ((ymd_meta |-- meta_author |-- author_name) ^= List.hd value) ymd
| "text" -> { ymd with body = List.hd value } | "text" -> { ymd with body = List.hd value }
| _ -> ymd | _ -> ymd
in in
ListLabels.fold_left ~f:field_of_pair ~init:blank_ymd pairs ListLabels.fold_left ~f:field_of_pair ~init:blank_ymd pairs
|> ((ymd_meta |-- meta_date |-- date_edited) ^= Some (Ptime_clock.now ()))
let process_form = let process_form =
post "/()/new" post "/()/new"
begin fun req -> begin fun req ->
let pairs = Lwt_main.run @@ App.urlencoded_pairs_of_body req in let pairs = Lwt_main.run @@ App.urlencoded_pairs_of_body req in
let open Logarion in let open Logarion in
`Html (Html.html_of (ymd_of_body_pairs pairs)) |> respond' let ymd = ymd_of_body_pairs pairs in
let oc = open_out "ymd/saved.ymd" in
Printf.fprintf oc "%s" (to_string ymd);
close_out oc;
`Html (Html.html_of ymd) |> respond'
end end
let print_toc = let print_toc =