// Markdown to HTML Converter - Stress tests string manipulation and parsing
//
// This demonstrates:
// - String parsing and manipulation
// - ADTs for document structure
// - Recursive processing
// - Pattern matching on strings
// Markdown AST
type MarkdownNode =
| MHeading(Int, String)
| MParagraph(String)
| MList(Bool, List)
| MHorizontalRule
// Parse a line to determine block type
fn parseBlockType(line: String): MarkdownNode =
if String.startsWith(line, "# ") then
MHeading(1, String.substring(line, 2, String.length(line)))
else if String.startsWith(line, "## ") then
MHeading(2, String.substring(line, 3, String.length(line)))
else if String.startsWith(line, "### ") then
MHeading(3, String.substring(line, 4, String.length(line)))
else if String.startsWith(line, "---") then
MHorizontalRule
else if String.startsWith(line, "- ") then
MList(false, [String.substring(line, 2, String.length(line))])
else
MParagraph(line)
// Convert to HTML
fn nodeToHtml(node: MarkdownNode): String =
match node {
MHeading(level, text) => "" + text + "",
MParagraph(text) => if text == "" then "" else "" + text + "
",
MList(ordered, items) => {
let tag = if ordered then "ol" else "ul"
let itemsHtml = List.map(items, fn(item: String): String => "" + item + "")
"<" + tag + ">" + String.join(itemsHtml, "") + "" + tag + ">"
},
MHorizontalRule => "
"
}
// Convert markdown string to HTML
fn convert(markdown: String): String = {
let lines = String.lines(markdown)
let nodes = List.map(lines, parseBlockType)
let htmlLines = List.filter(List.map(nodes, nodeToHtml), fn(s: String): Bool => s != "")
String.join(htmlLines, "\n")
}
// Test the converter
fn main(): Unit with {Console} = {
Console.print("========================================")
Console.print(" MARKDOWN TO HTML CONVERTER")
Console.print("========================================")
Console.print("")
Console.print("Test 1: Headings")
Console.print(convert("# Heading 1"))
Console.print(convert("## Heading 2"))
Console.print(convert("### Heading 3"))
Console.print("")
Console.print("Test 2: Paragraphs")
Console.print(convert("This is a paragraph."))
Console.print(convert("Another paragraph here."))
Console.print("")
Console.print("Test 3: Lists")
Console.print(convert("- Item 1"))
Console.print(convert("- Item 2"))
Console.print("")
Console.print("Test 4: Horizontal rule")
Console.print(convert("---"))
}
let output = run main() with {}