diff --git a/app/HTML.hs b/app/HTML.hs index 1a92e64..e8e7df6 100644 --- a/app/HTML.hs +++ b/app/HTML.hs @@ -2,8 +2,43 @@ module HTML (compileToHTML) where -import Data.Text +import Data.Maybe (fromMaybe) +import qualified Data.Text as T import IR -compileToHTML :: Document -> Text -compileToHTML = 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 (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] diff --git a/app/IR.hs b/app/IR.hs index 766ee89..b4363a5 100644 --- a/app/IR.hs +++ b/app/IR.hs @@ -39,8 +39,6 @@ data List = L items :: [ListItem] } --- Table: keep as-is or simplify based on your needs - data HTML = HTMLTag { tagName :: Text, @@ -48,8 +46,6 @@ data HTML html_content :: Text } --- Optionally skip: HTMLComment, HTMLDeclaration - newtype Paragraph = P [InlineText] data InlineText @@ -63,7 +59,7 @@ data InlineText title :: Maybe Text } | Image - { altText :: [InlineText], + { altText :: Text, url :: Text, title :: Maybe Text }