cheapskate-0.1.1: Cheapskate/Types.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE StandaloneDeriving #-}
module Cheapskate.Types where
import Data.Sequence (Seq)
import Data.Default
import Data.Text (Text)
import qualified Data.Map as M
import Data.Data
import Control.DeepSeq (NFData(..))
import GHC.Generics (Generic)
-- | Structured representation of a document. The 'Options' affect
-- how the document is rendered by `toHtml`.
data Doc = Doc Options Blocks
deriving (Show, Data, Typeable)
-- | Block-level elements.
data Block = Para Inlines
| Header Int Inlines
| Blockquote Blocks
| List Bool ListType [Blocks]
| CodeBlock CodeAttr Text
| HtmlBlock Text
| HRule
deriving (Show, Data, Typeable)
-- | Attributes for fenced code blocks. 'codeLang' is the
-- first word of the attribute line, 'codeInfo' is the rest.
data CodeAttr = CodeAttr { codeLang :: Text, codeInfo :: Text }
deriving (Show, Data, Typeable)
data ListType = Bullet Char | Numbered NumWrapper Int deriving (Eq,Show,Data,Typeable)
data NumWrapper = PeriodFollowing | ParenFollowing deriving (Eq,Show,Data,Typeable)
-- | Simple representation of HTML tag.
data HtmlTagType = Opening Text | Closing Text | SelfClosing Text deriving (Show, Data, Typeable)
-- We operate with sequences instead of lists, because
-- they allow more efficient appending on to the end.
type Blocks = Seq Block
-- | Inline elements.
data Inline = Str Text
| Space
| SoftBreak
| LineBreak
| Emph Inlines
| Strong Inlines
| Code Text
| Link Inlines Text {- URL -} Text {- title -}
| Image Inlines Text {- URL -} Text {- title -}
| Entity Text
| RawHtml Text
deriving (Show, Data, Typeable)
type Inlines = Seq Inline
type ReferenceMap = M.Map Text (Text, Text)
-- | Rendering and parsing options.
data Options = Options{
sanitize :: Bool -- ^ Sanitize raw HTML, link/image attributes
, allowRawHtml :: Bool -- ^ Allow raw HTML (if false it gets escaped)
, preserveHardBreaks :: Bool -- ^ Preserve hard line breaks in the source
, debug :: Bool -- ^ Print container structure for debugging
}
deriving (Show, Data, Typeable)
instance Default Options where
def = Options{
sanitize = True
, allowRawHtml = True
, preserveHardBreaks = False
, debug = False
}
deriving instance Generic Doc
instance NFData Doc
deriving instance Generic Block
instance NFData Block
deriving instance Generic CodeAttr
instance NFData CodeAttr
deriving instance Generic ListType
instance NFData ListType
deriving instance Generic NumWrapper
instance NFData NumWrapper
deriving instance Generic HtmlTagType
instance NFData HtmlTagType
deriving instance Generic Inline
instance NFData Inline
deriving instance Generic Options
instance NFData Options