diff options
-rw-r--r-- | src/HaddockHtml.hs | 147 | ||||
-rw-r--r-- | src/HaddockLex.hs | 2 | ||||
-rw-r--r-- | src/HaddockParse.y | 3 | ||||
-rw-r--r-- | src/HaddockTypes.hs | 8 |
4 files changed, 92 insertions, 68 deletions
diff --git a/src/HaddockHtml.hs b/src/HaddockHtml.hs index 461b698a..ea6d3f73 100644 --- a/src/HaddockHtml.hs +++ b/src/HaddockHtml.hs @@ -11,7 +11,7 @@ import HaddockVersion import HaddockTypes import HsSyn -import Maybe ( fromJust, isJust ) +import Maybe ( fromJust, isNothing ) import FiniteMap import List ( sortBy ) import Char ( toUpper, toLower ) @@ -253,8 +253,6 @@ ppHtmlIndex title ifaces = do else anchor ! [href (linkId mod nm)] << toHtml mod | (Module mod, defining) <- entries ]) - where - defining_mods = [ m | (Module m, True) <- entries ] nameBeginsWith (HsTyClsName id) c = idBeginsWith id c nameBeginsWith (HsVarName id) c = idBeginsWith id c @@ -379,47 +377,46 @@ keepDecl _ = False -- ----------------------------------------------------------------------------- -- Data & newtype declarations --- First, the abstract case: - -ppHsDataDecl doc_map summary (HsDataDecl loc ctx nm args [] drv) = - declWithDoc summary (lookupFM doc_map nm) - (ppHsDataHeader summary nm args) - --- Second, the summary cases: - -ppHsDataDecl doc_map True (HsDataDecl loc ctx nm args [con] drv) = +ppShortDataDecl doc_map summary (HsDataDecl loc ctx nm args [con] drv) = declBox ( -- single constructor special case - ppHsDataHeader True nm args - <+> equals <+> ppHsSummaryConstr con + ppHsDataHeader summary nm args + <+> equals <+> ppShortConstr summary con ) -ppHsDataDecl doc_map True (HsDataDecl loc ctx nm args cons drv) = - td << ( - vanillaTable << ( +ppShortDataDecl doc_map summary (HsDataDecl loc ctx nm args cons drv) = + declBox << vanillaTable << ( aboves ( - (declBox (ppHsDataHeader True nm args) : + (declBox (ppHsDataHeader summary nm args) : zipWith do_constr ('=':repeat '|') cons ) ) - )) + ) where do_constr c con = tda [theclass "condecl"] << ( - toHtml [c] <+> ppHsSummaryConstr con) + toHtml [c] <+> ppShortConstr summary con) --- Now, the full expanded documented version: +-- First, the abstract case: -ppHsDataDecl doc_map False decl@(HsDataDecl loc ctx nm args cons drv) = - td << ( - vanillaTable << ( - if isJust doc - then aboves [header, datadoc, constrs] - else aboves [header, constrs] - ) - ) +ppHsDataDecl doc_map summary (HsDataDecl loc ctx nm args [] drv) = + declWithDoc summary (lookupFM doc_map nm) + (ppHsDataHeader summary nm args) + +-- The rest of the cases: + +ppHsDataDecl doc_map summary decl@(HsDataDecl loc ctx nm args cons drv) + | summary || (isNothing doc && all constr_has_no_doc cons) + = ppShortDataDecl doc_map summary decl + + | otherwise + = td << vanillaTable << (header </> datadoc </> constrs) where header = declBox (ppHsDataHeader False nm args) datadoc = docBox (markup htmlMarkup (fromJust doc)) + constr_hdr = tda [ theclass "section4" ] << toHtml "Constructors" - constrs = tda [theclass "databody"] << ( + constrs + | null cons = Html.emptyTable + | otherwise = + tda [theclass "databody"] << ( table ! [width "100%", cellpadding 0, cellspacing 10] << aboves (constr_hdr : map do_constr cons) ) @@ -429,13 +426,16 @@ ppHsDataDecl doc_map False decl@(HsDataDecl loc ctx nm args cons drv) = Just c = declMainBinder decl doc = lookupFM doc_map c + constr_has_no_doc (HsConDecl _ nm _ _) + = isNothing (lookupFM doc_map nm) -ppHsSummaryConstr :: HsConDecl -> Html -ppHsSummaryConstr (HsConDecl pos nm typeList _maybe_doc) = - hsep (ppHsBinder True nm : map ppHsBangType typeList) -ppHsSummaryConstr (HsRecDecl pos nm fields maybe_doc) = - ppHsBinder True nm +++ - braces (vanillaTable << aboves (map ppSummaryField fields)) + +ppShortConstr :: Bool -> HsConDecl -> Html +ppShortConstr summary (HsConDecl pos nm typeList _maybe_doc) = + hsep (ppHsBinder summary nm : map ppHsBangType typeList) +ppShortConstr summary (HsRecDecl pos nm fields maybe_doc) = + ppHsBinder summary nm +++ + braces (vanillaTable << aboves (map (ppShortField summary) fields)) ppHsFullConstr doc_map (HsConDecl pos nm typeList _maybe_doc) = declWithDoc False doc ( @@ -461,9 +461,9 @@ ppHsFullConstr doc_map (HsRecDecl pos nm fields maybe_doc) = doc = lookupFM doc_map nm -ppSummaryField (HsFieldDecl ns ty _doc) +ppShortField summary (HsFieldDecl ns ty _doc) = tda [theclass "recfield"] << ( - hsep (punctuate comma (map (ppHsBinder True) ns)) + hsep (punctuate comma (map (ppHsBinder summary) ns)) <+> toHtml "::" <+> ppHsBangType ty ) @@ -487,40 +487,58 @@ ppHsBangType (HsUnBangedTy ty) = ppHsAType ty ppClassHdr ty = keyword "class" <+> ppHsType ty -ppHsClassDecl doc_map True (HsClassDecl loc ty decls) = - if null decls - then declBox (ppClassHdr ty) +ppShortClassDecl doc_map summary decl@(HsClassDecl loc ty decls) = + if null decls + then declBox hdr else td << ( vanillaTable << ( - declBox (ppClassHdr ty <+> keyword "where") + declBox (hdr <+> keyword "where") </> tda [theclass "cbody"] << ( vanillaTable << ( - aboves (map (doDecl doc_map True) (filter keepDecl decls)) + aboves (map (doDecl doc_map summary) (filter keepDecl decls)) )) )) + where + Just c = declMainBinder decl + hdr | not summary = linkTarget c +++ ppClassHdr ty + | otherwise = ppClassHdr ty -ppHsClassDecl doc_map False decl@(HsClassDecl loc ty decls) = - if null decls - then declBox (linkTarget c +++ ppClassHdr ty) - else td << ( - vanillaTable << ( - if isJust doc - then aboves [header, classdoc, body] - else aboves [header, body] - )) - where header = declBox (linkTarget c +++ ppClassHdr ty <+> keyword "where") - classdoc = docBox (markup htmlMarkup (fromJust doc)) - meth_hdr = tda [ theclass "section4" ] << toHtml "Methods" - body = td << ( - table ! [width "100%", cellpadding 0, cellspacing 8] << ( +ppHsClassDecl doc_map summary decl@(HsClassDecl loc ty decls) + | summary || (isNothing doc && all decl_has_no_doc kept_decls) + = ppShortClassDecl doc_map summary decl + + | otherwise + = td << vanillaTable << (header </> classdoc </> body) + + where + doc = lookupFM doc_map c + Just c = declMainBinder decl + + header + | null decls = declBox (linkTarget c +++ ppClassHdr ty) + | otherwise = declBox (linkTarget c +++ ppClassHdr ty <+> + keyword "where") + + classdoc + | Just d <- doc = docBox (markup htmlMarkup d) + | otherwise = Html.emptyTable + + meth_hdr = tda [ theclass "section4" ] << toHtml "Methods" + + body + | null decls = Html.emptyTable + | otherwise = + td << table ! [width "100%", cellpadding 0, cellspacing 8] << ( meth_hdr </> - aboves (map (doDecl doc_map False) - (filter keepDecl decls)) - )) + aboves (map (doDecl doc_map False) kept_decls) + ) + + kept_decls = filter keepDecl decls - Just c = declMainBinder decl - doc = lookupFM doc_map c + decl_has_no_doc decl + | Just b <- declMainBinder decl = isNothing (lookupFM doc_map b) + | otherwise = True -- ----------------------------------------------------------------------------- -- Types and contexts @@ -614,7 +632,8 @@ htmlMarkup = Markup { markupMonospaced = tt . toHtml, markupUnorderedList = ulist . concatHtml . map (li <<), markupOrderedList = olist . concatHtml . map (li <<), - markupCodeBlock = pre + markupCodeBlock = pre, + markupURL = \url -> anchor ! [href url] << toHtml url } -- ----------------------------------------------------------------------------- @@ -635,8 +654,6 @@ comma = char ',' char c = toHtml [c] empty = toHtml "" -quotes p = char '`' +++ p +++ char '\'' -doubleQuotes p = char '"' +++ p +++ char '"' parens p = char '(' +++ p +++ char ')' brackets p = char '[' +++ p +++ char ']' braces p = char '{' +++ p +++ char '}' diff --git a/src/HaddockLex.hs b/src/HaddockLex.hs index 9b224455..8e721996 100644 --- a/src/HaddockLex.hs +++ b/src/HaddockLex.hs @@ -12,7 +12,7 @@ module HaddockLex ( import IOExts --tmp import Char -special = "\'\"/[]" +special = "\'\"/[]<>" data Token = TokPara diff --git a/src/HaddockParse.y b/src/HaddockParse.y index 2402452c..9411ff44 100644 --- a/src/HaddockParse.y +++ b/src/HaddockParse.y @@ -12,6 +12,8 @@ import HaddockTypes '/' { TokSpecial '/' } '[' { TokSpecial '[' } ']' { TokSpecial ']' } + '<' { TokSpecial '<' } + '>' { TokSpecial '>' } '*' { TokBullet } '(n)' { TokNumber } PARA { TokPara } @@ -46,6 +48,7 @@ seq :: { ParsedDoc } elem :: { ParsedDoc } : STRING { DocString $1 } | '/' STRING '/' { DocEmphasis (DocString $2) } + | '<' STRING '>' { DocURL $2 } | SQUO STRING SQUO { DocIdentifier $2 } | DQUO STRING DQUO { DocModule $2 } | '[' seq ']' { DocMonospaced $2 } diff --git a/src/HaddockTypes.hs b/src/HaddockTypes.hs index bd519319..e13fcb1a 100644 --- a/src/HaddockTypes.hs +++ b/src/HaddockTypes.hs @@ -158,6 +158,7 @@ data GenDoc id | DocUnorderedList [GenDoc id] | DocOrderedList [GenDoc id] | DocCodeBlock (GenDoc id) + | DocURL String type Doc = GenDoc HsQName type ParsedDoc = GenDoc String @@ -177,7 +178,8 @@ data DocMarkup id a = Markup { markupMonospaced :: a -> a, markupUnorderedList :: [a] -> a, markupOrderedList :: [a] -> a, - markupCodeBlock :: a -> a + markupCodeBlock :: a -> a, + markupURL :: String -> a } markup :: DocMarkup id a -> GenDoc id -> a @@ -192,6 +194,7 @@ markup m (DocMonospaced d) = markupMonospaced m (markup m d) markup m (DocUnorderedList ds) = markupUnorderedList m (map (markup m) ds) markup m (DocOrderedList ds) = markupOrderedList m (map (markup m) ds) markup m (DocCodeBlock d) = markupCodeBlock m (markup m d) +markup m (DocURL url) = markupURL m url -- | Since marking up is just a matter of mapping 'Doc' into some -- other type, we can \'rename\' documentation by marking up 'Doc' into @@ -207,7 +210,8 @@ mapIdent f = Markup { markupMonospaced = DocMonospaced, markupUnorderedList = DocUnorderedList, markupOrderedList = DocOrderedList, - markupCodeBlock = DocCodeBlock + markupCodeBlock = DocCodeBlock, + markupURL = DocURL } -- ----------------------------------------------------------------------------- |