Changeset 32 in code


Ignore:
Timestamp:
Sep 2, 2015, 2:54:16 PM (10 years ago)
Author:
zaitsev.serge
Message:

dead end with template functions

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/zs.go

    r31 r32  
    6868// Use standard Go templates
    6969func 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)
    8871        tmpl, err := template.New("").Funcs(template.FuncMap(f)).Parse(s)
    8972        if err != nil {
     
    10790                return err
    10891        }
    109         v["content"] = string(blackfriday.MarkdownBasic([]byte(content)))
     92        v["content"] = string(blackfriday.MarkdownCommon([]byte(content)))
    11093        if w == nil {
    11194                out, err := os.Create(filepath.Join(PUBDIR, renameExt(path, "", ".html")))
     
    157140                data[k] = v
    158141        }
    159         for k, v := range funcs {
     142        for k, v := range makeFuncs(funcs, Vars{}) {
    160143                data[k] = v
    161144        }
     
    303286                buildAll(true)
    304287        case "var":
    305                 fmt.Println(Var(args))
     288                fmt.Println(Var(args...))
    306289        case "lorem":
    307                 fmt.Println(Lorem(args))
     290                fmt.Println(Lorem(args...))
    308291        case "dateparse":
    309                 fmt.Println(DateParse(args))
     292                fmt.Println(DateParse(args...))
    310293        case "datefmt":
    311                 fmt.Println(DateFmt(args))
     294                fmt.Println(DateFmt(args...))
    312295        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
    316305        default:
    317306                err := run(path.Join(ZSDIR, cmd), args, globals(), os.Stdout)
  • trunk/zs_ext.go

    r27 r32  
    33import (
    44        "bytes"
     5        "log"
    56        "os"
     7        "path/filepath"
     8        "sort"
    69        "strconv"
    710        "strings"
     
    1619// zs var <filename> -- returns list of variables and their values
    1720// zs var <filename> <var...> -- returns list of variable values
    18 func Var(args []string) string {
     21func Var(args ...string) string {
    1922        if len(args) == 0 {
    2023                return "var: filename expected"
     
    3942
    4043// zs lorem <n> -- returns <n> random lorem ipsum sentences
    41 func Lorem(args []string) string {
     44func Lorem(args ...string) string {
    4245        if len(args) > 1 {
    4346                return "lorem: invalid usage"
     
    5457
    5558// zs datefmt <fmt> <date> -- returns formatted date from unix time
    56 func DateFmt(args []string) string {
     59func DateFmt(args ...string) string {
    5760        if len(args) == 0 || len(args) > 2 {
    5861                return "datefmt: invalid usage"
     
    6669
    6770// zs dateparse <fmt> <date> -- returns unix time from the formatted date
    68 func DateParse(args []string) string {
     71func DateParse(args ...string) string {
    6972        if len(args) == 0 || len(args) > 2 {
    7073                return "dateparse: invalid usage"
     
    7881
    7982// zs wc <file> -- returns word count in the file (markdown, html or amber)
    80 func WordCount(args []string) int {
     83func WordCount(args ...string) int {
    8184        if os.Getenv("ZS_RECURSION") != "" {
    8285                return 0
     
    98101
    99102// zs timetoread <file> -- returns number of minutes required to read the text
    100 func TimeToRead(args []string) int {
    101         wc := WordCount(args)
     103func TimeToRead(args ...string) int {
     104        wc := WordCount(args...)
    102105        return int(math.Floor(float64(wc)/200.0 + .5))
    103106}
     107
     108// zs ls <dir> <regexp>
     109func 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...>
     133func 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  
    44        "bytes"
    55        "io"
     6        "io/ioutil"
    67        "log"
    78        "os"
     
    1011        "strings"
    1112)
     13
     14func 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}
    1236
    1337func varFunc(s string) func() string {
     
    2852}
    2953
     54func 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
    3070func builtins() Funcs {
    3171        exec := func(cmd string, args ...string) string {
     
    3979        }
    4080        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...)
    4495                },
    4596        }
Note: See TracChangeset for help on using the changeset viewer.