{-# 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
tshow :: (Show s) => s -> T.Text
tshow = T.pack . show
compileToHTML :: Document -> T.Text
compileToHTML (Doc elements) = T.concat $ map elementToHTML elements
elementsToHTML :: [Element] -> T.Text
elementsToHTML = T.concat . map elementToHTML
spaceSep :: [T.Text] -> T.Text
spaceSep = T.intercalate " "
elementToHTML :: Element -> T.Text
elementToHTML (Heading header attrs) = T.concat ["
", escapeText code_block.code, "", ""]
where
language = fromMaybe "" code_block.language
elementToHTML (BlockQuote (Q elems) attrs) = T.concat ["", elementsToHTML elems, ""] elementToHTML (List (L {list_type = Ordered {start_number, style}, items}) attrs) = spaceSep ["
", serializeInlineToHTML snippets, "
"] elementToHTML (Transparent snippets) = serializeInlineToHTML snippets elementToHTML (HorizontalRule attrs) = "", escapeText code, "", serializeInlineToHTML remaining]
serializeInlineToHTML (Link {linkText, url, title, misc_attrs} : remaining) = T.concat [" T.concat [" title=\"", escapeText t, "\""]) title, ">", serializeInlineToHTML linkText, "", serializeInlineToHTML remaining]
serializeInlineToHTML (Image {altText, url, title, misc_attrs} : remaining) = T.concat ["