Fix Asciidoctor args

* Fix Asciidoctor args

* Fix Asciidoctor args documentation

* Update AsciiDoc documentation

Co-authored-by: Derk Muenchhausen <derk@muenchhausen.de>

Fixes #7493
This commit is contained in:
Helder Pereira
2020-07-23 14:59:48 +01:00
committed by GitHub
parent a06c06a5c2
commit 45c665d396
4 changed files with 108 additions and 39 deletions

View File

@@ -14,23 +14,28 @@
// Package asciidoc_config holds asciidoc related configuration.
package asciidocext_config
// DefaultConfig holds the default asciidoc configuration.
// These values are asciidoctor cli defaults (see https://asciidoctor.org/docs/user-manual/)
var (
// Default holds Hugo's default asciidoc configuration.
Default = Config{
Backend: "html5",
DocType: "article",
Extensions: []string{},
Attributes: map[string]string{},
NoHeaderOrFooter: true,
SafeMode: "unsafe",
SectionNumbers: false,
Verbose: true,
Trace: false,
Verbose: false,
Trace: true,
FailureLevel: "fatal",
WorkingFolderCurrent: false,
}
// CliDefault holds Asciidoctor CLI defaults (see https://asciidoctor.org/docs/user-manual/)
CliDefault = Config{
Backend: "html5",
SafeMode: "unsafe",
FailureLevel: "fatal",
}
AllowedExtensions = map[string]bool{
"asciidoctor-html5s": true,
"asciidoctor-bibtex": true,
@@ -72,7 +77,6 @@ var (
// Config configures asciidoc.
type Config struct {
Backend string
DocType string
Extensions []string
Attributes map[string]string
NoHeaderOrFooter bool

View File

@@ -69,7 +69,6 @@ func (a *asciidocConverter) getAsciidocContent(src []byte, ctx converter.Documen
}
args := a.parseArgs(ctx)
args = append(args, "--trace")
args = append(args, "-")
a.cfg.Logger.INFO.Println("Rendering", ctx.DocumentName, "with", path, "using asciidoctor args", args, "...")
@@ -81,9 +80,7 @@ func (a *asciidocConverter) parseArgs(ctx converter.DocumentContext) []string {
var cfg = a.cfg.MarkupConfig.AsciidocExt
args := []string{}
if asciidocext_config.AllowedBackend[cfg.Backend] && cfg.Backend != asciidocext_config.Default.Backend {
args = append(args, "-b", cfg.Backend)
}
args = a.appendArg(args, "-b", cfg.Backend, asciidocext_config.CliDefault.Backend, asciidocext_config.AllowedBackend)
for _, extension := range cfg.Extensions {
if !asciidocext_config.AllowedExtensions[extension] {
@@ -147,29 +144,36 @@ func (a *asciidocConverter) parseArgs(ctx converter.DocumentContext) []string {
a.cfg.Logger.WARN.Println("asciidoctor parameter NoHeaderOrFooter is expected for correct html rendering")
}
if cfg.SectionNumbers != asciidocext_config.Default.SectionNumbers {
if cfg.SectionNumbers {
args = append(args, "--section-numbers")
}
if cfg.Verbose != asciidocext_config.Default.Verbose {
args = append(args, "-v")
if cfg.Verbose {
args = append(args, "--verbose")
}
if cfg.Trace != asciidocext_config.Default.Trace {
if cfg.Trace {
args = append(args, "--trace")
}
if asciidocext_config.AllowedFailureLevel[cfg.FailureLevel] && cfg.FailureLevel != asciidocext_config.Default.FailureLevel {
args = append(args, "--failure-level", cfg.FailureLevel)
}
args = a.appendArg(args, "--failure-level", cfg.FailureLevel, asciidocext_config.CliDefault.FailureLevel, asciidocext_config.AllowedFailureLevel)
if asciidocext_config.AllowedSafeMode[cfg.SafeMode] && cfg.SafeMode != asciidocext_config.Default.SafeMode {
args = append(args, "--safe-mode", cfg.SafeMode)
}
args = a.appendArg(args, "--safe-mode", cfg.SafeMode, asciidocext_config.CliDefault.SafeMode, asciidocext_config.AllowedSafeMode)
return args
}
func (a *asciidocConverter) appendArg(args []string, option, value, defaultValue string, allowedValues map[string]bool) []string {
if value != defaultValue {
if allowedValues[value] {
args = append(args, option, value)
} else {
a.cfg.Logger.ERROR.Println("Unsupported asciidoctor value `" + value + "` for option " + option + " was passed in and will be ignored.")
}
}
return args
}
func getAsciidoctorExecPath() string {
path, err := exec.LookPath("asciidoctor")
if err != nil {

View File

@@ -18,13 +18,12 @@
package asciidocext
import (
"github.com/gohugoio/hugo/markup/markup_config"
"path/filepath"
"strings"
"testing"
"github.com/gohugoio/hugo/common/loggers"
"github.com/gohugoio/hugo/markup/converter"
"github.com/gohugoio/hugo/markup/markup_config"
"github.com/spf13/viper"
qt "github.com/frankban/quicktest"
@@ -51,18 +50,21 @@ func TestAsciidoctorDefaultArgs(t *testing.T) {
c.Assert(ac, qt.Not(qt.IsNil))
args := ac.parseArgs(converter.DocumentContext{})
c.Assert(args, qt.Not(qt.IsNil))
c.Assert(strings.Join(args, " "), qt.Equals, "--no-header-footer")
expected := []string{"--no-header-footer", "--trace"}
c.Assert(args, qt.DeepEquals, expected)
}
func TestAsciidoctorDiagramArgs(t *testing.T) {
func TestAsciidoctorNonDefaultArgs(t *testing.T) {
c := qt.New(t)
cfg := viper.New()
mconf := markup_config.Default
mconf.AsciidocExt.NoHeaderOrFooter = true
mconf.AsciidocExt.Extensions = []string{"asciidoctor-html5s", "asciidoctor-diagram"}
mconf.AsciidocExt.Backend = "html5s"
mconf.AsciidocExt.Backend = "manpage"
mconf.AsciidocExt.NoHeaderOrFooter = false
mconf.AsciidocExt.SafeMode = "safe"
mconf.AsciidocExt.SectionNumbers = true
mconf.AsciidocExt.Verbose = true
mconf.AsciidocExt.Trace = false
mconf.AsciidocExt.FailureLevel = "warn"
p, err := Provider.New(
converter.ProviderConfig{
Cfg: cfg,
@@ -79,8 +81,65 @@ func TestAsciidoctorDiagramArgs(t *testing.T) {
c.Assert(ac, qt.Not(qt.IsNil))
args := ac.parseArgs(converter.DocumentContext{})
c.Assert(len(args), qt.Equals, 7)
c.Assert(strings.Join(args, " "), qt.Equals, "-b html5s -r asciidoctor-html5s -r asciidoctor-diagram --no-header-footer")
expected := []string{"-b", "manpage", "--section-numbers", "--verbose", "--failure-level", "warn", "--safe-mode", "safe"}
c.Assert(args, qt.DeepEquals, expected)
}
func TestAsciidoctorDisallowedArgs(t *testing.T) {
c := qt.New(t)
cfg := viper.New()
mconf := markup_config.Default
mconf.AsciidocExt.Backend = "disallowed-backend"
mconf.AsciidocExt.Extensions = []string{"disallowed-extention"}
mconf.AsciidocExt.Attributes = map[string]string{"outdir": "disallowed-attribute"}
mconf.AsciidocExt.SafeMode = "disallowed-safemode"
mconf.AsciidocExt.FailureLevel = "disallowed-failurelevel"
p, err := Provider.New(
converter.ProviderConfig{
Cfg: cfg,
MarkupConfig: mconf,
Logger: loggers.NewErrorLogger(),
},
)
c.Assert(err, qt.IsNil)
conv, err := p.New(converter.DocumentContext{})
c.Assert(err, qt.IsNil)
ac := conv.(*asciidocConverter)
c.Assert(ac, qt.Not(qt.IsNil))
args := ac.parseArgs(converter.DocumentContext{})
expected := []string{"--no-header-footer", "--trace"}
c.Assert(args, qt.DeepEquals, expected)
}
func TestAsciidoctorDiagramArgs(t *testing.T) {
c := qt.New(t)
cfg := viper.New()
mconf := markup_config.Default
mconf.AsciidocExt.NoHeaderOrFooter = true
mconf.AsciidocExt.Extensions = []string{"asciidoctor-html5s", "asciidoctor-diagram"}
mconf.AsciidocExt.Backend = "html5s"
mconf.AsciidocExt.Trace = false
p, err := Provider.New(
converter.ProviderConfig{
Cfg: cfg,
MarkupConfig: mconf,
Logger: loggers.NewErrorLogger(),
},
)
c.Assert(err, qt.IsNil)
conv, err := p.New(converter.DocumentContext{})
c.Assert(err, qt.IsNil)
ac := conv.(*asciidocConverter)
c.Assert(ac, qt.Not(qt.IsNil))
args := ac.parseArgs(converter.DocumentContext{})
expected := []string{"-b", "html5s", "-r", "asciidoctor-html5s", "-r", "asciidoctor-diagram", "--no-header-footer"}
c.Assert(args, qt.DeepEquals, expected)
}
func TestAsciidoctorWorkingFolderCurrent(t *testing.T) {
@@ -88,6 +147,7 @@ func TestAsciidoctorWorkingFolderCurrent(t *testing.T) {
cfg := viper.New()
mconf := markup_config.Default
mconf.AsciidocExt.WorkingFolderCurrent = true
mconf.AsciidocExt.Trace = false
p, err := Provider.New(
converter.ProviderConfig{
Cfg: cfg,
@@ -121,6 +181,7 @@ func TestAsciidoctorWorkingFolderCurrentAndExtensions(t *testing.T) {
mconf.AsciidocExt.Extensions = []string{"asciidoctor-html5s", "asciidoctor-diagram"}
mconf.AsciidocExt.Backend = "html5s"
mconf.AsciidocExt.WorkingFolderCurrent = true
mconf.AsciidocExt.Trace = false
p, err := Provider.New(
converter.ProviderConfig{
Cfg: cfg,
@@ -156,6 +217,7 @@ func TestAsciidoctorAttributes(t *testing.T) {
cfg := viper.New()
mconf := markup_config.Default
mconf.AsciidocExt.Attributes = map[string]string{"my-base-url": "https://gohugo.io/", "my-attribute-name": "my value"}
mconf.AsciidocExt.Trace = false
p, err := Provider.New(
converter.ProviderConfig{
Cfg: cfg,