From 290104904830fb915336031a509358b13b06c5c7 Mon Sep 17 00:00:00 2001 From: "Serge A. Zaitsev" Date: Sun, 30 Aug 2015 14:42:22 +0200 Subject: [PATCH] added word count and time to read functions --- zs.go | 4 ++++ zs_ext.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/zs.go b/zs.go index 6a3bc8f..f38dbf5 100644 --- a/zs.go +++ b/zs.go @@ -304,6 +304,10 @@ func main() { fmt.Println(DateParse(args)) case "datefmt": fmt.Println(DateFmt(args)) + case "wc": + fmt.Println(WordCount(args)) + case "timetoread": + fmt.Println(TimeToRead(args)) default: err := run(path.Join(ZSDIR, cmd), args, Vars{}, os.Stdout) if err != nil { diff --git a/zs_ext.go b/zs_ext.go index 205942e..cedd884 100644 --- a/zs_ext.go +++ b/zs_ext.go @@ -1,11 +1,15 @@ package main import ( + "bytes" + "os" "strconv" "strings" "time" "github.com/drhodes/golorem" + "github.com/google/gxui/math" + "github.com/jaytaylor/html2text" ) // zs var -- returns list of variables and their values @@ -70,3 +74,29 @@ func DateParse(args []string) string { return strconv.FormatInt(d.Unix(), 10) } } + +// zs wc -- returns word count in the file (markdown, html or amber) +func WordCount(args []string) int { + if os.Getenv("ZS_RECURSION") != "" { + return 0 + } + if len(args) != 1 { + return 0 + } + os.Setenv("ZS_RECURSION", "1") + out := &bytes.Buffer{} + if err := build(args[0], out, builtins(), globals()); err != nil { + return 0 + } + if s, err := html2text.FromString(string(out.Bytes())); err != nil { + return 0 + } else { + return len(strings.Fields(s)) + } +} + +// zs timetoread -- returns number of minutes required to read the text +func TimeToRead(args []string) int { + wc := WordCount(args) + return int(math.Round(float64(wc) / float64(200))) +} -- 2.43.0