annotate zs.go @ 21:d577cff808bc draft

added simple blog-like structure with amber, gcss, markdown
author zaitsev.serge
date Sat, 29 Aug 2015 21:44:20 +0000
parents f8373c23a3ff
children f5627d4212a3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
1 package main
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
2
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
3 import (
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
4 "bytes"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
5 "fmt"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
6 "io"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
7 "io/ioutil"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
8 "log"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
9 "os"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
10 "os/exec"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
11 "path"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
12 "path/filepath"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
13 "strings"
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
14 "text/template"
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
15 "time"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
16
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
17 "github.com/russross/blackfriday"
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
18 "github.com/yosssi/gcss"
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
19 "github.com/zserge/amber"
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
20 )
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
21
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
22 const (
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
23 ZSDIR = ".zs"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
24 PUBDIR = ".pub"
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
25 )
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
26
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
27 type Vars map[string]string
3
53dea9841cd9 moved eval func type to the top, added some error logs
zaitsev.serge
parents: 2
diff changeset
28
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
29 // Splits a string in exactly two parts by delimiter
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
30 // If no delimiter is found - the second string is be empty
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
31 func split2(s, delim string) (string, string) {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
32 parts := strings.SplitN(s, delim, 2)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
33 if len(parts) == 2 {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
34 return parts[0], parts[1]
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
35 } else {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
36 return parts[0], ""
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
37 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
38 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
39
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
40 // Parses markdown content. Returns parsed header variables and content
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
41 func md(path string, globals Vars) (Vars, string, error) {
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
42 b, err := ioutil.ReadFile(path)
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
43 if err != nil {
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
44 return nil, "", err
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
45 }
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
46 s := string(b)
6
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
47 url := path[:len(path)-len(filepath.Ext(path))] + ".html"
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
48 v := Vars{
6
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
49 "file": path,
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
50 "url": url,
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
51 "output": filepath.Join(PUBDIR, url),
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
52 }
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
53 if _, err := os.Stat(filepath.Join(ZSDIR, "layout.amber")); err == nil {
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
54 v["layout"] = "layout.amber"
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
55 } else {
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
56 v["layout"] = "layout.html"
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
57 }
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
58
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
59 if info, err := os.Stat(path); err == nil {
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
60 v["date"] = info.ModTime().Format("02-01-2006")
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
61 }
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
62 for name, value := range globals {
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
63 v[name] = value
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
64 }
2
fd79b3a90bef fixed empty header in markdown
zaitsev.serge
parents: 0
diff changeset
65 if strings.Index(s, "\n\n") == -1 {
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
66 return v, s, nil
2
fd79b3a90bef fixed empty header in markdown
zaitsev.serge
parents: 0
diff changeset
67 }
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
68 header, body := split2(s, "\n\n")
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
69 for _, line := range strings.Split(header, "\n") {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
70 key, value := split2(line, ":")
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
71 v[strings.ToLower(strings.TrimSpace(key))] = strings.TrimSpace(value)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
72 }
6
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
73 if strings.HasPrefix(v["url"], "./") {
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
74 v["url"] = v["url"][2:]
cb66f5b86616 rewritted default variables assignment
zaitsev.serge
parents: 5
diff changeset
75 }
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
76 return v, body, nil
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
77 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
78
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
79 // Use standard Go templates
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
80 func render(s string, funcs template.FuncMap, vars Vars) (string, error) {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
81 f := template.FuncMap{}
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
82 for k, v := range funcs {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
83 f[k] = v
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
84 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
85 for k, v := range vars {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
86 f[k] = varFunc(v)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
87 }
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
88 tmpl, err := template.New("").Funcs(f).Parse(s)
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
89 if err != nil {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
90 return "", err
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
91 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
92 out := &bytes.Buffer{}
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
93 if err := tmpl.Execute(out, vars); err != nil {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
94 return "", err
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
95 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
96 return string(out.Bytes()), nil
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
97 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
98
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
99 // Converts zs markdown variables into environment variables
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
100 func env(vars Vars) []string {
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
101 env := []string{"ZS=" + os.Args[0], "ZS_OUTDIR=" + PUBDIR}
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
102 env = append(env, os.Environ()...)
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
103 if vars != nil {
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
104 for k, v := range vars {
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
105 env = append(env, "ZS_"+strings.ToUpper(k)+"="+v)
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
106 }
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
107 }
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
108 return env
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
109 }
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
110
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
111 // Runs command with given arguments and variables, intercepts stderr and
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
112 // redirects stdout into the given writer
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
113 func run(cmd string, args []string, vars Vars, output io.Writer) error {
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
114 var errbuf bytes.Buffer
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
115 c := exec.Command(cmd, args...)
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
116 c.Env = env(vars)
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
117 c.Stdout = output
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
118 c.Stderr = &errbuf
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
119
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
120 err := c.Run()
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
121
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
122 if errbuf.Len() > 0 {
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
123 log.Println("ERROR:", errbuf.String())
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
124 }
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
125
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
126 if err != nil {
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
127 return err
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
128 }
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
129 return nil
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
130 }
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
131
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
132 // Expands macro: either replacing it with the variable value, or
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
133 // running the plugin command and replacing it with the command's output
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
134 func eval(cmd []string, vars Vars) (string, error) {
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
135 outbuf := bytes.NewBuffer(nil)
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
136 err := run(path.Join(ZSDIR, cmd[0]), cmd[1:], vars, outbuf)
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
137 if err != nil {
5
e0ee0721d34f added tests for eval command runner
zaitsev.serge
parents: 4
diff changeset
138 if _, ok := err.(*exec.ExitError); ok {
e0ee0721d34f added tests for eval command runner
zaitsev.serge
parents: 4
diff changeset
139 return "", err
e0ee0721d34f added tests for eval command runner
zaitsev.serge
parents: 4
diff changeset
140 }
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
141 outbuf = bytes.NewBuffer(nil)
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
142 err := run(cmd[0], cmd[1:], vars, outbuf)
5
e0ee0721d34f added tests for eval command runner
zaitsev.serge
parents: 4
diff changeset
143 // Return exit errors, but ignore if the command was not found
e0ee0721d34f added tests for eval command runner
zaitsev.serge
parents: 4
diff changeset
144 if _, ok := err.(*exec.ExitError); ok {
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
145 return "", err
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
146 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
147 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
148 return outbuf.String(), nil
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
149 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
150
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
151 // Renders markdown with the given layout into html expanding all the macros
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
152 func buildMarkdown(path string, funcs template.FuncMap, vars Vars) error {
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
153 v, body, err := md(path, vars)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
154 if err != nil {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
155 return err
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
156 }
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
157 content, err := render(body, funcs, v)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
158 if err != nil {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
159 return err
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
160 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
161 v["content"] = string(blackfriday.MarkdownBasic([]byte(content)))
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
162 if strings.HasSuffix(v["layout"], ".amber") {
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
163 return buildAmber(filepath.Join(ZSDIR, v["layout"]),
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
164 renameExt(path, "", ".html"), funcs, v)
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
165 } else {
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
166 return buildPlain(filepath.Join(ZSDIR, v["layout"]),
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
167 renameExt(path, "", ".html"), funcs, v)
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
168 }
14
515078352442 moved html rendering into a separate function
zaitsev.serge
parents: 13
diff changeset
169 }
515078352442 moved html rendering into a separate function
zaitsev.serge
parents: 13
diff changeset
170
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
171 // Renders text file expanding all variable macros inside it
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
172 func buildPlain(in, out string, funcs template.FuncMap, vars Vars) error {
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
173 b, err := ioutil.ReadFile(in)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
174 if err != nil {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
175 return err
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
176 }
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
177 content, err := render(string(b), funcs, vars)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
178 if err != nil {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
179 return err
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
180 }
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
181 output := filepath.Join(PUBDIR, out)
14
515078352442 moved html rendering into a separate function
zaitsev.serge
parents: 13
diff changeset
182 if s, ok := vars["output"]; ok {
515078352442 moved html rendering into a separate function
zaitsev.serge
parents: 13
diff changeset
183 output = s
515078352442 moved html rendering into a separate function
zaitsev.serge
parents: 13
diff changeset
184 }
515078352442 moved html rendering into a separate function
zaitsev.serge
parents: 13
diff changeset
185 err = ioutil.WriteFile(output, []byte(content), 0666)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
186 if err != nil {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
187 return err
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
188 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
189 return nil
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
190 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
191
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
192 // Renders .amber file into .html
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
193 func buildAmber(in, out string, funcs template.FuncMap, vars Vars) error {
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
194 a := amber.New()
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
195 err := a.ParseFile(in)
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
196 if err != nil {
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
197 return err
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
198 }
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
199 t, err := a.Compile()
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
200 if err != nil {
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
201 return err
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
202 }
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
203 //amber.FuncMap = amber.FuncMap
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
204 f, err := os.Create(filepath.Join(PUBDIR, out))
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
205 if err != nil {
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
206 return err
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
207 }
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
208 defer f.Close()
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
209 return t.Execute(f, vars)
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
210 }
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
211
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
212 // Compiles .gcss into .css
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
213 func buildGCSS(path string) error {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
214 f, err := os.Open(path)
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
215 if err != nil {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
216 return err
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
217 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
218 s := strings.TrimSuffix(path, ".gcss") + ".css"
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
219 css, err := os.Create(filepath.Join(PUBDIR, s))
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
220 if err != nil {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
221 return err
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
222 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
223
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
224 defer f.Close()
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
225 defer css.Close()
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
226
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
227 _, err = gcss.Compile(css, f)
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
228 return err
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
229 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
230
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
231 // Copies file from working directory into public directory
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
232 func copyFile(path string) (err error) {
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
233 var in, out *os.File
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
234 if in, err = os.Open(path); err == nil {
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
235 defer in.Close()
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
236 if out, err = os.Create(filepath.Join(PUBDIR, path)); err == nil {
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
237 defer out.Close()
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
238 _, err = io.Copy(out, in)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
239 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
240 }
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
241 return err
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
242 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
243
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
244 func varFunc(s string) func() string {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
245 return func() string {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
246 return s
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
247 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
248 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
249
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
250 func pluginFunc(cmd string) func() string {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
251 return func() string {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
252 return "Not implemented yet"
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
253 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
254 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
255
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
256 func createFuncs() template.FuncMap {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
257 // Builtin functions
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
258 funcs := template.FuncMap{
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
259 "exec": func(s ...string) string {
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
260 // Run external command with arguments
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
261 return ""
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
262 },
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
263 "zs": func(args ...string) string {
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
264 // Run zs with arguments
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
265 return ""
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
266 },
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
267 }
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
268 // Plugin functions
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
269 files, _ := ioutil.ReadDir(ZSDIR)
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
270 for _, f := range files {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
271 if !f.IsDir() {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
272 name := f.Name()
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
273 if !strings.HasSuffix(name, ".html") && !strings.HasSuffix(name, ".amber") {
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
274 funcs[strings.TrimSuffix(name, filepath.Ext(name))] = pluginFunc(name)
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
275 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
276 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
277 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
278 return funcs
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
279 }
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
280
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
281 func renameExt(path, from, to string) string {
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
282 if from == "" {
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
283 from = filepath.Ext(path)
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
284 }
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
285 return strings.TrimSuffix(path, from) + to
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
286 }
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
287
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
288 func globals() Vars {
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
289 vars := Vars{}
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
290 for _, e := range os.Environ() {
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
291 pair := strings.Split(e, "=")
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
292 if strings.HasPrefix(pair[0], "ZS_") {
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
293 vars[strings.ToLower(pair[0][3:])] = pair[1]
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
294 }
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
295 }
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
296 return vars
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
297 }
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
298
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
299 func buildAll(once bool) {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
300 lastModified := time.Unix(0, 0)
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
301 modified := false
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
302
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
303 vars := globals()
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
304 for {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
305 os.Mkdir(PUBDIR, 0755)
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
306 funcs := createFuncs()
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
307 err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
308 // ignore hidden files and directories
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
309 if filepath.Base(path)[0] == '.' || strings.HasPrefix(path, ".") {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
310 return nil
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
311 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
312
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
313 if info.IsDir() {
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
314 os.Mkdir(filepath.Join(PUBDIR, path), 0755)
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
315 return nil
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
316 } else if info.ModTime().After(lastModified) {
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
317 if !modified {
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
318 // About to be modified, so run pre-build hook
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
319 // FIXME on windows it might not work well
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
320 run(filepath.Join(ZSDIR, "pre"), []string{}, nil, nil)
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
321 modified = true
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
322 }
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
323 ext := filepath.Ext(path)
13
ece0d406f2db fixed mkd extension typo
zaitsev.serge
parents: 7
diff changeset
324 if ext == ".md" || ext == ".mkd" {
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
325 log.Println("md: ", path)
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
326 return buildMarkdown(path, funcs, vars)
15
a9c42bd52f64 added rendering support for html and xml
zaitsev.serge
parents: 14
diff changeset
327 } else if ext == ".html" || ext == ".xml" {
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
328 log.Println("html: ", path)
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
329 return buildPlain(path, path, funcs, vars)
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
330 } else if ext == ".amber" {
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
331 log.Println("html: ", path)
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
332 return buildAmber(path, renameExt(path, ".amber", ".html"), funcs, vars)
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
333 } else if ext == ".gcss" {
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
334 log.Println("css: ", path)
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
335 return buildGCSS(path)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
336 } else {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
337 log.Println("raw: ", path)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
338 return copyFile(path)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
339 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
340 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
341 return nil
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
342 })
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
343 if err != nil {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
344 log.Println("ERROR:", err)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
345 }
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
346 if modified {
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
347 // Something was modified, so post-build hook
18
ae3116ea938b started migration to go templates
zaitsev.serge
parents: 17
diff changeset
348 // FIXME on windows it might not work well
7
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
349 run(filepath.Join(ZSDIR, "post"), []string{}, nil, nil)
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
350 modified = false
11073a30f71f simplified build process, added pre and post build hooks
zaitsev.serge
parents: 6
diff changeset
351 }
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
352 lastModified = time.Now()
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
353 if once {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
354 break
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
355 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
356 time.Sleep(1 * time.Second)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
357 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
358 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
359
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
360 func main() {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
361 if len(os.Args) == 1 {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
362 fmt.Println(os.Args[0], "<command> [args]")
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
363 return
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
364 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
365 cmd := os.Args[1]
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
366 args := os.Args[2:]
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
367 switch cmd {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
368 case "build":
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
369 buildAll(true)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
370 case "watch":
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
371 buildAll(false) // pass duration
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
372 case "var":
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
373 if len(args) == 0 {
3
53dea9841cd9 moved eval func type to the top, added some error logs
zaitsev.serge
parents: 2
diff changeset
374 log.Println("ERROR: filename expected")
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
375 return
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
376 }
19
802b96e67bae added global variables, added default date for markdown
zaitsev.serge
parents: 18
diff changeset
377 if vars, _, err := md(args[0], globals()); err == nil {
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
378 if len(args) > 1 {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
379 for _, a := range args[1:] {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
380 fmt.Println(vars[a])
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
381 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
382 } else {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
383 for k, v := range vars {
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
384 fmt.Println(k + ":" + v)
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
385 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
386 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
387 } else {
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
388 log.Println("ERROR:", err)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
389 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
390 default:
17
0214b1b5f5eb added amber and gcss compilers
zaitsev.serge
parents: 15
diff changeset
391 err := run(path.Join(ZSDIR, cmd), args, Vars{}, os.Stdout)
4
05fc24caac37 render uses strings, not bytes; added helpers for env and run
zaitsev.serge
parents: 3
diff changeset
392 if err != nil {
20
f8373c23a3ff replaced amber with my own fork, fixed file paths for amber and html
zaitsev.serge
parents: 19
diff changeset
393 log.Println("ERROR:", err)
0
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
394 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
395 }
45a9e1fac18e initial commit
zaitsev.serge
parents:
diff changeset
396 }