-- | Menu constructors.
module Text.HTML.Light.Composite.Menu where
import Data.List as L
import Prelude as P
import Text.HTML.Light.Attribute as H
import Text.HTML.Light.Element as H
import Text.XML.Light
-- | A menu entry is /(name,identifier,link)/.
type Menu_Entry = (String,String,Maybe String)
type Menu_P = ([Content] -> [Content])
-- | Menu constructor.
type Menu_C = Menu_P -> String -> [Menu_Entry] -> String -> Content
nav_menu :: Element_C -> Element_C -> Menu_C
nav_menu outer_f inner_f between_f ty m h =
let cl = class' ty
f (nm,nm_id,ln) =
let a_cl = class' (if nm_id == h then "here" else "not-here")
at = maybe [a_cl] ((: [a_cl]) . href) ln
in inner_f [cl,H.id nm_id] [a at [cdata nm]]
in nav [cl] [outer_f [cl] (between_f (L.map f m))]
-- | Make a 'nav' menu of class /ty/ with a 'ul' structure. The entry
-- corresponding to identifier /h/ is marked with the class @here@.
nav_menu_list :: Menu_C
nav_menu_list = nav_menu ul li
-- | Variant of 'nav_menu_list' using 'H.span' elements.
nav_menu_span :: Menu_C
nav_menu_span f =
let sp = H.span [class' "menu-separator"] [cdata " | "]
in nav_menu H.div H.span (f . intersperse sp)