{-# 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 ["
"]
  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 {tagName, attributes, html_content})) = T.concat ["<", tagName, T.concat $ map (\(name, value) -> T.concat [name, "=", "\"", fromMaybe "" value, "\""]) attributes, ">", html_content, ""] elementToHTML (Paragraph (P snippets)) = 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, "
  • " ] serializeInlineToHTML :: [InlineText] -> T.Text serializeInlineToHTML [] = "" serializeInlineToHTML (Text t : rem) = t <> serializeInlineToHTML rem serializeInlineToHTML (Bold elems : rem) = T.concat ["", serializeInlineToHTML elems, "", serializeInlineToHTML rem] serializeInlineToHTML (Italic elems : rem) = T.concat ["", serializeInlineToHTML elems, "", serializeInlineToHTML rem]