let structure_links (default, pages) ?service ~sp =
let make_rev s endlist =
match s with
| None -> {{ [ !{: endlist :} ] }}
| Some s ->
{{ [ <link rev="Subsection" href={: make_uri s sp () :}>[]
!{: endlist :} ] }}
in
let make_rel s =
{{ <link rel="Subsection" href={: make_uri s sp () :}>[] }}
in
let make_rels beg a =
match snd a with
| Site_tree (Main_page page, _) -> (make_rel page)::beg
| _ -> beg
in
let rec create_rev parent = function
| [] -> raise Not_found
| (_, (Site_tree (Main_page s, [])))::l when same_service_opt sp s service ->
make_rev parent []
| (_, Disabled)::l
| (_, Site_tree (_, []))::l -> create_rev parent l
| (_, Site_tree (Main_page page, hsl))::l ->
if same_service_opt sp page service
then make_rev parent (List.fold_left make_rels [] hsl)
else
(try create_rev (Some page) hsl
with Not_found -> create_rev parent l)
| (_, Site_tree (_, hsl))::l ->
(try create_rev None hsl
with Not_found -> create_rev parent l)
in
try
match default with
| Main_page def ->
if same_service_opt sp def service then
{{ [ !{: List.fold_left make_rels [] pages :} ] }}
else create_rev (Some def) pages
| _ ->
create_rev None pages
with Not_found -> {{ [] }}