1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use regex::Regex;

const HEADERS: [&str; 30] = [
  "world",
  "options",
  "waterLevel",
  "dynamicColor",
  "textureMatrix",
  "material",
  "transform",
  "physics",
  "arc",
  "base",
  "box",
  "cone",
  "define",
  "group",
  "link",
  "mesh",
  "meshbox",
  "meshpyr",
  "pyramid",
  "sphere",
  "teleporter",
  "tetra",
  "weapon",
  "zone",
  "face",
  "endface",
  "enddef",
  "drawInfo",
  "lod",
  "end"
];

const KEYWORDS: [&str; 11] = [
  "position",
  "size",
  "shift",
  "rotation",
  "color",
  "name",
  "flagHeight",
  "from",
  "to",
  "noWalls",
  "freeCtfSpawns"
];

fn highlight_span(class: &str) -> String{
  format!("<span class=\"{}\">$1</span>", class)
}

pub fn to_html(text: &str) -> String{
  let symbol = highlight_span("symbol");
  let symbol_str = symbol.as_str();

  let comment = highlight_span("comment");
  let comment_str = comment.as_str();

  let number = highlight_span("number");
  let number_str = number.as_str();

  let header = highlight_span("header");
  let header_str = header.as_str();

  let keyword = highlight_span("keyword");
  let keyword_str = keyword.as_str();

  let mut ret = String::from(text);
  ret = (&Regex::new("<").unwrap().replace_all(ret.as_str(), "&lt;")).to_string();
  ret = (&Regex::new(">").unwrap().replace_all(ret.as_str(), "&gt;")).to_string();
  ret = (&Regex::new("([-.*/\"=]+?)").unwrap().replace_all(ret.as_str(), symbol_str)).to_string();
  ret = (&Regex::new("(#.*?)($|\n)").unwrap().replace_all(ret.as_str(), format!("{}{}", comment_str, "$2").as_str())).to_string();
  ret = (&Regex::new("([0-9]+)").unwrap().replace_all(ret.as_str(), number_str)).to_string();
  ret = (&Regex::new(format!("({})", HEADERS.join("|")).as_str()).unwrap().replace_all(ret.as_str(), header_str)).to_string();
  ret = (&Regex::new(format!("({})", KEYWORDS.join("|")).as_str()).unwrap().replace_all(ret.as_str(), keyword_str)).to_string();

  ret
}