let menu ?(classe=[]) ?id first l ?service:current ~sp =
  let rec aux = function
    | [] -> []
    | [(url, text)] ->
        let classe = [last_class] in
        if same_service_opt sp url current
        then
          [{{ <li class={: attrib_list (current_class::classe) :}>{: text :} }}]
            (* [li ~a:[a_class (current_class::classe)] text] *)
        else
          [{{ <li class={: attrib_list classe :}>[{: a url sp {: text :} () :}] }}]
            (* [li ~a:[a_class classe] [a url sp text ()] *)
    | (url, text)::l ->
        (if same_service_opt sp url current
         then
           {{ <li class={: current_class :}>{: text :} }}
             (* (li ~a:[a_class [current_class]] text) *)
         else
           {{ <li>[{: a url sp {: text :} () :}] }})::(aux l)
          (* (li [a url sp text ()]))::(aux l) *)
  in match first::l with
    | [] -> assert false
    | [(url, text)] ->
        {{ <ul ({{ ul_attribs (menu_class::classe) id 0 }})>
             [{:
               let liclasse = [first_class; last_class] in
                 if same_service_opt sp url current then
                   {{ <li class={: attrib_list (current_class::liclasse) :}>{: text :} }}
                 else
                   {{ <li class={: attrib_list liclasse :}>[{: a url sp {: text :} () :}] }} :}] }}
    | (url, text)::l ->
        {{ <ul ({{ ul_attribs (menu_class::classe) id 0 }})>
             [{:
               let liclasse = [first_class] in
                 if same_service_opt sp url current then
                   {{ <li class={: attrib_list (current_class::liclasse) :}>{: text :} }}
                 else
                   {{ <li class={: attrib_list liclasse :}>[{: a url sp {: text :} () :}] }} :}
                !{: aux l :}] }}