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 ["
"]
+ 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 ["", generateLiElems items, "
"]
+elementToHTML (HTML (HTMLTag {tagName, attributes, html_content})) = T.concat ["<", tagName, T.concat $ map (\(name, value) -> T.concat [name, "=", "\"", fromMaybe "" value, "\""]) attributes, ">", html_content, "", tagName, ">"]
+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
}