···260260 | None -> None
261261 in
262262263263+ let parse_reference = function
264264+ | Object obj ->
265265+ let url = require_string "url" obj in
266266+ let doi = optional_string "doi" obj in
267267+ Reference.create ~url ?doi ()
268268+ | _ -> raise (Invalid_feed "Reference must be an object")
269269+ in
270270+271271+ let references =
272272+ match optional_array "_references" obj with
273273+ | Some arr ->
274274+ let parsed = List.map parse_reference arr in
275275+ if parsed = [] then None else Some parsed
276276+ | None -> None
277277+ in
278278+263279 Item.create ~id ~content ?url ?external_url ?title ?summary ?image
264280 ?banner_image ?date_published ?date_modified ?authors ?tags ?language
265265- ?attachments ()
281281+ ?attachments ?references ()
266282267283let parse_item = function
268284 | Object obj -> parse_item_obj obj
···390406 ignore (Jsonm.encode enc (`Lexeme `Oe))
391407 in
392408409409+ let enc_reference ref =
410410+ ignore (Jsonm.encode enc (`Lexeme `Os));
411411+ enc_field "url" (fun () -> enc_string (Reference.url ref));
412412+ enc_opt (fun doi -> enc_field "doi" (fun () -> enc_string doi))
413413+ (Reference.doi ref);
414414+ enc_opt (fun cito_list ->
415415+ enc_field "cito" (fun () ->
416416+ enc_list (fun cito -> enc_string (Cito.to_string cito)) cito_list))
417417+ (Reference.cito ref);
418418+ ignore (Jsonm.encode enc (`Lexeme `Oe))
419419+ in
420420+393421 let enc_hub hub =
394422 ignore (Jsonm.encode enc (`Lexeme `Os));
395423 enc_field "type" (fun () -> enc_string (Hub.type_ hub));
···438466 enc_opt (fun atts ->
439467 enc_field "attachments" (fun () -> enc_list enc_attachment atts))
440468 (Item.attachments item);
469469+ enc_opt (fun refs ->
470470+ enc_field "_references" (fun () -> enc_list enc_reference refs))
471471+ (Item.references item);
441472442473 ignore (Jsonm.encode enc (`Lexeme `Oe))
443474 in
+20
lib/reference.ml
···11+type t = {
22+ url : string;
33+ doi : string option;
44+ cito : Cito.t list option;
55+}
66+77+let create ~url ?doi ?cito () = { url; doi; cito }
88+99+let url t = t.url
1010+let doi t = t.doi
1111+let cito t = t.cito
1212+1313+let equal a b = String.equal a.url b.url
1414+1515+let pp ppf t =
1616+ let open Format in
1717+ fprintf ppf "%s" t.url;
1818+ match t.doi with
1919+ | Some d -> fprintf ppf " [DOI: %s]" d
2020+ | None -> ()