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
open Or_error
let link_page ~resolver ~filename page =
let env = Resolver.build_env_for_page resolver page in
Odoc_xref2.Link.resolve_page ~filename env page
let link_unit ~resolver ~filename m impl_shape =
let open Odoc_model in
let open Lang.Compilation_unit in
let m =
if Root.Odoc_file.hidden m.root.file then
{
m with
content = Module { items = []; compiled = false; doc = [] };
expansion = None;
}
else m
in
let env = Resolver.build_link_env_for_unit resolver m impl_shape in
Odoc_xref2.Link.link ~filename env m
(** [~input_warnings] are the warnings stored in the input file *)
let handle_warnings ~input_warnings ~warnings_options ww =
let _, warnings = Odoc_model.Error.unpack_warnings ww in
Odoc_model.Error.handle_warnings ~warnings_options ww >>= fun res ->
Ok (res, input_warnings @ warnings)
(** Read the input file and write to the output file.
Also return the resulting tree. *)
let from_odoc ~resolver ~warnings_options input output =
let filename = Fs.File.to_string input in
Odoc_file.load input >>= fun unit ->
let input_warnings = unit.Odoc_file.warnings in
match unit.content with
| Source_tree_content st ->
Odoc_file.save_source_tree output ~warnings:[] st;
Ok (`Source_tree st)
| Page_content page ->
link_page ~resolver ~filename page
|> handle_warnings ~input_warnings ~warnings_options
>>= fun (page, warnings) ->
Odoc_file.save_page output ~warnings page;
Ok (`Page page)
| Unit_content (m, shape) ->
link_unit ~resolver ~filename m shape
|> handle_warnings ~input_warnings ~warnings_options
>>= fun (m, warnings) ->
Odoc_file.save_unit output ~warnings (m, shape);
Ok (`Module m)