···260 | None -> None
261 in
262263+ let parse_reference = function
264+ | Object obj ->
265+ let url = require_string "url" obj in
266+ let doi = optional_string "doi" obj in
267+ Reference.create ~url ?doi ()
268+ | _ -> raise (Invalid_feed "Reference must be an object")
269+ in
270+271+ let references =
272+ match optional_array "_references" obj with
273+ | Some arr ->
274+ let parsed = List.map parse_reference arr in
275+ if parsed = [] then None else Some parsed
276+ | None -> None
277+ in
278+279 Item.create ~id ~content ?url ?external_url ?title ?summary ?image
280 ?banner_image ?date_published ?date_modified ?authors ?tags ?language
281+ ?attachments ?references ()
282283let parse_item = function
284 | Object obj -> parse_item_obj obj
···406 ignore (Jsonm.encode enc (`Lexeme `Oe))
407 in
408409+ let enc_reference ref =
410+ ignore (Jsonm.encode enc (`Lexeme `Os));
411+ enc_field "url" (fun () -> enc_string (Reference.url ref));
412+ enc_opt (fun doi -> enc_field "doi" (fun () -> enc_string doi))
413+ (Reference.doi ref);
414+ enc_opt (fun cito_list ->
415+ enc_field "cito" (fun () ->
416+ enc_list (fun cito -> enc_string (Cito.to_string cito)) cito_list))
417+ (Reference.cito ref);
418+ ignore (Jsonm.encode enc (`Lexeme `Oe))
419+ in
420+421 let enc_hub hub =
422 ignore (Jsonm.encode enc (`Lexeme `Os));
423 enc_field "type" (fun () -> enc_string (Hub.type_ hub));
···466 enc_opt (fun atts ->
467 enc_field "attachments" (fun () -> enc_list enc_attachment atts))
468 (Item.attachments item);
469+ enc_opt (fun refs ->
470+ enc_field "_references" (fun () -> enc_list enc_reference refs))
471+ (Item.references item);
472473 ignore (Jsonm.encode enc (`Lexeme `Oe))
474 in
+20
lib/reference.ml
···00000000000000000000
···1+type t = {
2+ url : string;
3+ doi : string option;
4+ cito : Cito.t list option;
5+}
6+7+let create ~url ?doi ?cito () = { url; doi; cito }
8+9+let url t = t.url
10+let doi t = t.doi
11+let cito t = t.cito
12+13+let equal a b = String.equal a.url b.url
14+15+let pp ppf t =
16+ let open Format in
17+ fprintf ppf "%s" t.url;
18+ match t.doi with
19+ | Some d -> fprintf ppf " [DOI: %s]" d
20+ | None -> ()