module HaddockHH2(ppHH2Contents, ppHH2Index, ppHH2Files, ppHH2Collection) where import HsSyn hiding(Doc) #if __GLASGOW_HASKELL__ < 503 import Pretty import FiniteMap #else import Text.PrettyPrint import Data.FiniteMap import Data.List import Data.Char #endif import HaddockModuleTree import HaddockUtil import HaddockTypes ppHH2Contents :: FilePath -> String -> [(Module,Interface)] -> IO () ppHH2Contents odir package ifaces = do let contentsHH2File = package++".HxT" tree = mkModuleTree (map (\(mod,_) -> (mod,Nothing)) ifaces) --TODO: packages doc = text "" $$ text "" $$ text "" $$ nest 4 (ppModuleTree [] tree) $$ text "" writeFile (odir ++ pathSeparator:contentsHH2File) (render doc) where ppModuleTree :: [String] -> [ModuleTree] -> Doc ppModuleTree ss [x] = ppNode ss x ppModuleTree ss (x:xs) = ppNode ss x $$ ppModuleTree ss xs ppModuleTree _ [] = error "HaddockHH2.ppHH2Contents.ppModuleTree: no module trees given" ppNode :: [String] -> ModuleTree -> Doc ppNode ss (Node s leaf _pkg []) = text " ppAttributes leaf (s:ss) <> text "/>" ppNode ss (Node s leaf _pkg ts) = text " ppAttributes leaf (s:ss) <> text ">" $$ nest 4 (ppModuleTree (s:ss) ts) $+$ text "" ppAttributes :: Bool -> [String] -> Doc ppAttributes isleaf ss = hsep [ppId,ppTitle,ppUrl] where mdl = foldr (++) "" (s' : map ('.':) ss') (s':ss') = reverse ss -- reconstruct the module name ppId = text "Id=" <> doubleQuotes (text mdl) ppTitle = text "Title=" <> doubleQuotes (text (head ss)) ppUrl | isleaf = text " Url=" <> doubleQuotes (text (moduleHtmlFile "" mdl)) | otherwise = empty ----------------------------------------------------------------------------------- ppHH2Index :: FilePath -> String -> [(Module,Interface)] -> IO () ppHH2Index odir package ifaces = do let indexKHH2File = package++"K.HxK" indexNHH2File = package++"N.HxK" docK = text "" $$ text "" $$ text "" $$ nest 4 (ppList index) $+$ text "" docN = text "" $$ text "" $$ text "" $$ text "" $$ nest 4 (text "") $$ text "" $$ text "" writeFile (odir ++ pathSeparator:indexKHH2File) (render docK) writeFile (odir ++ pathSeparator:indexNHH2File) (render docN) where index :: [(HsName, [Module])] index = fmToList (foldr getIfaceIndex emptyFM ifaces) getIfaceIndex (mdl,iface) fm = addListToFM_C (++) fm [(name, [mdl]) | (name, Qual mdl' _) <- fmToList (iface_env iface), mdl == mdl'] ppList [] = empty ppList ((name,mdls):vs) = text " text (show name) <> text "\">" $$ nest 4 (vcat (map (ppJump name) mdls)) $$ text "" $$ ppList vs ppJump name (Module mdl) = text " text (nameHtmlRef fp mdl name) <> text "\"/>" where fp = case lookupFM html_xrefs (Module mdl) of Nothing -> "" Just fp0 -> fp0 ----------------------------------------------------------------------------------- ppHH2Files :: FilePath -> String -> [(Module,Interface)] -> IO () ppHH2Files odir package ifaces = do let filesHH2File = package++".HxF" doc = text "" $$ text "" $$ text "" $$ nest 4 (ppMods ifaces $$ text "" $$ text "" $$ ppIndexFiles chars $$ text "text iconFile<>text "\"/>" $$ text "text cssFile<>text "\"/>") $$ text "" writeFile (odir ++ pathSeparator:filesHH2File) (render doc) where ppMods [] = empty ppMods ((Module mdl,_):ifaces) = text " text (moduleHtmlFile "" mdl) <> text "\"/>" $$ ppMods ifaces ppIndexFiles [] = empty ppIndexFiles (c:cs) = text " char c <> text ".html\"/>" $$ ppIndexFiles cs chars :: [Char] chars = keysFM (foldr getIfaceIndex emptyFM ifaces) getIfaceIndex (mdl,iface) fm = addListToFM fm [(toUpper (head (show name)),()) | (name, Qual mdl' _) <- fmToList (iface_env iface), mdl == mdl'] ----------------------------------------------------------------------------------- ppHH2Collection :: FilePath -> String -> [(Module,Interface)] -> IO () ppHH2Collection odir package ifaces = do let collectionHH2File = package++".HxC" doc = text "" $$ text "" $$ text " text package <> text "\">" $$ nest 4 (text "" $$ nest 4 (text " text package <> text ".HxF\"/>") $$ text "" $$ text " text package <> text ".HxT\"/>" $$ text " text package <> text "K.HxK\"/>" $$ text " text package <> text "N.HxK\"/>" $$ text "" $$ text "" $$ text "" $$ text "" $$ text "" $$ text "") $$ text "" writeFile (odir ++ pathSeparator:collectionHH2File) (render doc)