--- /dev/null
+image: WMF 5
+clone_folder: c:\GOPATH\src\github.com\spf13\hugo
+init:
+- cmd: >-
+ set PATH=%PATH%;C:\MinGW\bin;C:\GOPATH\bin
+
+ copy c:\MinGW\bin\mingw32-make.exe c:\MinGW\bin\make.exe
+environment:
+ GOPATH: c:\GOPATH
+install:
+- cmd: >-
+ gem install asciidoctor
+
+ pip install docutils
+build_script:
+- cmd: make govendor
+test_script:
+- cmd: >-
+ make check
+
+ REM Test 64-bit alignment on 32-bit builds
+
+ set "GOARCH=386" & make test & set GOARCH=
+
+ go build -race
+
+ hugo -s docs/
+
+ hugo --renderToMemory -s docs/
jww.ERROR.Printf("%s rendering %s: %v", path, ctx.DocumentName, err)
}
- return out.Bytes()
+ return normalizeExternalHelperLineFeeds(out.Bytes())
}
// HasRst returns whether rst2html is installed on this computer.
return path
}
+func getPythonExecPath() string {
+ path, err := exec.LookPath("python")
+ if err != nil {
+ path, err = exec.LookPath("python.exe")
+ if err != nil {
+ return ""
+ }
+ }
+ return path
+}
+
// getRstContent calls the Python script rst2html as an external helper
// to convert reStructuredText content to HTML.
func getRstContent(ctx *RenderingContext) []byte {
content := ctx.Content
cleanContent := bytes.Replace(content, SummaryDivider, []byte(""), 1)
+ python := getPythonExecPath()
path := getRstExecPath()
if path == "" {
}
jww.INFO.Println("Rendering", ctx.DocumentName, "with", path, "...")
- cmd := exec.Command(path, "--leave-comments")
+ cmd := exec.Command(python, path, "--leave-comments")
cmd.Stdin = bytes.NewReader(cleanContent)
var out, cmderr bytes.Buffer
cmd.Stdout = &out
jww.ERROR.Printf("%s rendering %s: %v", path, ctx.DocumentName, err)
}
- result := out.Bytes()
+ result := normalizeExternalHelperLineFeeds(out.Bytes())
// TODO(bep) check if rst2html has a body only option.
bodyStart := bytes.Index(result, []byte("<body>\n"))
+ if bodyStart < 0 {
+ bodyStart = -7 //compensate for length
+ }
+
bodyEnd := bytes.Index(result, []byte("\n</body>"))
+ if bodyEnd < 0 || bodyEnd >= len(result) {
+ bodyEnd = len(result) - 1
+ if bodyEnd < 0 {
+ bodyEnd = 0
+ }
+ }
return result[bodyStart+7 : bodyEnd]
}
// FilePathSeparator as defined by os.Separator.
const FilePathSeparator = string(filepath.Separator)
+// Strips carriage returns from third-party / external processes (useful for Windows)
+func normalizeExternalHelperLineFeeds(content []byte) []byte {
+ return bytes.Replace(content, []byte("\r"), []byte(""), -1)
+}
+
// FindAvailablePort returns an available and valid TCP port.
func FindAvailablePort() (*net.TCPAddr, error) {
l, err := net.Listen("tcp", ":0")
continue
}
// Git normalizes file paths on this form:
- filename := path.Join(contentRoot, contentDir, filepath.ToSlash(p.Path()))
+ filename := path.Join(filepath.ToSlash(contentRoot), contentDir, filepath.ToSlash(p.Path()))
g, ok := gitMap[filename]
if !ok {
jww.ERROR.Printf("Failed to find GitInfo for %q", filename)