Skip to content

Commit 8d9e81d

Browse files
sabinejonludlam
authored andcommitted
title formatting is now a renderer decision
1 parent dcd96f7 commit 8d9e81d

File tree

6 files changed

+71
-48
lines changed

6 files changed

+71
-48
lines changed

src/document/doctree.ml

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ end = struct
9191
| Declaration { content; _ } -> walk_documentedsrc content
9292
| Include i -> walk_items i.content.content)
9393

94-
let compute (p : Page.t) = walk_items (p.header @ p.items)
94+
let compute (p : Page.t) = walk_items (p.preamble @ p.items)
9595
end
9696

9797
module Shift = struct
@@ -133,7 +133,7 @@ module Shift = struct
133133
let content =
134134
{
135135
page with
136-
header = walk_item ~on_sub shift_state page.header;
136+
preamble = walk_item ~on_sub shift_state page.preamble;
137137
items = walk_item ~on_sub shift_state page.items;
138138
}
139139
in
@@ -183,7 +183,7 @@ module Headings : sig
183183
end = struct
184184
let fold =
185185
let rec w_page f acc page =
186-
w_items f (w_items f acc page.Page.header) page.items
186+
w_items f (w_items f acc page.Page.preamble) page.items
187187
and w_items f acc ts = List.fold_left (w_item f) acc ts
188188
and w_item f acc = function
189189
| Heading h -> f acc h
@@ -209,9 +209,9 @@ end = struct
209209

210210
let foldmap =
211211
let rec w_page f acc page =
212-
let acc, header = w_items f acc page.Page.header in
212+
let acc, preamble = w_items f acc page.Page.preamble in
213213
let acc, items = w_items f acc page.items in
214-
(acc, { page with header; items })
214+
(acc, { page with preamble; items })
215215
and w_items f acc items = foldmap_left (w_item f) acc items
216216
and w_item f acc = function
217217
| Heading h ->
@@ -283,6 +283,35 @@ end = struct
283283
|> snd
284284
end
285285

286+
module PageTitle : sig
287+
val render_title : Page.t -> Item.t list
288+
end = struct
289+
let format_title kind name =
290+
let mk title =
291+
let level = 0 and label = None in
292+
[ Types.Item.Heading { level; label; title } ]
293+
in
294+
let prefix s =
295+
mk (Types.inline (Text (s ^ " ")) :: Codefmt.code (Codefmt.txt name))
296+
in
297+
match kind with
298+
| `Module -> prefix "Module"
299+
| `Argument -> prefix "Parameter"
300+
| `ModuleType -> prefix "Module type"
301+
| `ClassType -> prefix "Class type"
302+
| `Class -> prefix "Class"
303+
| `Page -> []
304+
305+
let make_name_from_path { Url.Path.name; parent; _ } =
306+
match parent with
307+
| None | Some { kind = `Page; _ } -> name
308+
| Some p -> Printf.sprintf "%s.%s" p.name name
309+
310+
let render_title (p : Page.t) =
311+
format_title p.kind
312+
(make_name_from_path p.url)
313+
end
314+
286315
module Math : sig
287316
val has_math_elements : Page.t -> bool
288317
end = struct

src/document/generator.ml

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,6 @@ open Types
2121
module O = Codefmt
2222
open O.Infix
2323

24-
(* TODO: Title formatting should be a renderer decision *)
25-
let format_title kind name =
26-
let mk title =
27-
let level = 0 and label = None in
28-
[ Item.Heading { level; label; title } ]
29-
in
30-
let prefix s = mk (inline (Text (s ^ " ")) :: O.code (O.txt name)) in
31-
match kind with
32-
| `Mod -> prefix "Module"
33-
| `Arg -> prefix "Parameter"
34-
| `Mty -> prefix "Module type"
35-
| `Cty -> prefix "Class type"
36-
| `Class -> prefix "Class"
37-
| `Page -> mk [ inline @@ Text name ]
38-
39-
let make_name_from_path { Url.Path.name; parent; _ } =
40-
match parent with
41-
| None -> name
42-
| Some p -> Printf.sprintf "%s.%s" p.name name
43-
4424
let label t =
4525
match t with
4626
| Odoc_model.Lang.TypeExpr.Label s -> O.txt s
@@ -92,12 +72,10 @@ let prepare_preamble comment items =
9272
in
9373
(Comment.standalone preamble, Comment.standalone first_comment @ items)
9474

95-
let make_expansion_page title kind url ?(header_title = make_name_from_path url)
96-
comments items =
75+
let make_expansion_page title kind url comments items =
9776
let comment = List.concat comments in
9877
let preamble, items = prepare_preamble comment items in
99-
let header = format_title kind header_title @ preamble in
100-
{ Page.title; header; items; url }
78+
{ Page.title; kind; preamble; items; url }
10179

10280
include Generator_signatures
10381

@@ -1069,7 +1047,8 @@ module Make (Syntax : SYNTAX) = struct
10691047
let url = Url.Path.from_identifier t.id in
10701048
let expansion_doc, items = class_signature csig in
10711049
let page =
1072-
make_expansion_page name `Cty url [ t.doc; expansion_doc ] items
1050+
make_expansion_page name `ClassType url [ t.doc; expansion_doc ]
1051+
items
10731052
in
10741053
( O.documentedSrc @@ path url [ inline @@ Text name ],
10751054
Some page,
@@ -1195,7 +1174,7 @@ module Make (Syntax : SYNTAX) = struct
11951174
let modname = path url [ inline @@ Text name ] in
11961175
let type_with_expansion =
11971176
let content =
1198-
make_expansion_page name `Arg url [ expansion_doc ] items
1177+
make_expansion_page name `Argument url [ expansion_doc ] items
11991178
in
12001179
let summary = O.render modtyp in
12011180
let status = `Default in
@@ -1345,7 +1324,7 @@ module Make (Syntax : SYNTAX) = struct
13451324
let url = Url.Path.from_identifier t.id in
13461325
let link = path url [ inline @@ Text modname ] in
13471326
let page =
1348-
make_expansion_page modname `Mod url [ t.doc; expansion_doc ]
1327+
make_expansion_page modname `Module url [ t.doc; expansion_doc ]
13491328
items
13501329
in
13511330
(link, status, Some page, Some expansion_doc)
@@ -1404,7 +1383,8 @@ module Make (Syntax : SYNTAX) = struct
14041383
let url = Url.Path.from_identifier id in
14051384
let link = path url [ inline @@ Text modname ] in
14061385
let page =
1407-
make_expansion_page modname `Mty url [ doc; expansion_doc ] items
1386+
make_expansion_page modname `ModuleType url [ doc; expansion_doc ]
1387+
items
14081388
in
14091389
(link, Some page, Some expansion_doc)
14101390
in
@@ -1686,16 +1666,17 @@ module Make (Syntax : SYNTAX) = struct
16861666
| Module sign -> signature sign
16871667
| Pack packed -> ([], pack packed)
16881668
in
1689-
make_expansion_page title ~header_title:title `Mod url [ unit_doc ] items
1669+
make_expansion_page title `Module url [ unit_doc ] items
16901670

16911671
let page (t : Odoc_model.Lang.Page.t) : Page.t =
16921672
let name =
16931673
match t.name.iv with `Page (_, name) | `LeafPage (_, name) -> name
16941674
in
16951675
let title = Odoc_model.Names.PageName.to_string name in
16961676
let url = Url.Path.from_identifier t.name in
1697-
let header, items = Sectioning.docs t.content in
1698-
{ Page.title; header; items; url }
1677+
let preamble, items = Sectioning.docs t.content in
1678+
let kind = `Page in
1679+
{ Page.title; kind; preamble; items; url }
16991680
end
17001681

17011682
include Page

src/document/types.ml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,18 @@ end =
157157
Item
158158

159159
and Page : sig
160+
type kind =
161+
[ `Module
162+
| `Argument
163+
| `ModuleType
164+
| `ClassType
165+
| `Class
166+
| `Page ]
167+
160168
type t = {
161169
title : string;
162-
header : Item.t list;
170+
kind : kind;
171+
preamble : Item.t list;
163172
items : Item.t list;
164173
url : Url.Path.t;
165174
}

src/html/generator.ml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ module Toc = struct
367367
in
368368
let title_str =
369369
List.map (Format.asprintf "%a" (Tyxml.Html.pp_elt ())) text
370-
|> String.concat " "
370+
|> String.concat ""
371371
in
372372
let href = Link.href ~config ~resolve url in
373373
{ title; title_str; href; children = List.map section children }
@@ -389,7 +389,7 @@ module Page = struct
389389
Utils.list_concat_map ~f:(include_ ~config) subpages
390390

391391
and page ~config p : Odoc_document.Renderer.page list =
392-
let { Page.title; header; items = i; url } =
392+
let { Page.title; kind = _; preamble; items = i; url } =
393393
Doctree.Labels.disambiguate_page p
394394
and subpages =
395395
(* Don't use the output of [disambiguate_page] to avoid unecessarily
@@ -400,7 +400,9 @@ module Page = struct
400400
let i = Doctree.Shift.compute ~on_sub i in
401401
let uses_katex = Doctree.Math.has_math_elements p in
402402
let toc = Toc.gen_toc ~config ~resolve ~path:url i in
403-
let header = items ~config ~resolve header in
403+
let header =
404+
items ~config ~resolve (Doctree.PageTitle.render_title p @ preamble)
405+
in
404406
let content = (items ~config ~resolve i :> any Html.elt list) in
405407
Tree.make ~config ~header ~toc ~url ~uses_katex title content subpages
406408
end

src/latex/generator.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,11 +459,11 @@ module Page = struct
459459
List.flatten @@ List.map (subpage ~with_children) subpages
460460

461461
and page ~with_children p =
462-
let { Page.title = _; header; items = i; url } =
462+
let { Page.title = _; kind = _; preamble; items = i; url } =
463463
Doctree.Labels.disambiguate_page p
464464
and subpages = subpages ~with_children @@ Doctree.Subpages.compute p in
465465
let i = Doctree.Shift.compute ~on_sub i in
466-
let header = items header in
466+
let header = items (Doctree.PageTitle.render_title p @ preamble) in
467467
let content = items i in
468468
let page = Doc.make ~with_children url (header @ content) subpages in
469469
page

src/manpage/generator.ml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ let rec documentedSrc (l : DocumentedSrc.t) =
431431
let l = list ~sep:break (List.map f lines) in
432432
indent 2 (break ++ l) ++ break_if_nonempty rest ++ continue rest)
433433

434-
and subpage { title = _; header = _; items; url = _ } =
434+
and subpage { title = _; kind = _; preamble = _; items; url = _ } =
435435
let content = items in
436436
let surround body =
437437
if content = [] then sp else indent 2 (break ++ body) ++ break
@@ -476,13 +476,15 @@ let on_sub subp =
476476
| `Page p -> if Link.should_inline p.Subpage.content.url then Some 1 else None
477477
| `Include incl -> if inline_subpage incl.Include.status then Some 0 else None
478478

479-
let page { Page.title; header; items = i; url } =
479+
let page p =
480480
reset_heading ();
481-
let header = Shift.compute ~on_sub header in
482-
let i = Shift.compute ~on_sub i in
483-
macro "TH" {|%s 3 "" "Odoc" "OCaml Library"|} title
481+
let header =
482+
Doctree.PageTitle.render_title p @ Shift.compute ~on_sub p.preamble
483+
in
484+
let i = Shift.compute ~on_sub p.items in
485+
macro "TH" {|%s 3 "" "Odoc" "OCaml Library"|} p.title
484486
++ macro "SH" "Name"
485-
++ str "%s" (String.concat "." @@ Link.for_printing url)
487+
++ str "%s" (String.concat "." @@ Link.for_printing p.url)
486488
++ macro "SH" "Synopsis" ++ vspace ++ item ~nested:false header
487489
++ macro "SH" "Documentation" ++ vspace ++ macro "nf" ""
488490
++ item ~nested:false i

0 commit comments

Comments
 (0)