diff zs_util.go @ 31:b2f491299cee draft

dead end with template functions
author zaitsev.serge
date Wed, 02 Sep 2015 14:54:16 +0000
parents d052f3a44195
children
line wrap: on
line diff
--- a/zs_util.go	Sun Aug 30 21:16:51 2015 +0000
+++ b/zs_util.go	Wed Sep 02 14:54:16 2015 +0000
@@ -3,6 +3,7 @@
 import (
 	"bytes"
 	"io"
+	"io/ioutil"
 	"log"
 	"os"
 	"os/exec"
@@ -10,6 +11,29 @@
 	"strings"
 )
 
+func makeFuncs(funcs Funcs, vars Vars) Funcs {
+	f := Funcs{}
+	for k, v := range funcs {
+		f[k] = v
+	}
+	for k, v := range vars {
+		f[k] = varFunc(v)
+	}
+	// Plugin functions
+	files, _ := ioutil.ReadDir(ZSDIR)
+	for _, file := range files {
+		if !file.IsDir() {
+			name := file.Name()
+			if !strings.HasSuffix(name, ".html") && !strings.HasSuffix(name, ".amber") {
+				f[renameExt(name, "", "")] = pluginFunc(name, vars)
+			} else {
+				f[renameExt(name, "", "")] = partialFunc(name, f, vars)
+			}
+		}
+	}
+	return f
+}
+
 func varFunc(s string) func() string {
 	return func() string {
 		return s
@@ -27,6 +51,22 @@
 	}
 }
 
+func partialFunc(name string, funcs Funcs, vars Vars) func() string {
+	return func() string {
+		var err error
+		w := bytes.NewBuffer(nil)
+		if strings.HasSuffix(name, ".amber") {
+			err = buildAmber(filepath.Join(ZSDIR, name), w, funcs, vars)
+		} else {
+			err = buildHTML(filepath.Join(ZSDIR, name), w, funcs, vars)
+		}
+		if err != nil {
+			return name + ":" + err.Error()
+		}
+		return string(w.Bytes())
+	}
+}
+
 func builtins() Funcs {
 	exec := func(cmd string, args ...string) string {
 		out := bytes.NewBuffer(nil)
@@ -38,9 +78,20 @@
 		return ""
 	}
 	return Funcs{
-		"exec": exec,
-		"zs": func(args ...string) string {
-			return exec(os.Args[0], args...)
+		"exec":      exec,
+		"var":       Var,
+		"lorem":     Lorem,
+		"dateparse": DateParse,
+		"datefmt":   DateFmt,
+		"wc":        WordCount,
+		"ttr":       TimeToRead,
+		"ls":        List,
+		"...": func(args ...string) []string {
+			return append([]string{"..."}, args...)
+		},
+		"sort": func(args ...string) []string {
+
+			return Sort(args...)
 		},
 	}
 }