comparison zs_util.go @ 23:40f55059fbfa draft

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