(* emit_xml.ml *) module T = Template let escape s = Escape.apply Escape.Xml s let get v k = match v with T.Obj kvs -> List.assoc_opt k kvs | _ -> None let s v k = match get v k with Some (T.Str x) -> x | _ -> "" let el b name value = Buffer.add_string b (" <" ^ name ^ ">" ^ escape value ^ "\n") let day b d = Buffer.add_string b (" \n"); el b "season" (s d "season"); el b "week" (s d "week"); el b "slug" (s d "slug"); el b "rank" (s d "rank"); el b "colour" (s d "colour"); el b "subject" (s d "subject"); (match get d "name" with | Some (T.Obj kvs) -> List.iter (fun (lang, v) -> match v with | T.Str x -> Buffer.add_string b (" " ^ escape x ^ "\n") | _ -> ()) kvs | _ -> ()); (match get d "comms" with | Some (T.List l) -> List.iter (fun c -> Buffer.add_string b (" " ^ escape (s c "slug") ^ "\n")) l | _ -> ()); let cite name value = if value <> "" then Buffer.add_string b (" " ^ escape value ^ "\n") in cite "first" (s d "first"); cite "gospel" (s d "gospel"); Buffer.add_string b " \n" let year v = let b = Buffer.create (128 * 1024) in Buffer.add_string b "\n"; Buffer.add_string b ("\n"); Buffer.add_string b " \n"; (match get v "days" with Some (T.List l) -> List.iter (day b) l | _ -> ()); Buffer.add_string b " \n\n"; Buffer.contents b