helpers: Call rst2html directly on *nix

Initially, rst2html was called via the python interpreter which would
fail if the script was wrapped in a launcher as on NixOS.
Ideally, on *nix, binaries should be invoked directly to ensure that
shebangs work properly as is being done now.
Handle the case of windows as it doesn't do shebangs.
This commit is contained in:
Shreyansh Khajanchi 2018-10-11 20:46:10 +00:00 committed by Bjørn Erik Pedersen
parent bdca972794
commit 3d4a9882bf

View file

@ -22,6 +22,7 @@ import (
"fmt" "fmt"
"html/template" "html/template"
"os/exec" "os/exec"
"runtime"
"unicode" "unicode"
"unicode/utf8" "unicode/utf8"
@ -678,7 +679,6 @@ func getPythonExecPath() string {
// getRstContent calls the Python script rst2html as an external helper // getRstContent calls the Python script rst2html as an external helper
// to convert reStructuredText content to HTML. // to convert reStructuredText content to HTML.
func getRstContent(ctx *RenderingContext) []byte { func getRstContent(ctx *RenderingContext) []byte {
python := getPythonExecPath()
path := getRstExecPath() path := getRstExecPath()
if path == "" { if path == "" {
@ -688,8 +688,19 @@ func getRstContent(ctx *RenderingContext) []byte {
} }
jww.INFO.Println("Rendering", ctx.DocumentName, "with", path, "...") jww.INFO.Println("Rendering", ctx.DocumentName, "with", path, "...")
args := []string{path, "--leave-comments", "--initial-header-level=2"} var result []byte
result := externallyRenderContent(ctx, python, args) // certain *nix based OSs wrap executables in scripted launchers
// invoking binaries on these OSs via python interpreter causes SyntaxError
// invoke directly so that shebangs work as expected
// handle Windows manually because it doesn't do shebangs
if runtime.GOOS == "windows" {
python := getPythonExecPath()
args := []string{path, "--leave-comments", "--initial-header-level=2"}
result = externallyRenderContent(ctx, python, args)
} else {
args := []string{"--leave-comments", "--initial-header-level=2"}
result = externallyRenderContent(ctx, path, args)
}
// TODO(bep) check if rst2html has a body only option. // TODO(bep) check if rst2html has a body only option.
bodyStart := bytes.Index(result, []byte("<body>\n")) bodyStart := bytes.Index(result, []byte("<body>\n"))
if bodyStart < 0 { if bodyStart < 0 {