source: code/trunk/zs_util.go@ 30

Last change on this file since 30 was 25, checked in by zaitsev.serge, 10 years ago

fixed output file names in html pages, fixed amber function bindings, replaced print command with build, fixed plugin functions, implemented zs and exec functions

File size: 2.2 KB
Line 
1package main
2
3import (
4 "bytes"
5 "io"
6 "log"
7 "os"
8 "os/exec"
9 "path/filepath"
10 "strings"
11)
12
13func varFunc(s string) func() string {
14 return func() string {
15 return s
16 }
17}
18
19func pluginFunc(cmd string, vars Vars) func(args ...string) string {
20 return func(args ...string) string {
21 out := bytes.NewBuffer(nil)
22 if err := run(filepath.Join(ZSDIR, cmd), args, vars, out); err != nil {
23 return cmd + ":" + err.Error()
24 } else {
25 return string(out.Bytes())
26 }
27 }
28}
29
30func builtins() Funcs {
31 exec := func(cmd string, args ...string) string {
32 out := bytes.NewBuffer(nil)
33 if err := run(cmd, args, Vars{}, out); err != nil {
34 return cmd + ":" + err.Error()
35 } else {
36 return string(out.Bytes())
37 }
38 return ""
39 }
40 return Funcs{
41 "exec": exec,
42 "zs": func(args ...string) string {
43 return exec(os.Args[0], args...)
44 },
45 }
46}
47
48func renameExt(path, from, to string) string {
49 if from == "" {
50 from = filepath.Ext(path)
51 }
52 if strings.HasSuffix(path, from) {
53 return strings.TrimSuffix(path, from) + to
54 } else {
55 return path
56 }
57}
58
59func globals() Vars {
60 vars := Vars{}
61 for _, e := range os.Environ() {
62 pair := strings.Split(e, "=")
63 if strings.HasPrefix(pair[0], "ZS_") {
64 vars[strings.ToLower(pair[0][3:])] = pair[1]
65 }
66 }
67 return vars
68}
69
70// Converts zs markdown variables into environment variables
71func env(vars Vars) []string {
72 env := []string{"ZS=" + os.Args[0], "ZS_OUTDIR=" + PUBDIR}
73 env = append(env, os.Environ()...)
74 if vars != nil {
75 for k, v := range vars {
76 env = append(env, "ZS_"+strings.ToUpper(k)+"="+v)
77 }
78 }
79 return env
80}
81
82// Runs command with given arguments and variables, intercepts stderr and
83// redirects stdout into the given writer
84func run(cmd string, args []string, vars Vars, output io.Writer) error {
85 var errbuf bytes.Buffer
86 c := exec.Command(cmd, args...)
87 c.Env = env(vars)
88 c.Stdout = output
89 c.Stderr = &errbuf
90
91 err := c.Run()
92
93 if errbuf.Len() > 0 {
94 log.Println("ERROR:", errbuf.String())
95 }
96
97 if err != nil {
98 return err
99 }
100 return nil
101}
102
103// Splits a string in exactly two parts by delimiter
104// If no delimiter is found - the second string is be empty
105func split2(s, delim string) (string, string) {
106 parts := strings.SplitN(s, delim, 2)
107 if len(parts) == 2 {
108 return parts[0], parts[1]
109 } else {
110 return parts[0], ""
111 }
112}
Note: See TracBrowser for help on using the repository browser.