{-# LANGUAGE OverloadedStrings #-}
module HTML (compileToHTML) where
import Data.Char (isAlphaNum, toLower)
import Data.Maybe (fromMaybe)
import qualified Data.Text as T
import IR
escapeChar :: Char -> T.Text
escapeChar '<' = "<"
escapeChar '>' = ">"
escapeChar '"' = """
escapeChar '\'' = "'"
escapeChar '&' = "&"
escapeChar c = T.singleton c
-- not effiecient, main optimization would be to have unpack go to
-- some haskell vector or array impl rather than the list impl
escapeText :: T.Text -> T.Text
escapeText = T.concat . map escapeChar . T.unpack
genHeaderId :: Heading -> T.Text
genHeaderId header =
T.concat
[ " id=\"",
T.map (toLower . textSub) $
T.strip $
T.filter (\c -> isAlphaNum c || c == ' ') $
serializeInlineToHTML header.text,
"\" "
]
where
textSub ' ' = '-'
textSub c = c
genHeaderClasses :: Heading -> T.Text
genHeaderClasses = const ""
tshow :: (Show s) => s -> T.Text
tshow = T.pack . show
compileToHTML :: Document -> T.Text
compileToHTML (Doc elements) = T.concat $ map elementToHTML elements
elementToHTML :: Element -> T.Text
elementToHTML (Heading header) = T.concat ["
", escapeText code_block.code, "", ""]
where
language = fromMaybe "" code_block.language
elementToHTML (BlockQuote (Q elems)) = T.concat ["", serializeInlineToHTML elems, ""] elementToHTML (List (L {list_type = Ordered, items})) = T.concat ["
", serializeInlineToHTML snippets, "
"] elementToHTML HorizontalRule = "", escapeText code, "", serializeInlineToHTML remaining]
serializeInlineToHTML (Link {linkText, url, title} : remaining) = T.concat [" T.concat ["title=\"", escapeText t, "\""]) title, ">", serializeInlineToHTML linkText, "", serializeInlineToHTML remaining]
serializeInlineToHTML (Image {altText, url, title} : remaining) = T.concat ["