module Text.HTML.TreeUtils (mkHTMLBox,
BoxProps(..),
defBoxProps,
displayBoxJS,
tree2ltree)
where
--import Data.List (sortBy, intercalate, groupBy)
import Text.Html
import Data.Tree
data BoxProps = BoxProps { boxFillColor :: String, boxBorderColor :: String, boxBorderWidth :: Int } deriving Show
defBoxProps :: BoxProps
defBoxProps = BoxProps "white" "black" 2
-- Javascript resposible for correct reaction onclick event.
-- Purporse of this code is fold / unfold given element using
-- HTML element style none.
displayBoxJS :: Html
displayBoxJS = primHtml $ unlines [ ""]
-- Label which call displayBox(x) in the case of mouse click.
clickLabel :: String -> Int -> Html
clickLabel cs i = let txt = prettyHtml $ linesToHtml (lines cs)
onclick = "onclick=\"displayBox("++(show i)++")\""
in primHtml $ "
" ++ txt ++ "
"
mkHTMLBox :: String -> Int -> [Html] -> Int -> BoxProps -> Html
mkHTMLBox cs i [] _ prop = simpleTable (tabAttrs prop) [] [[clickLabel cs i]]
mkHTMLBox cs i xs n prop = simpleTable (tabAttrs prop) [] $ [[clickLabel cs i]] ++ (filter (not . null) $ mkRows xs)
where
mkRows [] = [[]]
mkRows ys = (take n ys):(mkRows (drop n ys))
tabAttrs :: BoxProps -> [HtmlAttr]
tabAttrs prop = let borderStyle = thestyle $ concat [ "border: ",(show $ boxBorderWidth prop), "px solid "
, (boxBorderColor prop)
, ";" ]
in [ borderStyle, bgcolor (boxFillColor prop) ]
-- Ineffectient function for assign unique number to each Node.
-- Has to be rewritten.
tree2ltree :: Tree a -> Tree (Int,a)
tree2ltree xs = tree2ltree' 1 xs
where
tree2ltree' l (Node r cx) = Node (l, r) lcx
where
lcx = snd $ foldr (labNode) (l+1,[]) cx
labNode c (l',lcx') = (l'+step, (tree2ltree' l' c):lcx')
where
step = length (flatten c)