1package main
2
3import (
4 "errors"
5 "html/template"
6 "io"
7 "os"
8 "os/exec"
9 "path/filepath"
10
11 "github.com/nmeum/depp/gitweb"
12)
13
14const renderScript = "git-render-readme"
15
16func runWithInput(cmd *exec.Cmd, input string) (string, error) {
17 stdin, err := cmd.StdinPipe()
18 if err != nil {
19 return "", err
20 }
21
22 go func() {
23 defer stdin.Close()
24 io.WriteString(stdin, input)
25 }()
26
27 out, err := cmd.Output()
28 if err != nil {
29 return "", err
30 }
31
32 return string(out), nil
33}
34
35func renderReadme(repo *gitweb.RepoPage) (template.HTML, error) {
36 readme, err := repo.Readme()
37 if errors.Is(err, os.ErrNotExist) {
38 return "", nil
39 } else if err != nil {
40 return "", err
41 }
42
43 fp := filepath.Join(repo.Path, renderScript)
44 renderer, err := exec.LookPath(fp)
45 if err != nil {
46 if errors.Is(err, os.ErrNotExist) || errors.Is(err, exec.ErrNotFound) {
47 escaped := template.HTMLEscapeString(readme)
48 return template.HTML(`<pre class="raw">` + escaped + "</pre>"), nil
49 }
50
51 return "", err
52 }
53
54 cmd := exec.Command(renderer)
55 out, err := runWithInput(cmd, readme)
56 if err != nil {
57 return "", err
58 }
59
60 return template.HTML(out), nil
61}