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 Maybe ( fromMaybe ) import HaddockModuleTree import HaddockUtil import HaddockTypes ppHH2Contents :: FilePath -> String -> Maybe String -> [ModuleTree] -> IO () ppHH2Contents odir doctitle maybe_package tree = do let contentsHH2File = package++".HxT" doc = text "" $$ text "" $$ text "" $$ nest 4 (text "text doctitle<>text"\" Url=\"index.html\">" $$ nest 4 (ppModuleTree [] tree) $+$ text "") $$ text "" writeFile (odir ++ pathSeparator:contentsHH2File) (render doc) where package = fromMaybe "pkg" maybe_package 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 -> Maybe String -> [(Module,Interface)] -> IO () ppHH2Index odir maybe_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 contentsHtmlFile<>text "\"/>") $$ text "" $$ text "" writeFile (odir ++ pathSeparator:indexKHH2File) (render docK) writeFile (odir ++ pathSeparator:indexNHH2File) (render docN) where package = fromMaybe "pkg" maybe_package 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 (escapeStr (show name)) <> text "\">" $$ nest 4 (vcat (map (ppJump name) mdls)) $$ text "" $$ ppList vs ppJump name (Module mdl) = text " text (nameHtmlRef mdl name) <> text "\"/>" ----------------------------------------------------------------------------------- ppHH2Files :: FilePath -> Maybe String -> [(Module,Interface)] -> [FilePath] -> IO () ppHH2Files odir maybe_package ifaces pkg_paths = do let filesHH2File = package++".HxF" doc = text "" $$ text "" $$ text "" $$ nest 4 (ppMods ifaces $$ text "text contentsHtmlFile<>text "\"/>" $$ text "text indexHtmlFile<>text "\"/>" $$ ppIndexFiles chars $$ ppLibFiles ("":pkg_paths)) $$ text "" writeFile (odir ++ pathSeparator:filesHH2File) (render doc) where package = fromMaybe "pkg" maybe_package ppMods [] = empty ppMods ((Module mdl,_):ifaces) = text " text (moduleHtmlFile mdl) <> text "\"/>" $$ ppMods ifaces ppIndexFiles [] = empty ppIndexFiles (c:cs) = text "text (subIndexHtmlFile c)<>text "\"/>" $$ ppIndexFiles cs ppLibFiles [] = empty ppLibFiles (path:paths) = ppLibFile cssFile $$ ppLibFile iconFile $$ ppLibFile jsFile $$ ppLibFile plusFile $$ ppLibFile minusFile $$ ppLibFiles paths where toPath fname | null path = fname | otherwise = path++pathSeparator:fname ppLibFile fname = text "text (toPath fname)<>text "\"/>" 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 -> Maybe String -> IO () ppHH2Collection odir doctitle maybe_package = do let package = fromMaybe "pkg" maybe_package collectionHH2File = package++".HxC" doc = text "" $$ text "" $$ text " text doctitle <> 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)