mirror of
https://git.sr.ht/~adnano/kiln
synced 2024-10-30 09:23:09 +00:00
Use github.com/google/shlex to parse commands
Implements: https://todo.sr.ht/~adnano/kiln/21
This commit is contained in:
parent
3ce91bc9ab
commit
38a168c514
8
funcs.go
8
funcs.go
|
@ -5,6 +5,8 @@ import (
|
||||||
"path"
|
"path"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/google/shlex"
|
||||||
)
|
)
|
||||||
|
|
||||||
// funcs returns functions for use in templates.
|
// 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) {
|
func executeString(command, input string) (string, error) {
|
||||||
var b strings.Builder
|
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 "", err
|
||||||
}
|
}
|
||||||
return b.String(), nil
|
return b.String(), nil
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -3,6 +3,7 @@ module kiln
|
||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
|
||||||
github.com/pelletier/go-toml v1.9.0
|
github.com/pelletier/go-toml v1.9.0
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||||
)
|
)
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -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 h1:NOd0BRdOKpPf0SxkL3HxSQOG7rNh+4kl6PHcBPFs7Q0=
|
||||||
github.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
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=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
|
12
page.go
12
page.go
|
@ -120,7 +120,7 @@ func (p *Page) _read(srcDir, path string, task *Task, cfg *Site) error {
|
||||||
content = bytes.TrimLeft(content, "\r\n")
|
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
|
var buf bytes.Buffer
|
||||||
if err := execute(cmd, bytes.NewReader(content), &buf); err != nil {
|
if err := execute(cmd, bytes.NewReader(content), &buf); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -275,7 +275,7 @@ func (p *Page) write(dstDir string, task *Task) error {
|
||||||
|
|
||||||
func (p *Page) writeTo(dstPath string, task *Task) error {
|
func (p *Page) writeTo(dstPath string, task *Task) error {
|
||||||
var content []byte
|
var content []byte
|
||||||
if cmd := task.Postprocess; cmd != "" {
|
if cmd := task.postprocess; cmd != nil {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
if err := execute(cmd, strings.NewReader(p.Content), &buf); err != nil {
|
if err := execute(cmd, strings.NewReader(p.Content), &buf); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -331,9 +331,11 @@ func sortPages(pages []*Page) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// execute runs a command.
|
// execute runs a command.
|
||||||
func execute(command string, input io.Reader, output io.Writer) error {
|
func execute(command []string, input io.Reader, output io.Writer) error {
|
||||||
split := strings.Split(command, " ")
|
if len(command) == 0 {
|
||||||
cmd := exec.Command(split[0], split[1:]...)
|
return nil
|
||||||
|
}
|
||||||
|
cmd := exec.Command(command[0], command[1:]...)
|
||||||
cmd.Stdin = input
|
cmd.Stdin = input
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Stdout = output
|
cmd.Stdout = output
|
||||||
|
|
22
site.go
22
site.go
|
@ -6,6 +6,7 @@ import (
|
||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/shlex"
|
||||||
"github.com/pelletier/go-toml"
|
"github.com/pelletier/go-toml"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -33,6 +34,8 @@ type Task struct {
|
||||||
URL string `toml:"url"`
|
URL string `toml:"url"`
|
||||||
UglyURLs bool `toml:"ugly_urls"`
|
UglyURLs bool `toml:"ugly_urls"`
|
||||||
Feeds []Feed `toml:"feeds"`
|
Feeds []Feed `toml:"feeds"`
|
||||||
|
preprocess map[string][]string
|
||||||
|
postprocess []string
|
||||||
feeds map[string][]Feed
|
feeds map[string][]Feed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,13 +95,30 @@ func LoadSite(config string) (*Site, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate task feeds map
|
|
||||||
for _, task := range site.Tasks {
|
for _, task := range site.Tasks {
|
||||||
|
// Populate feeds
|
||||||
task.feeds = map[string][]Feed{}
|
task.feeds = map[string][]Feed{}
|
||||||
for _, feed := range task.Feeds {
|
for _, feed := range task.Feeds {
|
||||||
dir := feed.InputDir
|
dir := feed.InputDir
|
||||||
task.feeds[dir] = append(task.feeds[dir], feed)
|
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
|
return site, nil
|
||||||
|
|
Loading…
Reference in a new issue