///|
fn tex_date_letter(value : Char) -> Bool {
  (value >= 'a' && value <= 'z') || (value >= 'A' && value <= 'Z')
}

///|
// Reproduce dates._wrap_in_tex: ASCII words remain outside mathdefault, while
// signs/colons are braced and spaces become explicit TeX spacing.
fn wrap_date_in_tex(value : String) -> String {
  let result = StringBuilder()
  let chars = value.to_array()
  result.write_string("$\\mathdefault{")
  let mut index = 0
  while index < chars.length() {
    if tex_date_letter(chars[index]) {
      result.write_string("}$")
      while index < chars.length() && tex_date_letter(chars[index]) {
        result.write_char(chars[index])
        index += 1
      }
      result.write_string("$\\mathdefault{")
    } else {
      match chars[index] {
        '-' => result.write_string("{-}")
        ':' => result.write_string("{:}")
        ' ' => result.write_string("\\;")
        char => result.write_char(char)
      }
      index += 1
    }
  }
  result.write_string("}$")
  result.to_string().replace_all(old="$\\mathdefault{}$", new="")
}