cheapskate-0.1: Cheapskate/Types.hs
{-# LANGUAGE DeriveDataTypeable #-}
module Cheapskate.Types where
import Data.Sequence (Seq)
import Data.Default
import Data.Text (Text)
import qualified Data.Map as M
import Data.Data
-- | 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
}