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 {