package main import ( "bytes" "regexp" "strings" "text/template" ) var ( doc = template.Must(template.ParseFiles("tmpl/doc")) intlink = regexp.MustCompile(`\[[^\]]+\]`) extlink = regexp.MustCompile(`(https?|ftp)://\S+`) imglink = regexp.MustCompile(`\.(jpe?g|png|gif)$`) ) func lines(in string) (ret []string) { for _, l := range strings.Split(in, "\r\n") { if len(l) > 1 { ret = append(ret, l[1:]) } } return } func (p Page) HTML() string { buf := new(bytes.Buffer) for _, v := range strings.Split(string(p.Body), "\r\n\r\n") { if len(v) < 1 { continue } v = intlink.ReplaceAllStringFunc(v, func(s string) string { tmp := new(bytes.Buffer) doc.ExecuteTemplate(tmp, "link", s[1:len(s)-1]) return tmp.String() }) v = extlink.ReplaceAllStringFunc(v, func(s string) string { tmp := new(bytes.Buffer) if imglink.MatchString(s) { doc.ExecuteTemplate(tmp, "img", s) } else { doc.ExecuteTemplate(tmp, "link", s) } return tmp.String() }) switch v[0] { case ' ': doc.ExecuteTemplate(buf, "pre", v) case '-', '*': doc.ExecuteTemplate(buf, "list", lines(v)) case '#': doc.ExecuteTemplate(buf, "olist", lines(v)) case '=': doc.ExecuteTemplate(buf, "heading", v[1:]) default: doc.ExecuteTemplate(buf, "par", v) } } return buf.String() }