module AST where

data AST = AST [Block] (Maybe FootnoteDefs)
    deriving (Show)

data FootnoteDefs = FootnoteDefs [FootnoteDef]
    deriving (Show)

data FootnoteDef = FootnoteDef {
    index :: Int,
    content :: [Block]
}
    deriving (Show)

data ListItem = ListItem [Inline]
              | SubList List
    deriving (Show)

data List = List Bool [ListItem]
    deriving (Show)

data TableCell = TableHeaderCell [Inline]
               | TableBodyCell [Inline]
    deriving (Show)

data TableRow = TableRow [TableCell]
    deriving (Show)

data Block = HardRule
           | Paragraph [Inline]
           | Header Int [Inline]
           | ListBlock List
           | BlockQuote [Inline]
           | BlockCode {
    codeClass :: String,
    codeContent :: String
}
           | BlockHtml Html
           | Table {
    thead :: Maybe [TableRow],
    body :: [TableRow]
}
    deriving (Show)

data Inline = Italics [Inline]
            | Bold [Inline]
            | Code String
            | FootnoteRef Int
            | Plaintext String
            | InlineHtml Html
            | Link {
    text :: [Inline],
    href :: String
}
            | Image {
    alt :: String,
    src :: String
}
    deriving (Show)

data HtmlTagType = Open | Close | SelfClosing
    deriving (Show, Eq)

data HtmlTag = HtmlTag {
    tagname :: String,
    attrs :: [Attr]
}
    deriving (Show)

data Attr = Attr String String
    deriving (Show)

data Html = PairTag HtmlTag [Either String Html]
          | SingleTag HtmlTag
    deriving (Show)