diff options
Diffstat (limited to 'src/Haddock/Utils.hs')
-rw-r--r-- | src/Haddock/Utils.hs | 98 |
1 files changed, 57 insertions, 41 deletions
diff --git a/src/Haddock/Utils.hs b/src/Haddock/Utils.hs index ffbf7494..ab0d03b7 100644 --- a/src/Haddock/Utils.hs +++ b/src/Haddock/Utils.hs @@ -13,7 +13,7 @@ module Haddock.Utils ( -- * Misc utilities - restrictTo, + restrictTo, toDescription, toInstalledDescription, -- * Filename utilities @@ -31,12 +31,12 @@ module Haddock.Utils ( -- * Miscellaneous utilities getProgramName, bye, die, dieMsg, noDieMsg, mapSnd, mapMaybeM, escapeStr, - + -- * HTML cross reference mapping html_xrefs_ref, -- * Doc markup - markup, + markup, idMarkup, -- * List utilities @@ -45,7 +45,7 @@ module Haddock.Utils ( -- * MTL stuff MonadIO(..), - + -- * Logging parseVerbosity, out, @@ -72,7 +72,7 @@ import Data.Maybe ( fromJust ) import System.Environment ( getProgName ) import System.Exit ( exitWith, ExitCode(..) ) import System.IO ( hPutStr, stderr ) -import System.IO.Unsafe ( unsafePerformIO ) +import System.IO.Unsafe ( unsafePerformIO ) import System.FilePath import Distribution.Verbosity import Distribution.ReadE @@ -84,8 +84,9 @@ import qualified System.Posix.Internals import MonadUtils ( MonadIO(..) ) --- ----------------------------------------------------------------------------- --- Logging +-------------------------------------------------------------------------------- +-- * Logging +-------------------------------------------------------------------------------- parseVerbosity :: String -> Either String Verbosity @@ -102,8 +103,9 @@ out progVerbosity msgVerbosity msg | otherwise = return () --- ----------------------------------------------------------------------------- --- Some Utilities +-------------------------------------------------------------------------------- +-- * Some Utilities +-------------------------------------------------------------------------------- -- | Extract a module's short description. @@ -116,32 +118,33 @@ toInstalledDescription :: InstalledInterface -> Maybe (Doc Name) toInstalledDescription = hmi_description . instInfo --- --------------------------------------------------------------------------- --- Making abstract declarations +-------------------------------------------------------------------------------- +-- * Making abstract declarations +-------------------------------------------------------------------------------- restrictTo :: [Name] -> LHsDecl Name -> LHsDecl Name restrictTo names (L loc decl) = L loc $ case decl of - TyClD d | isDataDecl d && tcdND d == DataType -> - TyClD (d { tcdCons = restrictCons names (tcdCons d) }) - TyClD d | isDataDecl d && tcdND d == NewType -> + TyClD d | isDataDecl d && tcdND d == DataType -> + TyClD (d { tcdCons = restrictCons names (tcdCons d) }) + TyClD d | isDataDecl d && tcdND d == NewType -> case restrictCons names (tcdCons d) of - [] -> TyClD (d { tcdND = DataType, tcdCons = [] }) + [] -> TyClD (d { tcdND = DataType, tcdCons = [] }) [con] -> TyClD (d { tcdCons = [con] }) _ -> error "Should not happen" - TyClD d | isClassDecl d -> + TyClD d | isClassDecl d -> TyClD (d { tcdSigs = restrictDecls names (tcdSigs d), tcdATs = restrictATs names (tcdATs d) }) _ -> decl - + restrictCons :: [Name] -> [LConDecl Name] -> [LConDecl Name] -restrictCons names decls = [ L p d | L p (Just d) <- map (fmap keep) decls ] - where - keep d | unLoc (con_name d) `elem` names = +restrictCons names decls = [ L p d | L p (Just d) <- map (fmap keep) decls ] + where + keep d | unLoc (con_name d) `elem` names = case con_details d of PrefixCon _ -> Just d - RecCon fields + RecCon fields | all field_avail fields -> Just d | otherwise -> Just (d { con_details = PrefixCon (field_types fields) }) -- if we have *all* the field names available, then @@ -151,8 +154,8 @@ restrictCons names decls = [ L p d | L p (Just d) <- map (fmap keep) decls ] InfixCon _ _ -> Just d where field_avail (ConDeclField n _ _) = unLoc n `elem` names - field_types flds = [ t | ConDeclField _ t _ <- flds ] - + field_types flds = [ t | ConDeclField _ t _ <- flds ] + keep _ | otherwise = Nothing @@ -166,8 +169,9 @@ restrictATs :: [Name] -> [LTyClDecl Name] -> [LTyClDecl Name] restrictATs names ats = [ at | at <- ats , tcdName (unL at) `elem` names ] --- ----------------------------------------------------------------------------- --- Filename mangling functions stolen from s main/DriverUtil.lhs. +-------------------------------------------------------------------------------- +-- * Filename mangling functions stolen from s main/DriverUtil.lhs. +-------------------------------------------------------------------------------- moduleHtmlFile :: Module -> FilePath @@ -176,7 +180,7 @@ moduleHtmlFile mdl = Nothing -> mdl' ++ ".html" Just fp0 -> joinPath [fp0, mdl' ++ ".html"] where - mdl' = map (\c -> if c == '.' then '-' else c) + mdl' = map (\c -> if c == '.' then '-' else c) (moduleNameString (moduleName mdl)) @@ -205,8 +209,8 @@ subIndexHtmlFile a = "doc-index-" ++ b ++ ".html" | otherwise = show (ord a) --- ----------------------------------------------------------------------------- --- Anchor and URL utilities +------------------------------------------------------------------------------- +-- * Anchor and URL utilities -- -- NB: Anchor IDs, used as the destination of a link within a document must -- conform to XML's NAME production. That, taken with XHTML and HTML 4.01's @@ -216,18 +220,23 @@ subIndexHtmlFile a = "doc-index-" ++ b ++ ".html" -- of a URL. Indeed, %-escaping them can lead to compatibility issues as it -- isn't clear if such fragment identifiers should, or should not be unescaped -- before being matched with IDs in the target document. +------------------------------------------------------------------------------- + moduleUrl :: Module -> String moduleUrl = moduleHtmlFile -moduleNameUrl :: Module -> OccName -> String + +moduleNameUrl :: Module -> OccName -> String moduleNameUrl mdl n = moduleUrl mdl ++ '#' : nameAnchorId n + nameAnchorId :: OccName -> String nameAnchorId name = makeAnchorId (prefix : ':' : occNameString name) - where prefix | isValOcc name = 'v' + where prefix | isValOcc name = 'v' | otherwise = 't' + -- | Takes an arbitrary string and makes it a valid anchor ID. The mapping is -- identity preserving. makeAnchorId :: String -> String @@ -242,8 +251,10 @@ makeAnchorId (f:r) = escape isAlpha f ++ concatMap (escape isLegal) r isLegal c = isAscii c && isAlphaNum c -- NB: '-' is legal in IDs, but we use it as the escape char --- ----------------------------------------------------------------------------- --- Files we need to copy from our $libdir + +------------------------------------------------------------------------------- +-- * Files we need to copy from our $libdir +------------------------------------------------------------------------------- cssFile, iconFile, jsFile, plusFile, minusFile, framesFile :: String @@ -255,8 +266,9 @@ minusFile = "minus.gif" framesFile = "frames.html" ------------------------------------------------------------------------------ --- misc. +------------------------------------------------------------------------------- +-- * Misc. +------------------------------------------------------------------------------- getProgramName :: IO String @@ -331,14 +343,15 @@ isAlphaNumChar c = isAlphaChar c || isDigitChar c ----------------------------------------------------------------------------- --- HTML cross references - +-- * HTML cross references +-- -- For each module, we need to know where its HTML documentation lives -- so that we can point hyperlinks to it. It is extremely -- inconvenient to plumb this information to all the places that need -- it (basically every function in HaddockHtml), and furthermore the -- mapping is constant for any single run of Haddock. So for the time -- being I'm going to use a write-once global variable. +----------------------------------------------------------------------------- {-# NOINLINE html_xrefs_ref #-} @@ -352,12 +365,12 @@ html_xrefs = unsafePerformIO (readIORef html_xrefs_ref) ----------------------------------------------------------------------------- --- List utils +-- * List utils ----------------------------------------------------------------------------- replace :: Eq a => a -> a -> [a] -> [a] -replace a b = map (\x -> if x == a then b else x) +replace a b = map (\x -> if x == a then b else x) spanWith :: (a -> Maybe b) -> [a] -> ([b],[a]) spanWith _ [] = ([],[]) @@ -365,8 +378,10 @@ spanWith p xs@(a:as) | Just b <- p a = let (bs,cs) = spanWith p as in (b:bs,cs) | otherwise = ([],xs) + +----------------------------------------------------------------------------- +-- * Put here temporarily ----------------------------------------------------------------------------- --- put here temporarily markup :: DocMarkup id a -> Doc id -> a @@ -414,8 +429,9 @@ idMarkup = Markup { } --- ----------------------------------------------------------------------------- --- System tools +----------------------------------------------------------------------------- +-- * System tools +----------------------------------------------------------------------------- #ifdef mingw32_HOST_OS |