github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/markup/internal/external.go (about) 1 package internal 2 3 import ( 4 "bytes" 5 "strings" 6 7 "github.com/cli/safeexec" 8 "github.com/gohugoio/hugo/common/hexec" 9 10 "github.com/gohugoio/hugo/markup/converter" 11 ) 12 13 func ExternallyRenderContent( 14 cfg converter.ProviderConfig, 15 ctx converter.DocumentContext, 16 content []byte, path string, args []string) []byte { 17 logger := cfg.Logger 18 cmd, err := hexec.SafeCommand(path, args...) 19 if err != nil { 20 logger.Errorf("%s rendering %s: %v", path, ctx.DocumentName, err) 21 return nil 22 } 23 cmd.Stdin = bytes.NewReader(content) 24 var out, cmderr bytes.Buffer 25 cmd.Stdout = &out 26 cmd.Stderr = &cmderr 27 err = cmd.Run() 28 // Most external helpers exit w/ non-zero exit code only if severe, i.e. 29 // halting errors occurred. -> log stderr output regardless of state of err 30 for _, item := range strings.Split(cmderr.String(), "\n") { 31 item := strings.TrimSpace(item) 32 if item != "" { 33 logger.Errorf("%s: %s", ctx.DocumentName, item) 34 } 35 } 36 if err != nil { 37 logger.Errorf("%s rendering %s: %v", path, ctx.DocumentName, err) 38 } 39 40 return normalizeExternalHelperLineFeeds(out.Bytes()) 41 } 42 43 // Strips carriage returns from third-party / external processes (useful for Windows) 44 func normalizeExternalHelperLineFeeds(content []byte) []byte { 45 return bytes.Replace(content, []byte("\r"), []byte(""), -1) 46 } 47 48 func GetPythonExecPath() string { 49 path, err := safeexec.LookPath("python") 50 if err != nil { 51 path, err = safeexec.LookPath("python.exe") 52 if err != nil { 53 return "" 54 } 55 } 56 return path 57 }