Mercurial > yakumo_izuru > aya
comparison zs.go @ 4:05fc24caac37 draft
render uses strings, not bytes; added helpers for env and run
author | zaitsev.serge |
---|---|
date | Fri, 05 Dec 2014 18:09:03 +0000 |
parents | 53dea9841cd9 |
children | e0ee0721d34f |
comparison
equal
deleted
inserted
replaced
3:53dea9841cd9 | 4:05fc24caac37 |
---|---|
44 } | 44 } |
45 return v, body | 45 return v, body |
46 } | 46 } |
47 | 47 |
48 func render(s string, vars map[string]string, eval EvalFn) (string, error) { | 48 func render(s string, vars map[string]string, eval EvalFn) (string, error) { |
49 b := []byte(s) | 49 delim_open := "{{" |
50 delim_open := []byte("{{") | 50 delim_close := "}}" |
51 delim_close := []byte("}}") | |
52 | 51 |
53 out := bytes.NewBuffer(nil) | 52 out := bytes.NewBuffer(nil) |
54 for { | 53 for { |
55 if from := bytes.Index(b, delim_open); from == -1 { | 54 if from := strings.Index(s, delim_open); from == -1 { |
56 out.Write(b) | 55 out.WriteString(s) |
57 return out.String(), nil | 56 return out.String(), nil |
58 } else { | 57 } else { |
59 to := bytes.Index(b, delim_close) | 58 if to := strings.Index(s, delim_close); to == -1 { |
60 if to == -1 { | |
61 return "", fmt.Errorf("Close delim not found") | 59 return "", fmt.Errorf("Close delim not found") |
62 } else { | 60 } else { |
63 out.Write(b[:from]) | 61 out.WriteString(s[:from]) |
64 cmd := b[from+len(delim_open) : to] | 62 cmd := s[from+len(delim_open) : to] |
65 b = b[to+len(delim_close):] | 63 s = s[to+len(delim_close):] |
66 m := strings.Fields(string(cmd)) | 64 m := strings.Fields(cmd) |
67 if len(m) == 1 { | 65 if len(m) == 1 { |
68 if v, ok := vars[m[0]]; ok { | 66 if v, ok := vars[m[0]]; ok { |
69 out.Write([]byte(v)) | 67 out.WriteString(v) |
70 continue | 68 continue |
71 } | 69 } |
72 } | 70 } |
73 if res, err := eval(m, vars); err == nil { | 71 if res, err := eval(m, vars); err == nil { |
74 out.Write([]byte(res)) | 72 out.WriteString(res) |
75 } else { | 73 } else { |
76 log.Println(err) // silent | 74 log.Println(err) // silent |
77 } | 75 } |
78 } | 76 } |
79 } | 77 } |
80 } | 78 } |
81 } | 79 } |
82 | 80 |
83 func eval(cmd []string, vars map[string]string) (string, error) { | 81 func env(vars map[string]string) []string { |
84 var outbuf, errbuf bytes.Buffer | |
85 c := exec.Command(path.Join(ZSDIR, cmd[0]), cmd[1:]...) | |
86 env := []string{"ZS=" + os.Args[0]} | 82 env := []string{"ZS=" + os.Args[0]} |
83 env = append(env, os.Environ()...) | |
87 for k, v := range vars { | 84 for k, v := range vars { |
88 env = append(env, "ZS_"+strings.ToUpper(k)+"="+v) | 85 env = append(env, "ZS_"+strings.ToUpper(k)+"="+v) |
89 } | 86 } |
90 c.Env = append(c.Env, env...) | 87 return env |
91 c.Stdout = &outbuf | 88 } |
89 | |
90 func run(cmd string, args []string, vars map[string]string, output io.Writer) error { | |
91 var errbuf bytes.Buffer | |
92 c := exec.Command(cmd, args...) | |
93 c.Env = env(vars) | |
94 c.Stdout = output | |
92 c.Stderr = &errbuf | 95 c.Stderr = &errbuf |
93 if err := c.Run(); err != nil { | 96 |
94 log.Println(err) | 97 err := c.Run() |
95 c := exec.Command(path.Join(cmd[0]), cmd[1:]...) | 98 |
96 c.Env = append(c.Env, env...) | |
97 c.Stdout = &outbuf | |
98 c.Stderr = &errbuf | |
99 if err := c.Run(); err != nil { | |
100 return "", err | |
101 } | |
102 } | |
103 if errbuf.Len() > 0 { | 99 if errbuf.Len() > 0 { |
104 log.Println(errbuf.String()) | 100 log.Println(errbuf.String()) |
101 } | |
102 | |
103 if err != nil { | |
104 return err | |
105 } | |
106 return nil | |
107 } | |
108 | |
109 func eval(cmd []string, vars map[string]string) (string, error) { | |
110 outbuf := bytes.NewBuffer(nil) | |
111 err := run(path.Join(ZSDIR, cmd[0]), cmd[1:], vars, outbuf) | |
112 if err != nil { | |
113 log.Println(err) | |
114 outbuf = bytes.NewBuffer(nil) | |
115 err := run(cmd[0], cmd[1:], vars, outbuf) | |
116 if err != nil { | |
117 return "", err | |
118 } | |
105 } | 119 } |
106 return outbuf.String(), nil | 120 return outbuf.String(), nil |
107 } | 121 } |
108 | 122 |
109 func buildMarkdown(path string) error { | 123 func buildMarkdown(path string) error { |
245 } | 259 } |
246 } else { | 260 } else { |
247 log.Println(err) | 261 log.Println(err) |
248 } | 262 } |
249 default: | 263 default: |
250 cmd := exec.Command(path.Join(ZSDIR, cmd), args...) | 264 err := run(path.Join(ZSDIR, cmd), args, map[string]string{}, os.Stdout) |
251 cmd.Env = append(cmd.Env, "ZS="+os.Args[0]) | 265 if err != nil { |
252 cmd.Stdout = os.Stdout | |
253 cmd.Stderr = os.Stderr | |
254 if err := cmd.Run(); err != nil { | |
255 log.Println(err) | 266 log.Println(err) |
256 } | 267 } |
257 } | 268 } |
258 } | 269 } |