let hierarchical_menu_breadth_first
?(classe=[])
?id
(((page, pages): ([< Eliom_services.get_service_kind],
[< Eliom_services.registrable ],
Eliom_duce.Blocks.a_content_elt_list) hierarchical_site) as the_menu)
?service
~sp =
let rec breadth_first_fun pages level pos : {{ [Xhtmltypes_duce.ul*] }} =
let rec one_item first last i s =
let (classe, pos2, deplier) =
match pos with
| [] -> ([], [], false)
| a::l when a = i -> ([current_class], l, true)
| _::l -> ([], l, false)
in
let classe =
if last then
last_class::classe
else classe
in
let classe =
if first then
first_class::classe
else classe
in
match s with
| (text, Site_tree (Default_page page, _))
| (text, Site_tree (Main_page page, _)) ->
{{ <li class={: attrib_list classe :}>[{: a page sp {: text :} () :}] }}
| (text, Site_tree (Not_clickable, _)) ->
{{ <li class={: attrib_list classe :}>{: text :} }}
| (text, Disabled) ->
{{ <li class={: attrib_list (disabled_class::classe) :}>{: text :} }}
and one_menu first i = function
| [] -> []
| [a] -> [one_item first true i a]
| a::l -> (one_item first false i a)::(one_menu false (i+1) l)
and submenu i pos pages =
match snd (List.nth pages i) with
| Disabled
| Site_tree (_, []) -> {{ [] }}
| Site_tree (_, hsl) -> breadth_first_fun hsl (level+1) pos
in
let classe =
(level_class^string_of_int level)::classe
in
let l =
match pos with
| [] -> {{ [] }}
| a::l -> submenu a l pages
in
match one_menu true 0 pages with
| [] -> l
| li::lis ->
{{ [ <ul ({{ ul_attribs (menu_class::classe) id level}})>[ {: li :} !{: lis :} ] !l ] }}
in
(breadth_first_fun pages 0 (find_in_hierarchy sp service the_menu))