Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
migrate zine to leatherman
  • Loading branch information
frioux committed Dec 14, 2020
1 parent a107641 commit a5334a2
Show file tree
Hide file tree
Showing 12 changed files with 956 additions and 0 deletions.
4 changes: 4 additions & 0 deletions README.mdwn
Expand Up @@ -461,6 +461,10 @@ frequently without exhausting github api limits.
`yaml2json` reads YAML on stdin and writes JSON on stdout.
### `zine`
`zine` does read only operations on notes.
## Debugging
In an effort to make debugging simpler, I've created three ways to see what
Expand Down
2 changes: 2 additions & 0 deletions dispatch.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions go.mod
Expand Up @@ -15,6 +15,8 @@ require (
github.com/headzoo/ut v0.0.0-20181013193318-a13b5a7a02ca // indirect
github.com/icza/backscanner v0.0.0-20180226082541-a77511ef4f0f
github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 // indirect
github.com/jmoiron/sqlx v1.2.0 // indirect
github.com/mattn/go-sqlite3 v1.14.5 // indirect
github.com/pierrec/lz4/v3 v3.3.2
github.com/prometheus/client_golang v1.8.0
github.com/prometheus/common v0.15.0
Expand Down
6 changes: 6 additions & 0 deletions go.sum
Expand Up @@ -163,6 +163,8 @@ github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBD
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
Expand All @@ -182,13 +184,17 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.14.5 h1:1IdxlwTNazvbKJQSxoJ5/9ECbEeaTTyeU7sEAZ5KKTQ=
github.com/mattn/go-sqlite3 v1.14.5/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
Expand Down
6 changes: 6 additions & 0 deletions help_generated.go
Expand Up @@ -462,6 +462,10 @@ frequently without exhausting github api limits.
` + "`" + `yaml2json` + "`" + ` reads YAML on stdin and writes JSON on stdout.
### ` + "`" + `zine` + "`" + `
` + "`" + `zine` + "`" + ` does read only operations on notes.
## Debugging
In an effort to make debugging simpler, I've created three ways to see what
Expand Down Expand Up @@ -564,5 +568,7 @@ func init() {
"update": readme[12843:13066],

"yaml2json": readme[13066:13143],

"zine": readme[13143:13199],
}
}
39 changes: 39 additions & 0 deletions internal/tool/notes/db.go
@@ -0,0 +1,39 @@
package notes

import (
"io/ioutil"
"os"

"github.com/frioux/leatherman/internal/dropbox"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-sqlite3"
)

func loadDB(cl dropbox.Client) (*sqlx.DB, func(), error) {
d, err := ioutil.TempDir("", "")
if err != nil {
return nil, func() {}, err
}
cleanup := func() { os.RemoveAll(d) }

r, err := cl.Download("/notes/.posts.db")
if err != nil {
return nil, cleanup, err
}

b, err := ioutil.ReadAll(r)
if err != nil {
return nil, cleanup, err
}

if err := ioutil.WriteFile(d+"/.posts.db", b, 0600); err != nil {
return nil, cleanup, err
}

dbh, err := sqlx.Open("sqlite3", "file:"+d+"/.posts.db?_sync=OFF&_journal=OFF&_vacuum=0")
if err != nil {
return nil, cleanup, err
}

return dbh, cleanup, nil
}
232 changes: 232 additions & 0 deletions internal/tool/zine/commands.go
@@ -0,0 +1,232 @@
package zine

import (
"bytes"
"errors"
"flag"
"fmt"
"io"
"os"
"path/filepath"
"regexp"
"strings"
"text/template"
)

var commands = map[string]func([]string) error{
"render": Render,
"q": Q,
"debug": Debug,
}

/*
Run does read only operations on notes.
Command: zine
*/
func Run(args []string, _ io.Reader) error {
command := "render"
if len(args) > 1 {
command = args[1]
}

cmd, ok := commands[command]
if !ok {
return fmt.Errorf("unknown command «%s»; valid commands are 'render' and 'q'\n", command)
}

if err := cmd(args[1:]); err != nil {
return err
}

return nil
}

// Q runs a query against the corpus.
func Q(args []string) error {
var root, sql, tpl string

flags := flag.NewFlagSet("q", flag.ContinueOnError)
flags.StringVar(&root, "root", "./content", "root input directory")
flags.StringVar(&sql, "sql", "SELECT * FROM _", "sql to run")
flags.StringVar(&tpl, "tpl", `{{join . "\t"}}`, "template to run")
if err := flags.Parse(args[1:]); err != nil {
return err
}

t := template.New("x")
t.Funcs(template.FuncMap{
"join": func(is map[string]interface{}, sep string) string {
s := make([]string, 0, len(is))
for i := range is {
s = append(s, fmt.Sprint(is[i]))
}
return strings.Join(s, sep)
},
})

t, err := t.Parse(tpl)
if err != nil {
return err
}

z, err := newZine()
if err != nil {
return err
}
z.root = root
if err := z.load(nil); err != nil {
return err
}

ret, err := z.q(sql, flags.Args()...)
if err != nil {
return err
}

for _, out := range ret {
if err := t.Execute(os.Stdout, out); err != nil {
return err
}
fmt.Println()
}
return nil
}

// Render will convert the corpus to html.
func Render(args []string) error {
var root, out, static string

flags := flag.NewFlagSet("render", flag.ContinueOnError)
flags.StringVar(&root, "root", "./content", "root input directory")
flags.StringVar(&out, "out", "./public", "directory to render output to")
flags.StringVar(&static, "static", "./static", "directory to prepopulate out with")
if err := flags.Parse(args[1:]); err != nil {
return err
}

z, err := newZine()
if err != nil {
return err
}
z.root = root

metas := []article{}
if err := z.load(&metas); err != nil {
return err
}

if err := os.RemoveAll(out); err != nil {
return err
}

if err := filepath.Walk(static, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}

rel, err := filepath.Rel(static, path)
if err != nil {
return err
}
dir := filepath.Dir(rel)
if err := os.MkdirAll(filepath.Join(out, dir), 0755); err != nil {
return err
}

from, err := os.Open(path)
if err != nil {
return err
}
defer from.Close()

to, err := os.Create(filepath.Join(out, rel))
if err != nil {
return err
}
defer to.Close()

if _, err := io.Copy(to, from); err != nil {
return err
}

return nil
}); err != nil {
return err
}

for i := range metas {
// don't be running on windows
dir := filepath.Join(out, metas[i].URL)
if err := os.MkdirAll(dir, 0755); err != nil {
return fmt.Errorf("couldn't create dir for %s: %w", metas[i].Filename, err)
}

b, err := z.render(metas[i])
if err != nil {
return fmt.Errorf("couldn't render %s: %w", metas[i].Filename, err)
}

f, err := os.Create(filepath.Join(dir, "index.html"))
if err != nil {
return fmt.Errorf("couldn't create %s: %w", filepath.Join(dir, "index.html"), err)
}

if _, err := io.Copy(f, bytes.NewReader(b)); err != nil {
return fmt.Errorf("couldn't copy: %w", err)
}
}

return nil
}

func Debug(args []string) error {
var root, file string

flags := flag.NewFlagSet("debug", flag.ContinueOnError)
flags.StringVar(&root, "root", "./content", "root input directory")
flags.StringVar(&file, "file", "", "file to render to markdown")
if err := flags.Parse(args[1:]); err != nil {
return err
}

if file == "" {
return errors.New("-file argument is required")
}

fileMatcher, err := regexp.Compile(file)
if err != nil {
return err
}

z, err := newZine()
if err != nil {
return err
}
z.root = root

metas := []article{}
if err := z.load(&metas); err != nil {
return err
}

for i := range metas {
if !fileMatcher.MatchString(metas[i].Filename) {
continue
}

b, err := z.renderToMarkdown(metas[i])
if err != nil {
return fmt.Errorf("couldn't render %s: %w", metas[i].Filename, err)
}

if _, err := io.Copy(os.Stdout, bytes.NewReader(b)); err != nil {
return fmt.Errorf("couldn't copy: %w", err)
}
}

return nil
}

0 comments on commit a5334a2

Please sign in to comment.