diff options
author | simonmar <unknown> | 2002-04-24 15:14:12 +0000 |
---|---|---|
committer | simonmar <unknown> | 2002-04-24 15:14:12 +0000 |
commit | 995d3f9ed418352cb8e341630e7c7655080c1612 (patch) | |
tree | 48515c410f772e4c84bc3bd9448218ec7b5da500 /src | |
parent | 106adbbe619e9bd42a6ca00f097d3eb22011f6f5 (diff) |
[haddock @ 2002-04-24 15:14:11 by simonmar]
Grok the kind of module headers we use in fptools/libraries, and pass
the "portability", "stability", and "maintainer" strings through into
the generated HTML. If the module header doesn't match the pattern,
then we don't include the info in the HTML.
Diffstat (limited to 'src')
-rw-r--r-- | src/HaddockHtml.hs | 17 | ||||
-rw-r--r-- | src/HaddockTypes.hs | 13 | ||||
-rw-r--r-- | src/HaddockUtil.hs | 26 | ||||
-rw-r--r-- | src/Main.hs | 58 |
4 files changed, 78 insertions, 36 deletions
diff --git a/src/HaddockHtml.hs b/src/HaddockHtml.hs index 8e02e535..2b2c4f3e 100644 --- a/src/HaddockHtml.hs +++ b/src/HaddockHtml.hs @@ -108,23 +108,28 @@ pageHeader mod iface title source_url = tda [theclass "modulebar"] << (vanillaTable << ( (td << font ! [size "6"] << toHtml mod) <-> - (tda [align "right"] << + moduleInfo iface + ) + ) + +moduleInfo iface + | Nothing <- iface_info iface = Html.emptyTable + | Just info <- iface_info iface = + tda [align "right"] << (table ! [width "300", border 0, cellspacing 0, cellpadding 0] << ( (tda [width "50%"] << font ! [color "#ffffff"] << bold << toHtml "Portability") <-> (tda [width "50%"] << font ! [color "#ffffff"] << - toHtml (iface_portability iface)) </> + toHtml (portability info)) </> (tda [width "50%"] << font ! [color "#ffffff"] << bold << toHtml "Stability") <-> (tda [width "50%"] << font ! [color "#ffffff"] << - toHtml (iface_stability iface)) </> + toHtml (stability info)) </> (tda [width "50%"] << font ! [color "#ffffff"] << bold << toHtml "Maintainer") <-> (tda [width "50%"] << font ! [color "#ffffff"] << - toHtml (iface_maintainer iface)) + toHtml (maintainer info)) )) - )) - ) -- --------------------------------------------------------------------------- -- Generate the module contents diff --git a/src/HaddockTypes.hs b/src/HaddockTypes.hs index c157a753..21ee513c 100644 --- a/src/HaddockTypes.hs +++ b/src/HaddockTypes.hs @@ -6,7 +6,7 @@ module HaddockTypes ( -- * Module interfaces - NameEnv, Interface(..), ExportItem(..), ModuleMap, + NameEnv, Interface(..), ModuleInfo(..), ExportItem(..), ModuleMap, -- * User documentation strings DocString, GenDoc(..), Doc, ParsedDoc, DocMarkup(..), @@ -49,15 +49,18 @@ data Interface -- Includes not just "main names" but names of constructors, -- record fields, etc. - iface_portability :: String, - iface_stability :: String, - iface_maintainer :: String, + iface_info :: Maybe ModuleInfo, -- ^ information from the module header - iface_doc :: Maybe Doc + iface_doc :: Maybe Doc -- ^ documentation from the module header } +data ModuleInfo = ModuleInfo + { portability :: String, + stability :: String, + maintainer :: String } + type DocString = String data ExportItem diff --git a/src/HaddockUtil.hs b/src/HaddockUtil.hs index 51c31438..8173cedf 100644 --- a/src/HaddockUtil.hs +++ b/src/HaddockUtil.hs @@ -13,12 +13,18 @@ module HaddockUtil ( -- * Filename utilities basename, dirname, splitFilename3, - isPathSeparator, pathSeparator + isPathSeparator, pathSeparator, + + -- * Miscellaneous utilities + die, dieMsg, mapSnd, mapMaybeM ) where import HsSyn -import List (intersect) + +import List ( intersect ) +import IO ( hPutStr, stderr ) +import System -- ----------------------------------------------------------------------------- -- Some Utilities @@ -136,3 +142,19 @@ isPathSeparator ch = #else ch == '/' #endif + +----------------------------------------------------------------------------- +-- misc. + +die :: String -> IO a +die s = hPutStr stderr s >> exitWith (ExitFailure 1) + +dieMsg :: String -> IO a +dieMsg s = getProgName >>= \prog -> die (prog ++ ": " ++ s) + +mapSnd f [] = [] +mapSnd f ((x,y):xs) = (x,f y) : mapSnd f xs + +mapMaybeM :: Monad m => (a -> m b) -> Maybe a -> m (Maybe b) +mapMaybeM f Nothing = return Nothing +mapMaybeM f (Just a) = f a >>= return . Just diff --git a/src/Main.hs b/src/Main.hs index 7be91b9a..ee6c0d3b 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -24,6 +24,7 @@ import FiniteMap --import Pretty +import RegexString import List ( nub ) import Monad ( when ) import Char ( isSpace ) @@ -144,9 +145,7 @@ mkInterface mod_map filename (HsModule mod exps imps decls maybe_doc) iface_exports = renamed_export_list, iface_orig_exports = orig_export_list, iface_decls = decl_map, - iface_portability = "portable", - iface_maintainer = "libraries@haskell.org", - iface_stability = "stable", + iface_info = maybe_info, iface_name_docs = doc_map, iface_doc = module_doc }, @@ -154,11 +153,13 @@ mkInterface mod_map filename (HsModule mod exps imps decls maybe_doc) missing_names1 ++ missing_names2 --ignore missing_names3 for now, ) where - (module_doc, missing_names_doc1) = + (module_doc, maybe_info, missing_names_doc1) = case maybe_doc of - Nothing -> (Nothing, []) - Just doc -> (Just doc', ns) - where (doc',ns) = formatDocString (lookupForDoc import_env) doc + Nothing -> (Nothing, Nothing, []) + Just doc -> (Just doc2, maybe_info, ns) + where + (doc1, maybe_info) = parseModuleHeader doc + (doc2,ns) = formatDocString (lookupForDoc import_env) doc1 locally_defined_names = collectNames decls @@ -524,19 +525,30 @@ strToHsQNames str Qual (Module mod) (HsVarName (HsSymbol str)) ] other -> [] ------------------------------------------------------------------------------ --- misc. - -die :: String -> IO a -die s = hPutStr stderr s >> exitWith (ExitFailure 1) - -dieMsg :: String -> IO a -dieMsg s = getProgName >>= \prog -> die (prog ++ ": " ++ s) - -mapSnd f [] = [] -mapSnd f ((x,y):xs) = (x,f y) : mapSnd f xs - -mapMaybeM :: Monad m => (a -> m b) -> Maybe a -> m (Maybe b) -mapMaybeM f Nothing = return Nothing -mapMaybeM f (Just a) = f a >>= return . Just - +-- ----------------------------------------------------------------------------- +-- Parsing module headers + +parseModuleHeader :: String -> (String, Maybe ModuleInfo) +parseModuleHeader str = + case matchRegexAll moduleHeaderRE str of + Just (before, match, after, _, (_:_:_:s1:s2:s3:_)) -> + (after, Just (ModuleInfo { + portability = s3, + stability = s2, + maintainer = s1 })) + _other -> (str, Nothing) + +moduleHeaderRE = mkRegexWithOpts + "^([ \t\n]*Module[ \t]*:.*\n)?\ + \([ \t\n]*Copyright[ \t]*:.*\n)?\ + \([ \t\n]*License[ \t]*:.*\n)?\ + \[ \t\n]*Maintainer[ \t]*:(.*)\n\ + \[ \t\n]*Stability[ \t]*:(.*)\n\ + \[ \t\n]*Portability[ \t]*:([^\n]*)\n" + True -- match "\n" with "." + False -- not case sensitive + -- All fields except the last (Portability) may be multi-line. + -- This is so that the portability field doesn't swallow up the + -- rest of the module documentation - we might want to revist + -- this at some point (perhaps have a separator between the + -- portability field and the module documentation?). |