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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
module Html = Tyxml.Html
type uri = Absolute of string | Relative of Odoc_document.Url.Path.t option
let page_creator ?(theme_uri = Relative None) ?(support_uri = Relative None)
~url name toc content =
let path = Link.Path.for_printing url in
let head : Html_types.head Html.elt =
let title_string = Printf.sprintf "%s (%s)" name (String.concat "." path) in
let file_uri base file =
match base with
| Absolute uri -> uri ^ "/" ^ file
| Relative uri ->
let page =
Odoc_document.Url.Path.{ kind = `File; parent = uri; name = file }
in
Link.href ~resolve:(Current url) (Odoc_document.Url.from_path page)
in
let odoc_css_uri = file_uri theme_uri "odoc.css" in
let highlight_js_uri = file_uri support_uri "highlight.pack.js" in
Html.head
(Html.title (Html.txt title_string))
[
Html.link ~rel:[ `Stylesheet ] ~href:odoc_css_uri ();
Html.meta ~a:[ Html.a_charset "utf-8" ] ();
Html.meta
~a:[ Html.a_name "generator"; Html.a_content "odoc 2.1.1" ]
();
Html.meta
~a:
[
Html.a_name "viewport";
Html.a_content "width=device-width,initial-scale=1.0";
]
();
Html.script ~a:[ Html.a_src highlight_js_uri ] (Html.txt "");
Html.script (Html.txt "hljs.initHighlightingOnLoad();");
]
in
let breadcrumbs =
let rec get_parents x =
match x with
| [] -> []
| x :: xs -> (
match Odoc_document.Url.Path.of_list (List.rev (x :: xs)) with
| Some x -> x :: get_parents xs
| None -> get_parents xs)
in
let parents =
get_parents (List.rev (Odoc_document.Url.Path.to_list url)) |> List.rev
in
let href page =
Link.href ~resolve:(Current url) (Odoc_document.Url.from_path page)
in
let make_navigation ~up_url breadcrumbs =
[
Html.nav
~a:[ Html.a_class [ "odoc-nav" ] ]
([
Html.a ~a:[ Html.a_href up_url ] [ Html.txt "Up" ]; Html.txt " – ";
]
@ breadcrumbs);
]
in
match parents with
| [] -> []
| [ _ ] -> []
| [ x; { name = "index"; _ } ] ->
let up_url = "../index.html" in
let parent_name = x.name in
make_navigation ~up_url [ Html.txt parent_name ]
| _ ->
let up_url = href (List.hd (List.tl (List.rev parents))) in
let l =
let space = Html.txt " " in
parents
|> Utils.list_concat_map
?sep:(Some [ space; Html.entity "#x00BB"; space ])
~f:(fun url' ->
[
[
(if url = url' then Html.txt url.name
else
Html.a
~a:[ Html.a_href (href url') ]
[ Html.txt url'.name ]);
];
])
|> List.flatten
in
make_navigation ~up_url l
in
let body =
breadcrumbs
@ [ Html.header ~a:[ Html.a_class [ "odoc-preamble" ] ] header ]
@ toc
@ [ Html.div ~a:[ Html.a_class [ "odoc-content" ] ] content ]
in
Html.html head (Html.body ~a:[ Html.a_class [ "odoc" ] ] body)
let make ?theme_uri ?support_uri ~indent ~url ~ ~toc title content
children =
let filename = Link.Path.as_filename url in
let html =
page_creator ?theme_uri ?support_uri ~url title header toc content
in
let content ppf = (Html.pp ~indent ()) ppf html in
{ Odoc_document.Renderer.filename; content; children }
let open_details = ref true