aboutsummaryrefslogtreecommitdiff
path: root/parse.go
diff options
context:
space:
mode:
Diffstat (limited to 'parse.go')
-rw-r--r--parse.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/parse.go b/parse.go
new file mode 100644
index 0000000..ccf2a87
--- /dev/null
+++ b/parse.go
@@ -0,0 +1,49 @@
+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 parse(in []byte) string {
+ buf := new(bytes.Buffer)
+ for _, v := range strings.Split(string(in), "\r\n\r\n") {
+ 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 '-':
+ lines := strings.Split(v, "\r\n")
+ for i, l := range lines {
+ lines[i] = l[1:]
+ }
+ doc.ExecuteTemplate(buf, "list", lines)
+ default:
+ doc.ExecuteTemplate(buf, "par", v)
+ }
+ }
+ return buf.String()
+}