{-# OPTIONS_GHC -fno-warn-orphans #-}
module Haddock.Doc ( module Documentation.Haddock.Doc
                   , docCodeBlock
                   , combineDocumentation
                   ) where

import Data.Maybe
import Documentation.Haddock.Doc
import Haddock.Types
import Haddock.Utils (mkMeta)

combineDocumentation :: Documentation name -> Maybe (MDoc name)
combineDocumentation :: Documentation name -> Maybe (MDoc name)
combineDocumentation (Documentation Maybe (MDoc name)
Nothing Maybe (Doc name)
Nothing) = Maybe (MDoc name)
forall a. Maybe a
Nothing
combineDocumentation (Documentation Maybe (MDoc name)
mDoc Maybe (Doc name)
mWarning)   =
  MDoc name -> Maybe (MDoc name)
forall a. a -> Maybe a
Just (MDoc name
-> (Doc name -> MDoc name) -> Maybe (Doc name) -> MDoc name
forall b a. b -> (a -> b) -> Maybe a -> b
maybe MDoc name
forall mod id. MetaDoc mod id
emptyMetaDoc Doc name -> MDoc name
forall a. Doc a -> MDoc a
mkMeta Maybe (Doc name)
mWarning
        MDoc name -> MDoc name -> MDoc name
forall mod id. MetaDoc mod id -> MetaDoc mod id -> MetaDoc mod id
`metaDocAppend`
        MDoc name -> Maybe (MDoc name) -> MDoc name
forall a. a -> Maybe a -> a
fromMaybe MDoc name
forall mod id. MetaDoc mod id
emptyMetaDoc Maybe (MDoc name)
mDoc)

-- Drop trailing whitespace from @..@ code blocks.  Otherwise this:
--
--    -- @
--    -- foo
--    -- @
--
-- turns into (DocCodeBlock "\nfoo\n ") which when rendered in HTML
-- gives an extra vertical space after the code block.  The single space
-- on the final line seems to trigger the extra vertical space.
--
docCodeBlock :: DocH mod id -> DocH mod id
docCodeBlock :: DocH mod id -> DocH mod id
docCodeBlock (DocString String
s)
  = String -> DocH mod id
forall mod id. String -> DocH mod id
DocString (String -> String
forall a. [a] -> [a]
reverse (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
" \t") (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> String
forall a. [a] -> [a]
reverse String
s)
docCodeBlock (DocAppend DocH mod id
l DocH mod id
r)
  = DocH mod id -> DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id -> DocH mod id
DocAppend DocH mod id
l (DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id
docCodeBlock DocH mod id
r)
docCodeBlock DocH mod id
d = DocH mod id
d