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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
(* SPDX-License-Identifier: AGPL-3.0-or-later *)
type id = string
let to_string t = t
(* Every book the shipped EF lectionary cites, with every spelling it uses.
The dotted/undotted pairs are inherited from lectio -- see book.mli. *)
let table =
[ ("genesis", [ "Gen" ]);
("exodus", [ "Ex" ]);
("leviticus", [ "Lev" ]);
("numbers", [ "Num" ]);
("kings_3", [ "3 Kings"; "3 Kgs." ]);
("kings_4", [ "4 Kings" ]);
("esdras_2", [ "2 Esd." ]);
("esther", [ "Esther" ]);
("ecclesiasticus", [ "Ecclus" ]);
("isaiah", [ "Isa"; "Isa." ]);
("jeremiah", [ "Jer" ]);
("ezekiel", [ "Ezech" ]);
("daniel", [ "Dan" ]);
("osee", [ "Osee" ]);
("joel", [ "Joel" ]);
("jonas", [ "Jonas" ]);
("matthew", [ "Matt"; "Matt." ]);
("mark", [ "Mark" ]);
("luke", [ "Luke" ]);
("john", [ "John" ]);
("acts", [ "Acts" ]);
("romans", [ "Rom" ]);
("corinthians_1", [ "1 Cor"; "1 Cor." ]);
("corinthians_2", [ "2 Cor." ]);
("galatians", [ "Gal" ]);
("ephesians", [ "Eph"; "Eph." ]);
("philippians", [ "Phil" ]);
("colossians", [ "Col" ]);
("thessalonians_1", [ "1 Thess"; "1 Thess." ]);
("thessalonians_2", [ "2 Thess" ]);
("titus", [ "Titus" ]);
("hebrews", [ "Heb" ]);
("james", [ "Jas" ]);
("peter_1", [ "1 Pet"; "1 Pet." ]);
("john_1", [ "1 John" ]) ]
(* Targets a tradition can map ONTO that the Vulgate data never cites
directly. Present so [tradition_of_fields] can validate both sides. *)
let tradition_targets =
[ "kings_1"; "kings_2"; "nehemiah"; "sirach"; "hosea"; "jonah" ]
let all = List.map fst table @ tradition_targets
let tokens =
List.concat_map (fun (id, sp) -> List.map (fun s -> (s, id)) sp) table
let of_token s =
let s = String.trim s in
List.assoc_opt s tokens
type tradition = (string * string) list
let vulgate = []
let known id = List.mem id all
let tradition_of_fields fields =
List.filter (fun (a, b) -> known a && known b) fields
let unknown_fields fields =
List.filter_map
(fun (a, b) -> if known a && known b then None else Some a)
fields
let map tr id = match List.assoc_opt id tr with Some x -> x | None -> id
|