Changeset 33 in code
- Timestamp:
- Sep 2, 2015, 3:00:14 PM (10 years ago)
- Location:
- trunk
- Files:
-
- 2 deleted
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/zs.go
r32 r33 8 8 "log" 9 9 "os" 10 "os/exec" 10 11 "path" 11 12 "path/filepath" … … 25 26 26 27 type Vars map[string]string 27 type Funcs template.FuncMap 28 29 func renameExt(path, from, to string) string { 30 if from == "" { 31 from = filepath.Ext(path) 32 } 33 if strings.HasSuffix(path, from) { 34 return strings.TrimSuffix(path, from) + to 35 } else { 36 return path 37 } 38 } 39 40 func globals() Vars { 41 vars := Vars{} 42 for _, e := range os.Environ() { 43 pair := strings.Split(e, "=") 44 if strings.HasPrefix(pair[0], "ZS_") { 45 vars[strings.ToLower(pair[0][3:])] = pair[1] 46 } 47 } 48 return vars 49 } 50 51 // Converts zs markdown variables into environment variables 52 func env(vars Vars) []string { 53 env := []string{"ZS=" + os.Args[0], "ZS_OUTDIR=" + PUBDIR} 54 env = append(env, os.Environ()...) 55 if vars != nil { 56 for k, v := range vars { 57 env = append(env, "ZS_"+strings.ToUpper(k)+"="+v) 58 } 59 } 60 return env 61 } 62 63 // Runs command with given arguments and variables, intercepts stderr and 64 // redirects stdout into the given writer 65 func run(cmd string, args []string, vars Vars, output io.Writer) error { 66 var errbuf bytes.Buffer 67 c := exec.Command(cmd, args...) 68 c.Env = env(vars) 69 c.Stdout = output 70 c.Stderr = &errbuf 71 72 err := c.Run() 73 74 if errbuf.Len() > 0 { 75 log.Println("ERROR:", errbuf.String()) 76 } 77 78 if err != nil { 79 return err 80 } 81 return nil 82 } 83 84 // Splits a string in exactly two parts by delimiter 85 // If no delimiter is found - the second string is be empty 86 func split2(s, delim string) (string, string) { 87 parts := strings.SplitN(s, delim, 2) 88 if len(parts) == 2 { 89 return parts[0], parts[1] 90 } else { 91 return parts[0], "" 92 } 93 } 28 94 29 95 // Parses markdown content. Returns parsed header variables and content … … 67 133 68 134 // Use standard Go templates 69 func render(s string, funcs Funcs, vars Vars) (string, error) { 70 f := makeFuncs(funcs, vars) 71 tmpl, err := template.New("").Funcs(template.FuncMap(f)).Parse(s) 135 func render(s string, vars Vars) (string, error) { 136 tmpl, err := template.New("").Parse(s) 72 137 if err != nil { 73 138 return "", err … … 81 146 82 147 // Renders markdown with the given layout into html expanding all the macros 83 func buildMarkdown(path string, w io.Writer, funcs Funcs,vars Vars) error {148 func buildMarkdown(path string, w io.Writer, vars Vars) error { 84 149 v, body, err := md(path, vars) 85 150 if err != nil { 86 151 return err 87 152 } 88 content, err := render(body, funcs,v)153 content, err := render(body, v) 89 154 if err != nil { 90 155 return err … … 100 165 } 101 166 if strings.HasSuffix(v["layout"], ".amber") { 102 return buildAmber(filepath.Join(ZSDIR, v["layout"]), w, funcs,v)103 } else { 104 return buildHTML(filepath.Join(ZSDIR, v["layout"]), w, funcs,v)167 return buildAmber(filepath.Join(ZSDIR, v["layout"]), w, v) 168 } else { 169 return buildHTML(filepath.Join(ZSDIR, v["layout"]), w, v) 105 170 } 106 171 } 107 172 108 173 // Renders text file expanding all variable macros inside it 109 func buildHTML(path string, w io.Writer, funcs Funcs,vars Vars) error {174 func buildHTML(path string, w io.Writer, vars Vars) error { 110 175 b, err := ioutil.ReadFile(path) 111 176 if err != nil { 112 177 return err 113 178 } 114 content, err := render(string(b), funcs,vars)179 content, err := render(string(b), vars) 115 180 if err != nil { 116 181 return err … … 129 194 130 195 // Renders .amber file into .html 131 func buildAmber(path string, w io.Writer, funcs Funcs,vars Vars) error {196 func buildAmber(path string, w io.Writer, vars Vars) error { 132 197 a := amber.New() 133 198 err := a.ParseFile(path) … … 140 205 data[k] = v 141 206 } 142 for k, v := range makeFuncs(funcs, Vars{}) {143 data[k] = v144 }145 207 146 208 t, err := a.Compile() … … 199 261 } 200 262 201 func build(path string, w io.Writer, funcs Funcs,vars Vars) error {263 func build(path string, w io.Writer, vars Vars) error { 202 264 ext := filepath.Ext(path) 203 265 if ext == ".md" || ext == ".mkd" { 204 return buildMarkdown(path, w, funcs,vars)266 return buildMarkdown(path, w, vars) 205 267 } else if ext == ".html" || ext == ".xml" { 206 return buildHTML(path, w, funcs,vars)268 return buildHTML(path, w, vars) 207 269 } else if ext == ".amber" { 208 return buildAmber(path, w, funcs,vars)270 return buildAmber(path, w, vars) 209 271 } else if ext == ".gcss" { 210 272 return buildGCSS(path, w) … … 221 283 for { 222 284 os.Mkdir(PUBDIR, 0755) 223 funcs := builtins()224 285 err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { 225 286 // ignore hidden files and directories … … 244 305 } 245 306 log.Println("build: ", path) 246 return build(path, nil, funcs,vars)307 return build(path, nil, vars) 247 308 } 248 309 return nil … … 277 338 buildAll(false) 278 339 } else if len(args) == 1 { 279 if err := build(args[0], os.Stdout, builtins(),globals()); err != nil {340 if err := build(args[0], os.Stdout, globals()); err != nil { 280 341 fmt.Println("ERROR: " + err.Error()) 281 342 } … … 286 347 buildAll(true) 287 348 case "var": 288 fmt.Println(Var(args...)) 289 case "lorem": 290 fmt.Println(Lorem(args...)) 291 case "dateparse": 292 fmt.Println(DateParse(args...)) 293 case "datefmt": 294 fmt.Println(DateFmt(args...)) 295 case "wc": 296 fmt.Println(WordCount(args...)) 297 case "ttr": 298 fmt.Println(TimeToRead(args...)) 299 case "ls": 300 fmt.Println(strings.Join(List(args...), "\n")) 301 case "sort": 302 fmt.Println(strings.Join(Sort(args...), "\n")) 303 case "exec": 304 // TODO 349 if len(args) == 0 { 350 fmt.Println("var: filename expected") 351 } else { 352 s := "" 353 if vars, _, err := md(args[0], globals()); err != nil { 354 fmt.Println("var: " + err.Error()) 355 } else { 356 if len(args) > 1 { 357 for _, a := range args[1:] { 358 s = s + vars[a] + "\n" 359 } 360 } else { 361 for k, v := range vars { 362 s = s + k + ":" + v + "\n" 363 } 364 } 365 } 366 fmt.Println(strings.TrimSpace(s)) 367 } 305 368 default: 306 369 err := run(path.Join(ZSDIR, cmd), args, globals(), os.Stdout)
Note:
See TracChangeset
for help on using the changeset viewer.