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
extern crate regex; extern crate iron; use self::iron::status; use self::iron::prelude::*; use self::regex::Regex; use std::collections::HashMap; use std::fs::File; use std::io::prelude::*; use std::io::{BufReader}; use std::path::Path; use util::*; pub struct Template<'a>{ name: &'a str, data: HashMap<&'a str, &'a str>, } pub struct TemplateBuilder<'a> { name: &'a str, data: HashMap<&'a str, &'a str>, } impl<'a> TemplateBuilder<'a> { pub fn new(name: &'a str) -> TemplateBuilder<'a> { let s = "**default"; let mut d = HashMap::new(); d.insert(s, s); TemplateBuilder{name: name, data: d} } pub fn data(&mut self, data: HashMap<&'a str, &'a str>) -> &mut TemplateBuilder<'a> { self.data = data; self } pub fn build(&self) -> Template<'a> { Template{name: &self.name, data: self.data.clone()} } } impl<'a> Template<'a> { pub fn new(name: &'a str, data: HashMap<&'a str, &'a str>) -> Template<'a> { Template {name: name, data: data} } pub fn render(&self) -> String{ let s = &self.name; let path = Path::new(&s); let mut html = String::new(); match File::open(path) { Ok(file) => { html = Template::reg(&self, BufReader::new(file)); }, Err(_) => {println!("can't find {}", self.name)}, } html } fn reg<R: Read>(&self, br: BufReader<R>) -> String{ let re = Regex::new(r"<%=\s*(.+?)\s*%>").unwrap(); let mut result = String::new(); 'outer: for xs in br.lines() { let s = xs.unwrap() + "\n"; let mut line = StrReplace::new(&s); for cap in re.captures_iter(&s) { match self.data.get(&cap[1]) { Some(d) => {line.replace(&cap[0], d);}, _ => {}, } } result += line.to_str(); } result } pub fn html(&self) -> IronResult<Response>{ let body = self.render(); Ok(Response::with((status::Ok, mime!(Text/Html; Charset=Utf8), body))) } }