Changeset 32 in code
Legend:
- Unmodified
- Added
- Removed
-
trunk/zs.go
r31 r32 68 68 // Use standard Go templates 69 69 func render(s string, funcs Funcs, vars Vars) (string, error) { 70 f := Funcs{} 71 for k, v := range funcs { 72 f[k] = v 73 } 74 for k, v := range vars { 75 f[k] = varFunc(v) 76 } 77 // Plugin functions 78 files, _ := ioutil.ReadDir(ZSDIR) 79 for _, file := range files { 80 if !file.IsDir() { 81 name := file.Name() 82 if !strings.HasSuffix(name, ".html") && !strings.HasSuffix(name, ".amber") { 83 f[strings.TrimSuffix(name, filepath.Ext(name))] = pluginFunc(name, vars) 84 } 85 } 86 } 87 70 f := makeFuncs(funcs, vars) 88 71 tmpl, err := template.New("").Funcs(template.FuncMap(f)).Parse(s) 89 72 if err != nil { … … 107 90 return err 108 91 } 109 v["content"] = string(blackfriday.Markdown Basic([]byte(content)))92 v["content"] = string(blackfriday.MarkdownCommon([]byte(content))) 110 93 if w == nil { 111 94 out, err := os.Create(filepath.Join(PUBDIR, renameExt(path, "", ".html"))) … … 157 140 data[k] = v 158 141 } 159 for k, v := range funcs{142 for k, v := range makeFuncs(funcs, Vars{}) { 160 143 data[k] = v 161 144 } … … 303 286 buildAll(true) 304 287 case "var": 305 fmt.Println(Var(args ))288 fmt.Println(Var(args...)) 306 289 case "lorem": 307 fmt.Println(Lorem(args ))290 fmt.Println(Lorem(args...)) 308 291 case "dateparse": 309 fmt.Println(DateParse(args ))292 fmt.Println(DateParse(args...)) 310 293 case "datefmt": 311 fmt.Println(DateFmt(args ))294 fmt.Println(DateFmt(args...)) 312 295 case "wc": 313 fmt.Println(WordCount(args)) 314 case "timetoread": 315 fmt.Println(TimeToRead(args)) 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 316 305 default: 317 306 err := run(path.Join(ZSDIR, cmd), args, globals(), os.Stdout) -
trunk/zs_ext.go
r27 r32 3 3 import ( 4 4 "bytes" 5 "log" 5 6 "os" 7 "path/filepath" 8 "sort" 6 9 "strconv" 7 10 "strings" … … 16 19 // zs var <filename> -- returns list of variables and their values 17 20 // zs var <filename> <var...> -- returns list of variable values 18 func Var(args []string) string {21 func Var(args ...string) string { 19 22 if len(args) == 0 { 20 23 return "var: filename expected" … … 39 42 40 43 // zs lorem <n> -- returns <n> random lorem ipsum sentences 41 func Lorem(args []string) string {44 func Lorem(args ...string) string { 42 45 if len(args) > 1 { 43 46 return "lorem: invalid usage" … … 54 57 55 58 // zs datefmt <fmt> <date> -- returns formatted date from unix time 56 func DateFmt(args []string) string {59 func DateFmt(args ...string) string { 57 60 if len(args) == 0 || len(args) > 2 { 58 61 return "datefmt: invalid usage" … … 66 69 67 70 // zs dateparse <fmt> <date> -- returns unix time from the formatted date 68 func DateParse(args []string) string {71 func DateParse(args ...string) string { 69 72 if len(args) == 0 || len(args) > 2 { 70 73 return "dateparse: invalid usage" … … 78 81 79 82 // zs wc <file> -- returns word count in the file (markdown, html or amber) 80 func WordCount(args []string) int {83 func WordCount(args ...string) int { 81 84 if os.Getenv("ZS_RECURSION") != "" { 82 85 return 0 … … 98 101 99 102 // zs timetoread <file> -- returns number of minutes required to read the text 100 func TimeToRead(args []string) int {101 wc := WordCount(args )103 func TimeToRead(args ...string) int { 104 wc := WordCount(args...) 102 105 return int(math.Floor(float64(wc)/200.0 + .5)) 103 106 } 107 108 // zs ls <dir> <regexp> 109 func List(args ...string) []string { 110 if len(args) != 2 { 111 return []string{} 112 } 113 114 dir := args[0] 115 mask := args[1] 116 117 res := []string{} 118 filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { 119 if err != nil { 120 return nil 121 } 122 if !info.IsDir() { 123 if ok, err := filepath.Match(mask, info.Name()); ok && err == nil { 124 res = append(res, path) 125 } 126 } 127 return nil 128 }) 129 return res 130 } 131 132 // zs sort <key> <files...> 133 func Sort(args ...string) []string { 134 delim := -1 135 for i, s := range args { 136 if s == "--" { 137 delim = i 138 } 139 } 140 cmd := []string{"var", "title"} 141 if delim != -1 { 142 cmd = args[:delim] 143 args = args[delim+1:] 144 } 145 146 sorted := map[string][]string{} 147 sortedKeys := []string{} 148 for _, f := range args { 149 params := append(cmd, f) 150 out := bytes.NewBuffer(nil) 151 run(os.Args[0], params, globals(), out) 152 val := string(out.Bytes()) 153 sorted[val] = append(sorted[val], f) 154 sortedKeys = append(sortedKeys, val) 155 } 156 log.Println(sortedKeys) 157 sort.Strings(sortedKeys) 158 if !asc { 159 } 160 161 list := []string{} 162 for _, k := range sortedKeys { 163 vals := sorted[k] 164 sort.Strings(vals) 165 list = append(list, vals...) 166 } 167 return list 168 } -
trunk/zs_util.go
r25 r32 4 4 "bytes" 5 5 "io" 6 "io/ioutil" 6 7 "log" 7 8 "os" … … 10 11 "strings" 11 12 ) 13 14 func makeFuncs(funcs Funcs, vars Vars) Funcs { 15 f := Funcs{} 16 for k, v := range funcs { 17 f[k] = v 18 } 19 for k, v := range vars { 20 f[k] = varFunc(v) 21 } 22 // Plugin functions 23 files, _ := ioutil.ReadDir(ZSDIR) 24 for _, file := range files { 25 if !file.IsDir() { 26 name := file.Name() 27 if !strings.HasSuffix(name, ".html") && !strings.HasSuffix(name, ".amber") { 28 f[renameExt(name, "", "")] = pluginFunc(name, vars) 29 } else { 30 f[renameExt(name, "", "")] = partialFunc(name, f, vars) 31 } 32 } 33 } 34 return f 35 } 12 36 13 37 func varFunc(s string) func() string { … … 28 52 } 29 53 54 func partialFunc(name string, funcs Funcs, vars Vars) func() string { 55 return func() string { 56 var err error 57 w := bytes.NewBuffer(nil) 58 if strings.HasSuffix(name, ".amber") { 59 err = buildAmber(filepath.Join(ZSDIR, name), w, funcs, vars) 60 } else { 61 err = buildHTML(filepath.Join(ZSDIR, name), w, funcs, vars) 62 } 63 if err != nil { 64 return name + ":" + err.Error() 65 } 66 return string(w.Bytes()) 67 } 68 } 69 30 70 func builtins() Funcs { 31 71 exec := func(cmd string, args ...string) string { … … 39 79 } 40 80 return Funcs{ 41 "exec": exec, 42 "zs": func(args ...string) string { 43 return exec(os.Args[0], args...) 81 "exec": exec, 82 "var": Var, 83 "lorem": Lorem, 84 "dateparse": DateParse, 85 "datefmt": DateFmt, 86 "wc": WordCount, 87 "ttr": TimeToRead, 88 "ls": List, 89 "...": func(args ...string) []string { 90 return append([]string{"..."}, args...) 91 }, 92 "sort": func(args ...string) []string { 93 94 return Sort(args...) 44 95 }, 45 96 }
Note:
See TracChangeset
for help on using the changeset viewer.