///|
pub fn escape_html(input : String) -> String {
  input
  .replace_all(old="&", new="&")
  .replace_all(old="<", new="<")
  .replace_all(old=">", new=">")
  .replace_all(old="\"", new=""")
}

///|
pub fn render_inline(input : String) -> String {
  render_links(render_inline_code(input))
}

///|
fn render_inline_code(input : String) -> String {
  match input.find("`") {
    Some(start) => {
      let rest = input[start + 1:]
      match rest.find("`") {
        Some(end_rel) => {
          let end = start + 1 + end_rel
          escape_html(input[:start].to_owned()) +
          "" +
          escape_html(input[start + 1:end].to_owned()) +
          "" +
          render_inline_code(input[end + 1:].to_owned())
        }
        None => escape_html(input)
      }
    }
    None => escape_html(input)
  }
}

///|
fn render_links(input : String) -> String {
  match input.find("[") {
    Some(start) => {
      let tail = input[start + 1:]
      match tail.find("](") {
        Some(close_rel) => {
          let close = start + 1 + close_rel
          let url_tail = input[close + 2:]
          match url_tail.find(")") {
            Some(end_rel) => {
              let end = close + 2 + end_rel
              input[:start].to_owned() +
              "" +
              input[start + 1:close].to_owned() +
              "" +
              render_links(input[end + 1:].to_owned())
            }
            None => input
          }
        }
        None => input
      }
    }
    None => input
  }
}

///|
pub fn render_markdown(input : String) -> String {
  let mut html = ""
  let lines = input.split("\n")
  let mut in_paragraph = false
  let mut in_code = false
  let mut in_list = false
  for line in lines {
    let text = line.trim().to_owned()
    if text.has_prefix("```") {
      if in_paragraph {
        html = html + "

\n" in_paragraph = false } if in_list { html = html + "\n" in_list = false } if in_code { html = html + "
\n" in_code = false } else { html = html + "
"
        in_code = true
      }
    } else if in_code {
      html = html + escape_html(line.to_owned()) + "\n"
    } else if text == "" {
      if in_paragraph {
        html = html + "

\n" in_paragraph = false } if in_list { html = html + "\n" in_list = false } } else if text.has_prefix("# ") { if in_paragraph { html = html + "

\n" in_paragraph = false } if in_list { html = html + "\n" in_list = false } html = html + "

" + render_inline(text[2:].to_owned()) + "

\n" } else if text.has_prefix("## ") { if in_paragraph { html = html + "

\n" in_paragraph = false } if in_list { html = html + "\n" in_list = false } html = html + "

" + render_inline(text[3:].to_owned()) + "

\n" } else if text.has_prefix("### ") { if in_paragraph { html = html + "

\n" in_paragraph = false } if in_list { html = html + "\n" in_list = false } html = html + "

" + render_inline(text[4:].to_owned()) + "

\n" } else if text.has_prefix("- ") { if in_paragraph { html = html + "

\n" in_paragraph = false } if !in_list { html = html + "\n" in_list = false } if !in_paragraph { html = html + "

" in_paragraph = true } else { html = html + " " } html = html + render_inline(text) } } if in_paragraph { html = html + "

\n" } if in_code { html = html + "
\n" } if in_list { html = html + "\n" } html }