///|
fn escape_html(text : String) -> String {
  let out = StringBuilder::new()
  for ch in text {
    match ch {
      '&' => out.write_string("&")
      '<' => out.write_string("<")
      '>' => out.write_string(">")
      '"' => out.write_string(""")
      '\'' => out.write_string("'")
      _ => out.write_char(ch)
    }
  }
  out.to_string()
}

///|
fn slugify(text : String) -> String {
  let out = StringBuilder::new()
  for ch in text {
    if (ch >= 'A' && ch <= 'Z') ||
      (ch >= 'a' && ch <= 'z') ||
      (ch >= '0' && ch <= '9') {
      out.write_char(ch)
    } else if ch == ' ' || ch == '-' || ch == '_' {
      out.write_char('-')
    }
  }
  out.to_string()
}

///|
fn join_lines(lines : Array[String]) -> String {
  lines.join("\n")
}

///|
fn md_list(items : Array[String]) -> String {
  items.map(fn(item) { "- \{item}" }).join("\n")
}

///|
fn html_list(items : Array[String]) -> String {
  items.map(fn(item) { "
  • \{escape_html(item)}
  • " }).join("") }