summaryrefslogtreecommitdiffstats
path: root/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'helpers')
-rw-r--r--helpers/content.go104
-rw-r--r--helpers/general.go2
-rw-r--r--helpers/general_test.go2
3 files changed, 52 insertions, 56 deletions
diff --git a/helpers/content.go b/helpers/content.go
index a79da090b..b776d0813 100644
--- a/helpers/content.go
+++ b/helpers/content.go
@@ -454,6 +454,8 @@ func (c ContentSpec) RenderBytes(ctx *RenderingContext) []byte {
return getRstContent(ctx)
case "org":
return orgRender(ctx, c)
+ case "pandoc":
+ return getPandocContent(ctx)
}
}
@@ -578,11 +580,6 @@ func getAsciidocExecPath() string {
return path
}
-// HasAsciidoc returns whether Asciidoc is installed on this computer.
-func HasAsciidoc() bool {
- return getAsciidocExecPath() != ""
-}
-
func getAsciidoctorExecPath() string {
path, err := exec.LookPath("asciidoctor")
if err != nil {
@@ -591,17 +588,15 @@ func getAsciidoctorExecPath() string {
return path
}
-// HasAsciidoctor returns whether Asciidoctor is installed on this computer.
-func HasAsciidoctor() bool {
- return getAsciidoctorExecPath() != ""
+// HasAsciidoc returns whether Asciidoc or Asciidoctor is installed on this computer.
+func HasAsciidoc() bool {
+ return (getAsciidoctorExecPath() != "" ||
+ getAsciidocExecPath() != "")
}
// getAsciidocContent calls asciidoctor or asciidoc as an external helper
// to convert AsciiDoc content to HTML.
func getAsciidocContent(ctx *RenderingContext) []byte {
- content := ctx.Content
- cleanContent := bytes.Replace(content, SummaryDivider, []byte(""), 1)
-
var isAsciidoctor bool
path := getAsciidoctorExecPath()
if path == "" {
@@ -609,7 +604,7 @@ func getAsciidocContent(ctx *RenderingContext) []byte {
if path == "" {
jww.ERROR.Println("asciidoctor / asciidoc not found in $PATH: Please install.\n",
" Leaving AsciiDoc content unrendered.")
- return content
+ return ctx.Content
}
} else {
isAsciidoctor = true
@@ -622,25 +617,7 @@ func getAsciidocContent(ctx *RenderingContext) []byte {
args = append(args, "--trace")
}
args = append(args, "-")
- cmd := exec.Command(path, args...)
- cmd.Stdin = bytes.NewReader(cleanContent)
- var out, cmderr bytes.Buffer
- cmd.Stdout = &out
- cmd.Stderr = &cmderr
- err := cmd.Run()
- // asciidoctor has exit code 0 even if there are errors in stderr
- // -> log stderr output regardless of state of err
- for _, item := range strings.Split(string(cmderr.Bytes()), "\n") {
- item := strings.TrimSpace(item)
- if item != "" {
- jww.ERROR.Println(strings.Replace(item, "<stdin>", ctx.DocumentName, 1))
- }
- }
- if err != nil {
- jww.ERROR.Printf("%s rendering %s: %v", path, ctx.DocumentName, err)
- }
-
- return normalizeExternalHelperLineFeeds(out.Bytes())
+ return externallyRenderContent(ctx, path, args)
}
// HasRst returns whether rst2html is installed on this computer.
@@ -673,40 +650,18 @@ func getPythonExecPath() string {
// 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.ERROR.Println("rst2html / rst2html.py not found in $PATH: Please install.\n",
" Leaving reStructuredText content unrendered.")
- return content
+ return ctx.Content
}
-
jww.INFO.Println("Rendering", ctx.DocumentName, "with", path, "...")
- cmd := exec.Command(python, path, "--leave-comments", "--initial-header-level=2")
- cmd.Stdin = bytes.NewReader(cleanContent)
- var out, cmderr bytes.Buffer
- cmd.Stdout = &out
- cmd.Stderr = &cmderr
- err := cmd.Run()
- // By default rst2html exits w/ non-zero exit code only if severe, i.e.
- // halting errors occurred. -> log stderr output regardless of state of err
- for _, item := range strings.Split(string(cmderr.Bytes()), "\n") {
- item := strings.TrimSpace(item)
- if item != "" {
- jww.ERROR.Println(strings.Replace(item, "<stdin>", ctx.DocumentName, 1))
- }
- }
- if err != nil {
- jww.ERROR.Printf("%s rendering %s: %v", path, ctx.DocumentName, err)
- }
-
- result := normalizeExternalHelperLineFeeds(out.Bytes())
-
+ args := []string{path, "--leave-comments", "--initial-header-level=2"}
+ result := externallyRenderContent(ctx, python, args)
// TODO(bep) check if rst2html has a body only option.
bodyStart := bytes.Index(result, []byte("<body>\n"))
if bodyStart < 0 {
@@ -724,9 +679,46 @@ func getRstContent(ctx *RenderingContext) []byte {
return result[bodyStart+7 : bodyEnd]
}
+// getPandocContent calls pandoc as an external helper to convert pandoc markdown to HTML.
+func getPandocContent(ctx *RenderingContext) []byte {
+ path, err := exec.LookPath("pandoc")
+ if err != nil {
+ jww.ERROR.Println("pandoc not found in $PATH: Please install.\n",
+ " Leaving pandoc content unrendered.")
+ return ctx.Content
+ }
+ args := []string{"--mathjax"}
+ return externallyRenderContent(ctx, path, args)
+}
+
func orgRender(ctx *RenderingContext, c ContentSpec) []byte {
content := ctx.Content
cleanContent := bytes.Replace(content, []byte("# more"), []byte(""), 1)
return goorgeous.Org(cleanContent,
c.getHTMLRenderer(blackfriday.HTML_TOC, ctx))
}
+
+func externallyRenderContent(ctx *RenderingContext, path string, args []string) []byte {
+ content := ctx.Content
+ cleanContent := bytes.Replace(content, SummaryDivider, []byte(""), 1)
+
+ cmd := exec.Command(path, args...)
+ cmd.Stdin = bytes.NewReader(cleanContent)
+ var out, cmderr bytes.Buffer
+ cmd.Stdout = &out
+ cmd.Stderr = &cmderr
+ err := cmd.Run()
+ // Most external helpers exit w/ non-zero exit code only if severe, i.e.
+ // halting errors occurred. -> log stderr output regardless of state of err
+ for _, item := range strings.Split(string(cmderr.Bytes()), "\n") {
+ item := strings.TrimSpace(item)
+ if item != "" {
+ jww.ERROR.Printf("%s: %s", ctx.DocumentName, item)
+ }
+ }
+ if err != nil {
+ jww.ERROR.Printf("%s rendering %s: %v", path, ctx.DocumentName, err)
+ }
+
+ return normalizeExternalHelperLineFeeds(out.Bytes())
+}
diff --git a/helpers/general.go b/helpers/general.go
index a064309d3..4517a3232 100644
--- a/helpers/general.go
+++ b/helpers/general.go
@@ -78,6 +78,8 @@ func GuessType(in string) string {
return "mmark"
case "rst":
return "rst"
+ case "pandoc", "pdc":
+ return "pandoc"
case "html", "htm":
return "html"
case "org":
diff --git a/helpers/general_test.go b/helpers/general_test.go
index 561f59522..2bca632e0 100644
--- a/helpers/general_test.go
+++ b/helpers/general_test.go
@@ -34,6 +34,8 @@ func TestGuessType(t *testing.T) {
{"adoc", "asciidoc"},
{"ad", "asciidoc"},
{"rst", "rst"},
+ {"pandoc", "pandoc"},
+ {"pdc", "pandoc"},
{"mmark", "mmark"},
{"html", "html"},
{"htm", "html"},