Use github.com/google/shlex to parse commands

Implements: https://todo.sr.ht/~adnano/kiln/21
This commit is contained in:
adnano 2022-02-09 00:25:48 -05:00
parent 7f342d411b
commit fb6470aa5f
5 changed files with 38 additions and 7 deletions

View file

@ -5,6 +5,8 @@ import (
"path"
"reflect"
"strings"
"github.com/google/shlex"
)
// funcs returns functions for use in templates.
@ -56,7 +58,11 @@ func (_strings) TrimSuffix(a, b string) string { return strings.TrimSuffi
func executeString(command, input string) (string, error) {
var b strings.Builder
if err := execute(command, strings.NewReader(input), &b); err != nil {
cmd, err := shlex.Split(command)
if err != nil {
return "", err
}
if err := execute(cmd, strings.NewReader(input), &b); err != nil {
return "", err
}
return b.String(), nil

1
go.mod
View file

@ -3,6 +3,7 @@ module kiln
go 1.16
require (
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
github.com/pelletier/go-toml v1.9.0
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
)

2
go.sum
View file

@ -1,3 +1,5 @@
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/pelletier/go-toml v1.9.0 h1:NOd0BRdOKpPf0SxkL3HxSQOG7rNh+4kl6PHcBPFs7Q0=
github.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

12
page.go
View file

@ -120,7 +120,7 @@ func (p *Page) _read(srcDir, path string, task *Task, cfg *Site) error {
content = bytes.TrimLeft(content, "\r\n")
}
if cmd, ok := task.Preprocess[strings.TrimPrefix(ext, ".")]; ok {
if cmd, ok := task.preprocess[strings.TrimPrefix(ext, ".")]; ok {
var buf bytes.Buffer
if err := execute(cmd, bytes.NewReader(content), &buf); err != nil {
return err
@ -275,7 +275,7 @@ func (p *Page) write(dstDir string, task *Task) error {
func (p *Page) writeTo(dstPath string, task *Task) error {
var content []byte
if cmd := task.Postprocess; cmd != "" {
if cmd := task.postprocess; cmd != nil {
var buf bytes.Buffer
if err := execute(cmd, strings.NewReader(p.Content), &buf); err != nil {
return err
@ -331,9 +331,11 @@ func sortPages(pages []*Page) {
}
// execute runs a command.
func execute(command string, input io.Reader, output io.Writer) error {
split := strings.Split(command, " ")
cmd := exec.Command(split[0], split[1:]...)
func execute(command []string, input io.Reader, output io.Writer) error {
if len(command) == 0 {
return nil
}
cmd := exec.Command(command[0], command[1:]...)
cmd.Stdin = input
cmd.Stderr = os.Stderr
cmd.Stdout = output

22
site.go
View file

@ -6,6 +6,7 @@ import (
"text/template"
"time"
"github.com/google/shlex"
"github.com/pelletier/go-toml"
)
@ -33,6 +34,8 @@ type Task struct {
URL string `toml:"url"`
UglyURLs bool `toml:"ugly_urls"`
Feeds []Feed `toml:"feeds"`
preprocess map[string][]string
postprocess []string
feeds map[string][]Feed
}
@ -92,13 +95,30 @@ func LoadSite(config string) (*Site, error) {
return nil, err
}
// Populate task feeds map
for _, task := range site.Tasks {
// Populate feeds
task.feeds = map[string][]Feed{}
for _, feed := range task.Feeds {
dir := feed.InputDir
task.feeds[dir] = append(task.feeds[dir], feed)
}
// Parse commands
task.preprocess = map[string][]string{}
for path := range task.Preprocess {
preprocess, err := shlex.Split(task.Preprocess[path])
if err != nil {
return nil, err
}
task.preprocess[path] = preprocess
}
if task.Postprocess != "" {
postprocess, err := shlex.Split(task.Postprocess)
if err != nil {
return nil, err
}
task.postprocess = postprocess
}
}
return site, nil