{-# LANGUAGE OverloadedStrings #-} module HTML (compileToHTML) where import Data.Maybe (fromMaybe) import qualified Data.Text as T import IR 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 (H {level, text})) = T.concat ["", serializeInlineToHTML text, ""] -- elementToHTML (Code (C {language = m_language, code})) = T.concat ["
", code, ""]
  where
    language = fromMaybe "" m_language
elementToHTML (BlockQuote (Q elems)) = T.concat ["
", serializeInlineToHTML elems, "
"] elementToHTML (List (L {list_type = Ordered, items})) = T.concat ["
    ", generateLiElems items, "
"] elementToHTML (List (L {list_type = Unordered, items})) = T.concat [""] elementToHTML (HTML (HTMLTag {html_content})) = html_content elementToHTML (Paragraph (P snippets)) = T.concat ["

", serializeInlineToHTML snippets, "

"] elementToHTML HorizontalRule = "
" generateLiElems :: [ListItem] -> T.Text generateLiElems [] = "" generateLiElems (LI {content, children} : remainder) = T.concat [ "
  • ", -- We assume child lists are stricly after our contents -- if they aren't this is fucked serializeInlineToHTML content, T.concat $ map (elementToHTML . List) children, "
  • ", generateLiElems remainder ] serializeInlineToHTML :: [InlineText] -> T.Text serializeInlineToHTML [] = "" serializeInlineToHTML (Text t : remaining) = t <> serializeInlineToHTML remaining serializeInlineToHTML (Bold elems : remaining) = T.concat ["", serializeInlineToHTML elems, "", serializeInlineToHTML remaining] serializeInlineToHTML (Italic elems : remaining) = T.concat ["", serializeInlineToHTML elems, "", serializeInlineToHTML remaining] serializeInlineToHTML (InlineCode code : remaining) = T.concat ["", code, "", serializeInlineToHTML remaining] serializeInlineToHTML (Link {linkText, url, title} : remaining) = T.concat [" T.concat ["title=\"", t, "\""]) title, "\">", serializeInlineToHTML linkText, "", serializeInlineToHTML remaining] serializeInlineToHTML (Image {altText, url, title} : remaining) = T.concat ["", url, "\" alt=\"", altText, "\"", maybe "" (\t -> T.concat ["title=\"", t, "\""]) title, ">", serializeInlineToHTML remaining] serializeInlineToHTML (HTMLInline {inline_html_content} : remaining) = inline_html_content <> serializeInlineToHTML remaining