blob: f0849cd53195c43a62d44fe88af40eeba02ba2a8 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
(* 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 ^ "</" ^ name ^ ">\n")
let day b d =
Buffer.add_string b (" <day date=\"" ^ escape (s d "iso") ^ "\">\n");
el b "season" (s d "season");
el b "season_name" (s d "season_name");
el b "week" (s d "week");
el b "slug" (s d "slug");
(* The resolved display name. A single element, no [lang] attribute: the
view's own [name] is now one resolved string, not a lang-keyed object
(view.ml), so there is exactly one to emit rather than one per language. *)
el b "name" (s d "name");
el b "weekday" (s d "weekday");
el b "rank" (s d "rank");
el b "rank_name" (s d "rank_name");
el b "colour" (s d "colour");
el b "colour_name" (s d "colour_name");
el b "subject" (s d "subject");
(match get d "comms" with
| Some (T.List l) ->
List.iter (fun c -> Buffer.add_string b (" <commemoration>" ^ escape (s c "slug") ^ "</commemoration>\n")) l
| _ -> ());
let cite name value =
if value <> "" then
Buffer.add_string b (" <citation part=\"" ^ name ^ "\">" ^ escape value ^ "</citation>\n")
in
(* W5: a THIRD element, not a hardcoded pair -- [<citation>] is a repeated
element, not a fixed column, so there is no structural reason to leave
[second] out the way [Emit_csv]'s own fixed header row genuinely must
(see that module's own comment). [cite]'s own [value <> ""] guard
already makes this a no-op for every EF day (view.ml's [day_value]
never sets a "second" key for EF at all, so [s d "second"] resolves to
"" through [get]'s own [None -> ""] fallback) -- EF's XML is therefore
unchanged BY CONSTRUCTION, not by a rite check here. *)
cite "first" (s d "first");
cite "second" (s d "second");
cite "gospel" (s d "gospel");
Buffer.add_string b " </day>\n"
let year v =
let b = Buffer.create (128 * 1024) in
Buffer.add_string b "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
Buffer.add_string b
("<calendar rite=\"" ^ escape (s v "rite") ^ "\" year=\"" ^ escape (s v "year") ^ "\">\n");
Buffer.add_string b " <days>\n";
(match get v "days" with Some (T.List l) -> List.iter (day b) l | _ -> ());
Buffer.add_string b " </days>\n</calendar>\n";
Buffer.contents b
|