let structure_links (default, pages) ?service ~sp =
  let make_rev s endlist =
    (* I am a subsection of s *)
    match s with
    | None -> {{ [ !{: endlist :} ] }}
    | Some s ->
        {{ [ <link rev="Subsection" href={: make_uri s sp () :}>[] 
               !{: endlist :} ] }}
  in
  let make_rel s =
    (* s is a subsection of mine *)
                {{ <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 Some s = service ->
      make_rev parent []
  | (_, Disabled)::l
  | (_, Site_tree (_, []))::l -> create_rev parent l
  | (_, Site_tree (Main_page page, hsl))::l ->
      if Some 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 Some def = service then
          {{ [ !{: List.fold_left make_rels [] pages :} ] }}
        else create_rev (Some def) pages
    | _ ->
        create_rev None pages
  with Not_found -> {{ [] }}