ajout de tags link dans le header pour les sections et sous-sections

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@4891 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Maxence Guesdon 2002-06-06 13:26:11 +00:00
parent bab407e305
commit 0afbd31135
1 changed files with 73 additions and 9 deletions

View File

@ -125,7 +125,6 @@ class ocaml_code =
html_code html_code
end end
(** Generation of html code from text structures. *) (** Generation of html code from text structures. *)
class text = class text =
object (self) object (self)
@ -136,6 +135,29 @@ class text =
make some replacements (double newlines replaced by <br>). *) make some replacements (double newlines replaced by <br>). *)
method escape s = Odoc_ocamlhtml.escape_base s method escape s = Odoc_ocamlhtml.escape_base s
method keep_alpha_num s =
let len = String.length s in
let buf = Buffer.create len in
for i = 0 to len - 1 do
match s.[i] with
'a'..'z' | 'A'..'Z' | '0'..'9' -> Buffer.add_char buf s.[i]
| _ -> ()
done;
Buffer.contents buf
(** Create a label for the associated title.
If a label is given, use the label, or else create a mark
from the title level and the first sentence of the title.*)
method create_title_label (n,label_opt,t) =
match label_opt with
Some s -> s
| None ->
let t2 = Odoc_info.first_sentence_of_text t in
let s = Odoc_info.string_of_text t2 in
let s2 = self#keep_alpha_num s in
Printf.sprintf "%d%s" n s2
(** Return the html code corresponding to the [text] parameter. *) (** Return the html code corresponding to the [text] parameter. *)
method html_of_text t = String.concat "" (List.map self#html_of_text_element t) method html_of_text t = String.concat "" (List.map self#html_of_text_element t)
@ -206,11 +228,7 @@ class text =
method html_of_Title n label_opt t = method html_of_Title n label_opt t =
let css_class = "title"^(string_of_int n) in let css_class = "title"^(string_of_int n) in
"<br>\n"^ "<br>\n"^
( "<a name=\""^(Naming.label_target (self#create_title_label (n, label_opt, t)))^"\"></a>"^
match label_opt with
None -> ""
| Some l -> "<a name=\""^(Naming.label_target l)^"\"></a>"
)^
"<table cellpadding=5 cellspacing=5 width=\"100%\">\n"^ "<table cellpadding=5 cellspacing=5 width=\"100%\">\n"^
"<tr class=\""^css_class^"\"><td><div align=center>\n"^ "<tr class=\""^css_class^"\"><td><div align=center>\n"^
"<span class=\""^css_class^"\">"^(self#html_of_text t)^"</span>\n"^ "<span class=\""^css_class^"\">"^(self#html_of_text t)^"</span>\n"^
@ -496,7 +514,7 @@ class html =
val mutable list_class_types = [] val mutable list_class_types = []
(** The header of pages. Must be prepared by the [prepare_header] method.*) (** The header of pages. Must be prepared by the [prepare_header] method.*)
val mutable header = fun ?(nav=None) -> fun _ -> "" val mutable header = fun ?(nav=None) -> fun ?(comments=[]) -> fun _ -> ""
(** Init the style. *) (** Init the style. *)
method init_style = method init_style =
@ -528,11 +546,11 @@ class html =
(self#escape s) (self#escape s)
(** Get the page header. *) (** Get the page header. *)
method header ?nav title = header ?nav title method header ?nav ?comments title = header ?nav ?comments title
(** A function to build the header of pages. *) (** A function to build the header of pages. *)
method prepare_header module_list = method prepare_header module_list =
let f ?(nav=None) t = let f ?(nav=None) ?(comments=[]) t =
let link_if_not_empty l m url = let link_if_not_empty l m url =
match l with match l with
[] -> "" [] -> ""
@ -579,12 +597,54 @@ class html =
module_list module_list
) )
)^ )^
(self#html_sections_links comments)^
"<title>"^ "<title>"^
t^ t^
"</title>\n</head>\n" "</title>\n</head>\n"
in in
header <- f header <- f
(** Build the html code for the link tags in the header, defining section and
subsections for the titles found in the given comments.*)
method html_sections_links comments =
let titles = List.flatten (List.map Odoc_info.get_titles_in_text comments) in
let levels =
let rec iter acc l =
match l with
[] -> acc
| (n,_,_) :: q ->
if List.mem n acc
then iter acc q
else iter (n::acc) q
in
iter [] titles
in
let sorted_levels = List.sort compare levels in
let (section_level, subsection_level) =
match sorted_levels with
[] -> (None, None)
| [n] -> (Some n, None)
| n :: m :: _ -> (Some n, Some m)
in
let titles_per_level level_opt =
match level_opt with
None -> []
| Some n -> List.filter (fun (m,_,_) -> m = n) titles
in
let section_titles = titles_per_level section_level in
let subsection_titles = titles_per_level subsection_level in
let create_lines s_rel titles =
List.map
(fun (n,lopt,t) ->
let s = Odoc_info.string_of_text t in
let label = self#create_title_label (n,lopt,t) in
Printf.sprintf "<link title=\"%s\" rel=\"%s\" href=\"#%s\">\n" s s_rel label)
titles
in
let section_lines = create_lines "Section" section_titles in
let subsection_lines = create_lines "Subsection" subsection_titles in
String.concat "" (section_lines @ subsection_lines)
(** Html code for navigation bar. (** Html code for navigation bar.
@param pre optional name for optional previous module/class @param pre optional name for optional previous module/class
@param post optional name for optional next module/class @param post optional name for optional next module/class
@ -1340,6 +1400,7 @@ class html =
("<html>\n"^ ("<html>\n"^
(self#header (self#header
~nav: (Some (pre_name, post_name, cl.cl_name)) ~nav: (Some (pre_name, post_name, cl.cl_name))
~comments: (Class.class_comments cl)
(self#inner_title cl.cl_name) (self#inner_title cl.cl_name)
)^ )^
"<body>\n"^ "<body>\n"^
@ -1395,6 +1456,7 @@ class html =
("<html>\n"^ ("<html>\n"^
(self#header (self#header
~nav: (Some (pre_name, post_name, clt.clt_name)) ~nav: (Some (pre_name, post_name, clt.clt_name))
~comments: (Class.class_type_comments clt)
(self#inner_title clt.clt_name) (self#inner_title clt.clt_name)
)^ )^
"<body>\n"^ "<body>\n"^
@ -1447,6 +1509,7 @@ class html =
("<html>\n"^ ("<html>\n"^
(self#header (self#header
~nav: (Some (pre_name, post_name, mt.mt_name)) ~nav: (Some (pre_name, post_name, mt.mt_name))
~comments: (Module.module_type_comments mt)
(self#inner_title mt.mt_name) (self#inner_title mt.mt_name)
)^ )^
"<body>\n"^ "<body>\n"^
@ -1529,6 +1592,7 @@ class html =
("<html>\n"^ ("<html>\n"^
(self#header (self#header
~nav: (Some (pre_name, post_name, modu.m_name)) ~nav: (Some (pre_name, post_name, modu.m_name))
~comments: (Module.module_comments modu)
(self#inner_title modu.m_name) (self#inner_title modu.m_name)
) ^ ) ^
"<body>\n"^ "<body>\n"^