summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2016-11-15 00:16:06 -0500
committerLuke Shumaker <lukeshu@sbcglobal.net>2016-11-15 00:16:06 -0500
commit5e1e95852821e138caf20c3f8ee23e3941e42bbc (patch)
treea88f3a3d6284e76116df24c54bd6a6ddc2184770 /src
parent711269a7eb2e151512bcaf1afcf45b13540d8f8e (diff)
better progressive enhancement of editor
Diffstat (limited to 'src')
-rw-r--r--src/edit/enhancers.go79
-rw-r--r--src/edit/views.go38
2 files changed, 98 insertions, 19 deletions
diff --git a/src/edit/enhancers.go b/src/edit/enhancers.go
new file mode 100644
index 0000000..b732ab2
--- /dev/null
+++ b/src/edit/enhancers.go
@@ -0,0 +1,79 @@
+package main
+
+import (
+ "io"
+ "io/ioutil"
+ "os"
+ "mime/multipart"
+ "strings"
+ "path"
+
+ "fmt"
+)
+
+type enhancer struct {
+ pattern []string
+ head string
+ tail string
+}
+
+func loadEnhancers(filename string) []enhancer {
+ file, err := os.Open(filename)
+ errcheck(err)
+
+ reader := multipart.NewReader(file, "boundary")
+
+ var s uint8 = 0
+ var e enhancer
+ var ret []enhancer
+ for {
+ part, err := reader.NextPart()
+ if err == io.EOF {
+ return ret
+ }
+ errcheck(err)
+
+ k := part.Header.Get("X-Thing")
+ v, err := ioutil.ReadAll(part)
+ errcheck(err)
+
+ switch k {
+ case "Pattern":
+ patterns := strings.Split(string(v), ";")
+ for i := range patterns {
+ patterns[i] = strings.TrimSpace(patterns[i])
+ }
+ s |= 1<<0
+ e.pattern = patterns
+ case "Head":
+ s |= 1<<1
+ e.head = string(v)
+ case "Tail":
+ s |= 1<<2
+ e.tail = string(v)
+ default:
+ panic("unknown X-Thing: "+k)
+ }
+ if s == 1<<0 | 1<<1 | 1<<2 {
+ ret = append(ret, e)
+ s = 0
+ }
+ }
+}
+
+var enhancers = loadEnhancers("enhancers.txt")
+
+func getEnhancer(ctype string) (head, tail string) {
+ fmt.Fprintf(os.Stderr, "enhancers = %q\n", enhancers)
+ for _, enhancer := range enhancers {
+ for _, pattern := range enhancer.pattern {
+ matched, err := path.Match(pattern, ctype)
+ errcheck(err)
+ fmt.Fprintf(os.Stderr, "Match(%q, %q) => %q\n", pattern, ctype, matched)
+ if matched {
+ return enhancer.head, enhancer.tail
+ }
+ }
+ }
+ return "", ""
+}
diff --git a/src/edit/views.go b/src/edit/views.go
index 1d3176d..a2890d4 100644
--- a/src/edit/views.go
+++ b/src/edit/views.go
@@ -1,6 +1,7 @@
package main
import (
+ "fmt"
"bytes"
"io"
"path"
@@ -24,11 +25,12 @@ var (
tmplDeleted = newTemplate("got/deleted.got")
)
-func renderPage(w io.Writer, title, head, body string) error {
+func renderPage(w io.Writer, title, head, body, tail string) error {
return tmplPage.Execute(w, map[string]string{
"title": title,
"head": head,
"body": body,
+ "tail": tail,
})
}
@@ -47,8 +49,8 @@ func renderViewTree(w io.Writer, upath string, tree GitTree) error {
}
// Component Render
- var buf bytes.Buffer
- err := tmplViewTree.Execute(&buf, map[string]interface{}{
+ var body bytes.Buffer
+ err := tmplViewTree.Execute(&body, map[string]interface{}{
"path": upath,
"files": files,
})
@@ -56,7 +58,7 @@ func renderViewTree(w io.Writer, upath string, tree GitTree) error {
return err
}
// Page render
- return renderPage(w, upath, "", buf.String())
+ return renderPage(w, upath, "", body.String(), "")
}
func renderViewBlob(w io.Writer, upath string, file GitFile) error {
@@ -67,8 +69,8 @@ func renderViewBlob(w io.Writer, upath string, file GitFile) error {
}
ctype := getctype(upath, content)
// Component render
- var buf bytes.Buffer
- err = tmplViewBlob.Execute(&buf, map[string]string{
+ var body bytes.Buffer
+ err = tmplViewBlob.Execute(&body, map[string]string{
"path": upath,
"ctype": ctype,
"content": string(content),
@@ -76,38 +78,36 @@ func renderViewBlob(w io.Writer, upath string, file GitFile) error {
if err != nil {
return err
}
- head := ""
- if ctype == "text/markdown" {
- head += "<link rel=\"stylesheet\" href=\"/static/font-awesome/css/font-awesome.min.css\">\n"
- head += "<link rel=\"stylesheet\" href=\"/static/simplemde/dist/simplemde.min.css\">\n"
- head += "<script src=\"/static/simplemde/dist/simplemde.min.js\"></script>\n"
- }
+
+ head, tail := getEnhancer(ctype)
+ head = fmt.Sprintf("<script>ctype = \"%s\"</script>\n%s", template.JSEscapeString(ctype), head);
+
// Page render
- return renderPage(w, upath, head, buf.String())
+ return renderPage(w, upath, head, body.String(), tail)
}
func renderModified(w io.Writer, upath string) error {
// Component render
- var buf bytes.Buffer
- err := tmplModified.Execute(&buf, map[string]string{
+ var body bytes.Buffer
+ err := tmplModified.Execute(&body, map[string]string{
"path": upath,
})
if err != nil {
return err
}
// Page render
- return renderPage(w, upath, "", buf.String())
+ return renderPage(w, upath, "", body.String(), "")
}
func renderDeleted(w io.Writer, upath string) error {
// Component render
- var buf bytes.Buffer
- err := tmplDeleted.Execute(&buf, map[string]string{
+ var body bytes.Buffer
+ err := tmplDeleted.Execute(&body, map[string]string{
"path": upath,
})
if err != nil {
return err
}
// Page render
- return renderPage(w, upath, "", buf.String())
+ return renderPage(w, upath, "", body.String(), "")
}