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
open Forester_prelude
open Forester_core
open struct module T = Types end
let parse_flag field =
match Http.Header.get header field with
| Some "true" -> Some true
| Some "false" -> Some false
| Some _ -> None
| None -> None
let parse_title_flags ( : Http.Header.t) : T.title_flags option =
let@ b = Option.map @~ parse_flag "Empty-When-Untitled" header in
T.{empty_when_untitled = b}
let parse_section_flags ( : Http.Header.t) : T.section_flags option =
let hidden_when_empty = parse_flag "Hidden-When-Empty" header in
let included_in_toc = parse_flag "Included-In-Toc" header in
let = parse_flag "Header-Shown" header in
let metadata_shown = parse_flag "Metadata-Shown" header in
let numbered = parse_flag "Numbered" header in
let expanded = parse_flag "Expanded" header in
Some
{
hidden_when_empty;
included_in_toc;
header_shown;
metadata_shown;
numbered;
expanded
}
let parse_content_target ( : Http.Header.t) : T.content_target option =
let open Http in
match Header.get header "Taxon" with
| Some _ -> Some T.Taxon
| None ->
match Header.get header "Mainmatter" with
| Some _ -> Some T.Mainmatter
| None ->
match Header.get header "Full" with
| Some _ ->
let@ flags = Option.map @~ parse_section_flags header in
T.Full flags
| None ->
let@ _ = Option.bind @@ Header.get header "Title" in
let@ flags = Option.map @~ parse_title_flags header in
T.Title flags