Mercurial > yakumo_izuru > aya
comparison zs.go @ 19:802b96e67bae draft
added global variables, added default date for markdown
author | zaitsev.serge |
---|---|
date | Sat, 29 Aug 2015 17:54:55 +0000 |
parents | ae3116ea938b |
children | f8373c23a3ff |
comparison
equal
deleted
inserted
replaced
18:ae3116ea938b | 19:802b96e67bae |
---|---|
36 return parts[0], "" | 36 return parts[0], "" |
37 } | 37 } |
38 } | 38 } |
39 | 39 |
40 // Parses markdown content. Returns parsed header variables and content | 40 // Parses markdown content. Returns parsed header variables and content |
41 func md(path string) (Vars, string, error) { | 41 func md(path string, globals Vars) (Vars, string, error) { |
42 b, err := ioutil.ReadFile(path) | 42 b, err := ioutil.ReadFile(path) |
43 if err != nil { | 43 if err != nil { |
44 return nil, "", err | 44 return nil, "", err |
45 } | 45 } |
46 s := string(b) | 46 s := string(b) |
49 "file": path, | 49 "file": path, |
50 "url": url, | 50 "url": url, |
51 "output": filepath.Join(PUBDIR, url), | 51 "output": filepath.Join(PUBDIR, url), |
52 "layout": "index.html", | 52 "layout": "index.html", |
53 } | 53 } |
54 if info, err := os.Stat(path); err == nil { | |
55 v["date"] = info.ModTime().Format("02-01-2006") | |
56 } | |
57 for name, value := range globals { | |
58 v[name] = value | |
59 } | |
54 if strings.Index(s, "\n\n") == -1 { | 60 if strings.Index(s, "\n\n") == -1 { |
55 return Vars{}, s, nil | 61 return v, s, nil |
56 } | 62 } |
57 header, body := split2(s, "\n\n") | 63 header, body := split2(s, "\n\n") |
58 for _, line := range strings.Split(header, "\n") { | 64 for _, line := range strings.Split(header, "\n") { |
59 key, value := split2(line, ":") | 65 key, value := split2(line, ":") |
60 v[strings.ToLower(strings.TrimSpace(key))] = strings.TrimSpace(value) | 66 v[strings.ToLower(strings.TrimSpace(key))] = strings.TrimSpace(value) |
137 return outbuf.String(), nil | 143 return outbuf.String(), nil |
138 } | 144 } |
139 | 145 |
140 // Renders markdown with the given layout into html expanding all the macros | 146 // Renders markdown with the given layout into html expanding all the macros |
141 func buildMarkdown(path string, funcs template.FuncMap, vars Vars) error { | 147 func buildMarkdown(path string, funcs template.FuncMap, vars Vars) error { |
142 v, body, err := md(path) | 148 v, body, err := md(path, vars) |
143 if err != nil { | 149 if err != nil { |
144 return err | 150 return err |
145 } | 151 } |
146 content, err := render(body, funcs, v) | 152 content, err := render(body, funcs, v) |
147 if err != nil { | 153 if err != nil { |
241 } | 247 } |
242 } | 248 } |
243 | 249 |
244 func createFuncs() template.FuncMap { | 250 func createFuncs() template.FuncMap { |
245 // Builtin functions | 251 // Builtin functions |
246 funcs := template.FuncMap{} | 252 funcs := template.FuncMap{ |
253 "exec": func(s ...string) string { | |
254 // Run external command with arguments | |
255 return "" | |
256 }, | |
257 "zs": func(args ...string) string { | |
258 // Run zs with arguments | |
259 return "" | |
260 }, | |
261 } | |
247 // Plugin functions | 262 // Plugin functions |
248 files, _ := ioutil.ReadDir(ZSDIR) | 263 files, _ := ioutil.ReadDir(ZSDIR) |
249 for _, f := range files { | 264 for _, f := range files { |
250 if !f.IsDir() { | 265 if !f.IsDir() { |
251 name := f.Name() | 266 name := f.Name() |
255 } | 270 } |
256 } | 271 } |
257 return funcs | 272 return funcs |
258 } | 273 } |
259 | 274 |
275 func globals() Vars { | |
276 vars := Vars{} | |
277 for _, e := range os.Environ() { | |
278 pair := strings.Split(e, "=") | |
279 if strings.HasPrefix(pair[0], "ZS_") { | |
280 vars[strings.ToLower(pair[0][3:])] = pair[1] | |
281 } | |
282 } | |
283 return vars | |
284 } | |
285 | |
260 func buildAll(once bool) { | 286 func buildAll(once bool) { |
261 lastModified := time.Unix(0, 0) | 287 lastModified := time.Unix(0, 0) |
262 modified := false | 288 modified := false |
263 // Convert env variables into zs global variables | 289 |
264 globals := Vars{} | 290 vars := globals() |
265 for _, e := range os.Environ() { | |
266 pair := strings.Split(e, "=") | |
267 if strings.HasPrefix(pair[0], "ZS_") { | |
268 globals[strings.ToLower(pair[0][3:])] = pair[1] | |
269 } | |
270 } | |
271 for { | 291 for { |
272 os.Mkdir(PUBDIR, 0755) | 292 os.Mkdir(PUBDIR, 0755) |
273 funcs := createFuncs() | 293 funcs := createFuncs() |
274 err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { | 294 err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error { |
275 // ignore hidden files and directories | 295 // ignore hidden files and directories |
288 modified = true | 308 modified = true |
289 } | 309 } |
290 ext := filepath.Ext(path) | 310 ext := filepath.Ext(path) |
291 if ext == ".md" || ext == ".mkd" { | 311 if ext == ".md" || ext == ".mkd" { |
292 log.Println("md: ", path) | 312 log.Println("md: ", path) |
293 return buildMarkdown(path, funcs, globals) | 313 return buildMarkdown(path, funcs, vars) |
294 } else if ext == ".html" || ext == ".xml" { | 314 } else if ext == ".html" || ext == ".xml" { |
295 log.Println("html: ", path) | 315 log.Println("html: ", path) |
296 return buildPlain(path, funcs, globals) | 316 return buildPlain(path, funcs, vars) |
297 } else if ext == ".amber" { | 317 } else if ext == ".amber" { |
298 log.Println("html: ", path) | 318 log.Println("html: ", path) |
299 return buildAmber(path, funcs, globals) | 319 return buildAmber(path, funcs, vars) |
300 } else if ext == ".gcss" { | 320 } else if ext == ".gcss" { |
301 log.Println("css: ", path) | 321 log.Println("css: ", path) |
302 return buildGCSS(path) | 322 return buildGCSS(path) |
303 } else { | 323 } else { |
304 log.Println("raw: ", path) | 324 log.Println("raw: ", path) |
339 case "var": | 359 case "var": |
340 if len(args) == 0 { | 360 if len(args) == 0 { |
341 log.Println("ERROR: filename expected") | 361 log.Println("ERROR: filename expected") |
342 return | 362 return |
343 } | 363 } |
344 if vars, _, err := md(args[0]); err == nil { | 364 if vars, _, err := md(args[0], globals()); err == nil { |
345 if len(args) > 1 { | 365 if len(args) > 1 { |
346 for _, a := range args[1:] { | 366 for _, a := range args[1:] { |
347 fmt.Println(vars[a]) | 367 fmt.Println(vars[a]) |
348 } | 368 } |
349 } else { | 369 } else { |