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  }