-- | @since 1.4.5
module Documentation.Haddock.Markup
  ( markup
  , idMarkup
  , plainMarkup
  ) where

import Data.Maybe (fromMaybe)

import Documentation.Haddock.Types

markup :: DocMarkupH mod id a -> DocH mod id -> a
markup :: forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
DocEmpty = DocMarkupH mod id a -> a
forall mod id a. DocMarkupH mod id a -> a
markupEmpty DocMarkupH mod id a
m
markup DocMarkupH mod id a
m (DocAppend DocH mod id
d1 DocH mod id
d2) = DocMarkupH mod id a -> a -> a -> a
forall mod id a. DocMarkupH mod id a -> a -> a -> a
markupAppend DocMarkupH mod id a
m (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d1) (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d2)
markup DocMarkupH mod id a
m (DocString String
s) = DocMarkupH mod id a -> String -> a
forall mod id a. DocMarkupH mod id a -> String -> a
markupString DocMarkupH mod id a
m String
s
markup DocMarkupH mod id a
m (DocParagraph DocH mod id
d) = DocMarkupH mod id a -> a -> a
forall mod id a. DocMarkupH mod id a -> a -> a
markupParagraph DocMarkupH mod id a
m (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d)
markup DocMarkupH mod id a
m (DocIdentifier id
x) = DocMarkupH mod id a -> id -> a
forall mod id a. DocMarkupH mod id a -> id -> a
markupIdentifier DocMarkupH mod id a
m id
x
markup DocMarkupH mod id a
m (DocIdentifierUnchecked mod
x) = DocMarkupH mod id a -> mod -> a
forall mod id a. DocMarkupH mod id a -> mod -> a
markupIdentifierUnchecked DocMarkupH mod id a
m mod
x
markup DocMarkupH mod id a
m (DocModule (ModLink String
mo Maybe (DocH mod id)
l)) = DocMarkupH mod id a -> ModLink a -> a
forall mod id a. DocMarkupH mod id a -> ModLink a -> a
markupModule DocMarkupH mod id a
m (String -> Maybe a -> ModLink a
forall id. String -> Maybe id -> ModLink id
ModLink String
mo ((DocH mod id -> a) -> Maybe (DocH mod id) -> Maybe a
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m) Maybe (DocH mod id)
l))
markup DocMarkupH mod id a
m (DocWarning DocH mod id
d) = DocMarkupH mod id a -> a -> a
forall mod id a. DocMarkupH mod id a -> a -> a
markupWarning DocMarkupH mod id a
m (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d)
markup DocMarkupH mod id a
m (DocEmphasis DocH mod id
d) = DocMarkupH mod id a -> a -> a
forall mod id a. DocMarkupH mod id a -> a -> a
markupEmphasis DocMarkupH mod id a
m (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d)
markup DocMarkupH mod id a
m (DocBold DocH mod id
d) = DocMarkupH mod id a -> a -> a
forall mod id a. DocMarkupH mod id a -> a -> a
markupBold DocMarkupH mod id a
m (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d)
markup DocMarkupH mod id a
m (DocMonospaced DocH mod id
d) = DocMarkupH mod id a -> a -> a
forall mod id a. DocMarkupH mod id a -> a -> a
markupMonospaced DocMarkupH mod id a
m (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d)
markup DocMarkupH mod id a
m (DocUnorderedList [DocH mod id]
ds) = DocMarkupH mod id a -> [a] -> a
forall mod id a. DocMarkupH mod id a -> [a] -> a
markupUnorderedList DocMarkupH mod id a
m ((DocH mod id -> a) -> [DocH mod id] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m) [DocH mod id]
ds)
markup DocMarkupH mod id a
m (DocOrderedList [(Int, DocH mod id)]
ds) = DocMarkupH mod id a -> [(Int, a)] -> a
forall mod id a. DocMarkupH mod id a -> [(Int, a)] -> a
markupOrderedList DocMarkupH mod id a
m (((Int, DocH mod id) -> (Int, a))
-> [(Int, DocH mod id)] -> [(Int, a)]
forall a b. (a -> b) -> [a] -> [b]
map (\(Int
index, DocH mod id
a) -> (Int
index, DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
a)) [(Int, DocH mod id)]
ds)
markup DocMarkupH mod id a
m (DocDefList [(DocH mod id, DocH mod id)]
ds) = DocMarkupH mod id a -> [(a, a)] -> a
forall mod id a. DocMarkupH mod id a -> [(a, a)] -> a
markupDefList DocMarkupH mod id a
m (((DocH mod id, DocH mod id) -> (a, a))
-> [(DocH mod id, DocH mod id)] -> [(a, a)]
forall a b. (a -> b) -> [a] -> [b]
map (DocMarkupH mod id a -> (DocH mod id, DocH mod id) -> (a, a)
forall mod id a.
DocMarkupH mod id a -> (DocH mod id, DocH mod id) -> (a, a)
markupPair DocMarkupH mod id a
m) [(DocH mod id, DocH mod id)]
ds)
markup DocMarkupH mod id a
m (DocCodeBlock DocH mod id
d) = DocMarkupH mod id a -> a -> a
forall mod id a. DocMarkupH mod id a -> a -> a
markupCodeBlock DocMarkupH mod id a
m (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
d)
markup DocMarkupH mod id a
m (DocHyperlink (Hyperlink String
u Maybe (DocH mod id)
l)) = DocMarkupH mod id a -> Hyperlink a -> a
forall mod id a. DocMarkupH mod id a -> Hyperlink a -> a
markupHyperlink DocMarkupH mod id a
m (String -> Maybe a -> Hyperlink a
forall id. String -> Maybe id -> Hyperlink id
Hyperlink String
u ((DocH mod id -> a) -> Maybe (DocH mod id) -> Maybe a
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m) Maybe (DocH mod id)
l))
markup DocMarkupH mod id a
m (DocAName String
ref) = DocMarkupH mod id a -> String -> a
forall mod id a. DocMarkupH mod id a -> String -> a
markupAName DocMarkupH mod id a
m String
ref
markup DocMarkupH mod id a
m (DocPic Picture
img) = DocMarkupH mod id a -> Picture -> a
forall mod id a. DocMarkupH mod id a -> Picture -> a
markupPic DocMarkupH mod id a
m Picture
img
markup DocMarkupH mod id a
m (DocMathInline String
mathjax) = DocMarkupH mod id a -> String -> a
forall mod id a. DocMarkupH mod id a -> String -> a
markupMathInline DocMarkupH mod id a
m String
mathjax
markup DocMarkupH mod id a
m (DocMathDisplay String
mathjax) = DocMarkupH mod id a -> String -> a
forall mod id a. DocMarkupH mod id a -> String -> a
markupMathDisplay DocMarkupH mod id a
m String
mathjax
markup DocMarkupH mod id a
m (DocProperty String
p) = DocMarkupH mod id a -> String -> a
forall mod id a. DocMarkupH mod id a -> String -> a
markupProperty DocMarkupH mod id a
m String
p
markup DocMarkupH mod id a
m (DocExamples [Example]
e) = DocMarkupH mod id a -> [Example] -> a
forall mod id a. DocMarkupH mod id a -> [Example] -> a
markupExample DocMarkupH mod id a
m [Example]
e
markup DocMarkupH mod id a
m (DocHeader (Header Int
l DocH mod id
t)) = DocMarkupH mod id a -> Header a -> a
forall mod id a. DocMarkupH mod id a -> Header a -> a
markupHeader DocMarkupH mod id a
m (Int -> a -> Header a
forall id. Int -> id -> Header id
Header Int
l (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
t))
markup DocMarkupH mod id a
m (DocTable (Table [TableRow (DocH mod id)]
h [TableRow (DocH mod id)]
b)) = DocMarkupH mod id a -> Table a -> a
forall mod id a. DocMarkupH mod id a -> Table a -> a
markupTable DocMarkupH mod id a
m ([TableRow a] -> [TableRow a] -> Table a
forall id. [TableRow id] -> [TableRow id] -> Table id
Table ((TableRow (DocH mod id) -> TableRow a)
-> [TableRow (DocH mod id)] -> [TableRow a]
forall a b. (a -> b) -> [a] -> [b]
map ((DocH mod id -> a) -> TableRow (DocH mod id) -> TableRow a
forall a b. (a -> b) -> TableRow a -> TableRow b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m)) [TableRow (DocH mod id)]
h) ((TableRow (DocH mod id) -> TableRow a)
-> [TableRow (DocH mod id)] -> [TableRow a]
forall a b. (a -> b) -> [a] -> [b]
map ((DocH mod id -> a) -> TableRow (DocH mod id) -> TableRow a
forall a b. (a -> b) -> TableRow a -> TableRow b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m)) [TableRow (DocH mod id)]
b))

markupPair :: DocMarkupH mod id a -> (DocH mod id, DocH mod id) -> (a, a)
markupPair :: forall mod id a.
DocMarkupH mod id a -> (DocH mod id, DocH mod id) -> (a, a)
markupPair DocMarkupH mod id a
m (DocH mod id
a, DocH mod id
b) = (DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
a, DocMarkupH mod id a -> DocH mod id -> a
forall mod id a. DocMarkupH mod id a -> DocH mod id -> a
markup DocMarkupH mod id a
m DocH mod id
b)

-- | The identity markup
idMarkup :: DocMarkupH mod id (DocH mod id)
idMarkup :: forall mod id. DocMarkupH mod id (DocH mod id)
idMarkup =
  Markup
    { markupEmpty :: DocH mod id
markupEmpty = DocH mod id
forall mod id. DocH mod id
DocEmpty
    , markupString :: String -> DocH mod id
markupString = String -> DocH mod id
forall mod id. String -> DocH mod id
DocString
    , markupParagraph :: DocH mod id -> DocH mod id
markupParagraph = DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id
DocParagraph
    , markupAppend :: DocH mod id -> DocH mod id -> DocH mod id
markupAppend = DocH mod id -> DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id -> DocH mod id
DocAppend
    , markupIdentifier :: id -> DocH mod id
markupIdentifier = id -> DocH mod id
forall mod id. id -> DocH mod id
DocIdentifier
    , markupIdentifierUnchecked :: mod -> DocH mod id
markupIdentifierUnchecked = mod -> DocH mod id
forall mod id. mod -> DocH mod id
DocIdentifierUnchecked
    , markupModule :: ModLink (DocH mod id) -> DocH mod id
markupModule = ModLink (DocH mod id) -> DocH mod id
forall mod id. ModLink (DocH mod id) -> DocH mod id
DocModule
    , markupWarning :: DocH mod id -> DocH mod id
markupWarning = DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id
DocWarning
    , markupEmphasis :: DocH mod id -> DocH mod id
markupEmphasis = DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id
DocEmphasis
    , markupBold :: DocH mod id -> DocH mod id
markupBold = DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id
DocBold
    , markupMonospaced :: DocH mod id -> DocH mod id
markupMonospaced = DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id
DocMonospaced
    , markupUnorderedList :: [DocH mod id] -> DocH mod id
markupUnorderedList = [DocH mod id] -> DocH mod id
forall mod id. [DocH mod id] -> DocH mod id
DocUnorderedList
    , markupOrderedList :: [(Int, DocH mod id)] -> DocH mod id
markupOrderedList = [(Int, DocH mod id)] -> DocH mod id
forall mod id. [(Int, DocH mod id)] -> DocH mod id
DocOrderedList
    , markupDefList :: [(DocH mod id, DocH mod id)] -> DocH mod id
markupDefList = [(DocH mod id, DocH mod id)] -> DocH mod id
forall mod id. [(DocH mod id, DocH mod id)] -> DocH mod id
DocDefList
    , markupCodeBlock :: DocH mod id -> DocH mod id
markupCodeBlock = DocH mod id -> DocH mod id
forall mod id. DocH mod id -> DocH mod id
DocCodeBlock
    , markupHyperlink :: Hyperlink (DocH mod id) -> DocH mod id
markupHyperlink = Hyperlink (DocH mod id) -> DocH mod id
forall mod id. Hyperlink (DocH mod id) -> DocH mod id
DocHyperlink
    , markupAName :: String -> DocH mod id
markupAName = String -> DocH mod id
forall mod id. String -> DocH mod id
DocAName
    , markupPic :: Picture -> DocH mod id
markupPic = Picture -> DocH mod id
forall mod id. Picture -> DocH mod id
DocPic
    , markupMathInline :: String -> DocH mod id
markupMathInline = String -> DocH mod id
forall mod id. String -> DocH mod id
DocMathInline
    , markupMathDisplay :: String -> DocH mod id
markupMathDisplay = String -> DocH mod id
forall mod id. String -> DocH mod id
DocMathDisplay
    , markupProperty :: String -> DocH mod id
markupProperty = String -> DocH mod id
forall mod id. String -> DocH mod id
DocProperty
    , markupExample :: [Example] -> DocH mod id
markupExample = [Example] -> DocH mod id
forall mod id. [Example] -> DocH mod id
DocExamples
    , markupHeader :: Header (DocH mod id) -> DocH mod id
markupHeader = Header (DocH mod id) -> DocH mod id
forall mod id. Header (DocH mod id) -> DocH mod id
DocHeader
    , markupTable :: Table (DocH mod id) -> DocH mod id
markupTable = Table (DocH mod id) -> DocH mod id
forall mod id. Table (DocH mod id) -> DocH mod id
DocTable
    }

-- | Map a 'DocH' into a best estimate of an alternate string. The idea is to
-- strip away any formatting while preserving as much of the actual text as
-- possible.
plainMarkup :: (mod -> String) -> (id -> String) -> DocMarkupH mod id String
plainMarkup :: forall mod id.
(mod -> String) -> (id -> String) -> DocMarkupH mod id String
plainMarkup mod -> String
plainMod id -> String
plainIdent =
  Markup
    { markupEmpty :: String
markupEmpty = String
""
    , markupString :: String -> String
markupString = String -> String
forall a. a -> a
id
    , markupParagraph :: String -> String
markupParagraph = String -> String
forall a. a -> a
id
    , markupAppend :: String -> String -> String
markupAppend = String -> String -> String
forall a. [a] -> [a] -> [a]
(++)
    , markupIdentifier :: id -> String
markupIdentifier = id -> String
plainIdent
    , markupIdentifierUnchecked :: mod -> String
markupIdentifierUnchecked = mod -> String
plainMod
    , markupModule :: ModLink String -> String
markupModule = \(ModLink String
m Maybe String
lbl) -> String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
m Maybe String
lbl
    , markupWarning :: String -> String
markupWarning = String -> String
forall a. a -> a
id
    , markupEmphasis :: String -> String
markupEmphasis = String -> String
forall a. a -> a
id
    , markupBold :: String -> String
markupBold = String -> String
forall a. a -> a
id
    , markupMonospaced :: String -> String
markupMonospaced = String -> String
forall a. a -> a
id
    , markupUnorderedList :: [String] -> String
markupUnorderedList = String -> [String] -> String
forall a b. a -> b -> a
const String
""
    , markupOrderedList :: [(Int, String)] -> String
markupOrderedList = String -> [(Int, String)] -> String
forall a b. a -> b -> a
const String
""
    , markupDefList :: [(String, String)] -> String
markupDefList = String -> [(String, String)] -> String
forall a b. a -> b -> a
const String
""
    , markupCodeBlock :: String -> String
markupCodeBlock = String -> String
forall a. a -> a
id
    , markupHyperlink :: Hyperlink String -> String
markupHyperlink = \(Hyperlink String
url Maybe String
lbl) -> String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
url Maybe String
lbl
    , markupAName :: String -> String
markupAName = String -> String
forall a. a -> a
id
    , markupPic :: Picture -> String
markupPic = \(Picture String
uri Maybe String
title) -> String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
uri Maybe String
title
    , markupMathInline :: String -> String
markupMathInline = String -> String
forall a. a -> a
id
    , markupMathDisplay :: String -> String
markupMathDisplay = String -> String
forall a. a -> a
id
    , markupProperty :: String -> String
markupProperty = String -> String
forall a. a -> a
id
    , markupExample :: [Example] -> String
markupExample = String -> [Example] -> String
forall a b. a -> b -> a
const String
""
    , markupHeader :: Header String -> String
markupHeader = \(Header Int
_ String
title) -> String
title
    , markupTable :: Table String -> String
markupTable = String -> Table String -> String
forall a b. a -> b -> a
const String
""
    }