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 }