diff options
author | krasimir <unknown> | 2004-07-31 20:35:21 +0000 |
---|---|---|
committer | krasimir <unknown> | 2004-07-31 20:35:21 +0000 |
commit | 3c0c53ba97105aef3718ccf80257d5eaaf35c94e (patch) | |
tree | b43e2dd1cf62f5d558de4e16d75ace09ab468cdb /src/HaddockDevHelp.hs | |
parent | 85ce0237c34e9357eef4d26d7084d3452c37f4f4 (diff) |
[haddock @ 2004-07-31 20:35:21 by krasimir]
Added support for DevHelp
Diffstat (limited to 'src/HaddockDevHelp.hs')
-rw-r--r-- | src/HaddockDevHelp.hs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/HaddockDevHelp.hs b/src/HaddockDevHelp.hs new file mode 100644 index 00000000..95987230 --- /dev/null +++ b/src/HaddockDevHelp.hs @@ -0,0 +1,76 @@ +module HaddockDevHelp(ppDevHelpFile) where + +import HsSyn hiding(Doc) + +#if __GLASGOW_HASKELL__ < 503 +import Pretty +import FiniteMap +#else +import Text.PrettyPrint +import Data.FiniteMap +import Data.Char +#endif + +import Maybe ( fromMaybe ) +import HaddockModuleTree +import HaddockUtil +import HaddockTypes + + +ppDevHelpFile :: FilePath -> String -> Maybe String -> [(Module,Interface)] -> IO () +ppDevHelpFile odir doctitle maybe_package ifaces = do + let devHelpFile = package++".devhelp" + tree = mkModuleTree [(mod,iface_package iface) | (mod,iface) <- ifaces] + doc = + text "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>" $$ + (text "<book xmlns=\"http://www.devhelp.net/book\" title=\""<>text doctitle<> + text "\" link=\""<>text contentsHtmlFile<>text"\" author=\"\" name=\""<>text package<>text "\">") $$ + text "<chapters>" $$ + nest 4 (ppModuleTree [] tree) $+$ + text "</chapters>" $$ + text "<functions>" $$ + nest 4 (ppList index) $+$ + text "</functions>" $$ + text "</book>" + writeFile (odir ++ pathSeparator:devHelpFile) (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 "HaddockHH.ppHHContents.fn: no module trees given" + + ppNode :: [String] -> ModuleTree -> Doc + ppNode ss (Node s leaf _pkg ts) = + case ts of + [] -> text "<sub"<+>ppAttribs<>text "/>" + ts -> + text "<sub"<+>ppAttribs<>text ">" $$ + nest 4 (ppModuleTree (s:ss) ts) $+$ + text "</sub>" + where + ppLink | leaf = text (moduleHtmlFile "" mdl) + | otherwise = empty + + ppAttribs = text "name="<>doubleQuotes (text s)<+>text "link="<>doubleQuotes ppLink + + mdl = foldr (++) "" (s' : map ('.':) ss') + (s':ss') = reverse (s:ss) + -- reconstruct the module name + + 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,refs):mdls) = + ppReference name refs $$ + ppList mdls + + ppReference name [] = empty + ppReference name (Module mdl:refs) = + text "<function name=\""<>text (escapeStr (show name))<>text"\" link=\""<>text (nameHtmlRef "" mdl name)<>text"\"/>" $$ + ppReference name refs |