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
open Odoc_model
type args = { html_config : Odoc_html.Config.t; assets : Fpath.t list }
let render { html_config; assets = _ } page =
Odoc_html.Generator.render ~config:html_config page
let list_filter_map f lst =
List.rev
@@ List.fold_left
(fun acc x -> match f x with None -> acc | Some x -> x :: acc)
[] lst
let asset_documents parent_id children asset_paths =
let asset_names =
list_filter_map
(function Lang.Page.Asset_child name -> Some name | _ -> None)
children
in
let rec paths name =
match paths with
| [] -> (paths, (name, None))
| x :: xs when Fpath.basename x = name -> (xs, (name, Some x))
| x :: xs ->
let rest, elt = extract xs name in
(x :: rest, elt)
in
let unmatched, paired_or_missing =
let rec foldmap paths paired = function
| [] -> (paths, paired)
| name :: names ->
let paths, pair = extract paths name in
foldmap paths (pair :: paired) names
in
foldmap asset_paths [] asset_names
in
List.iter
(fun asset ->
Error.raise_warning
(Error.filename_only "this asset was not declared as a child of %s"
(Paths.Identifier.name parent_id)
(Fs.File.to_string asset)))
unmatched;
list_filter_map
(fun (name, path) ->
match path with
| None ->
Error.raise_warning (Error.filename_only "asset is missing." name);
None
| Some path ->
let asset_id = Paths.Identifier.Mk.asset_file (parent_id, name) in
let url = Odoc_document.Url.Path.from_identifier asset_id in
Some (Odoc_document.Types.Document.Asset { url; src = path }))
paired_or_missing
let args input =
match input with
| Odoc_document.Renderer.CU _unit ->
[]
| Page page -> asset_documents page.Lang.Page.name page.children args.assets
let renderer = { Odoc_document.Renderer.name = "html"; render; extra_documents }