Repository: gohugoio/hugo (language: go)

Issue:
Remove Mmark
It has been marked for deprecation for a long time (ERROR mode) and has been deprecated and not maintained upstream for even longer.


Discussion / hints:

Fix patch:
diff --git a/commands/commands.go b/commands/commands.go
index 4153c3cdf2c..b6e8dd469d1 100644
--- a/commands/commands.go
+++ b/commands/commands.go
@@ -131,8 +131,7 @@ type hugoCmd struct {
 
 var _ cmder = (*nilCommand)(nil)
 
-type nilCommand struct {
-}
+type nilCommand struct{}
 
 func (c *nilCommand) getCommand() *cobra.Command {
 	return nil
@@ -281,7 +280,6 @@ func (cc *hugoBuilderCommon) handleCommonBuilderFlags(cmd *cobra.Command) {
 	cmd.PersistentFlags().SetAnnotation("source", cobra.BashCompSubdirsInDir, []string{})
 	cmd.PersistentFlags().StringVarP(&cc.environment, "environment", "e", "", "build environment")
 	cmd.PersistentFlags().StringP("themesDir", "", "", "filesystem path to themes directory")
-	cmd.PersistentFlags().BoolP("ignoreVendor", "", false, "ignores any _vendor directory")
 	cmd.PersistentFlags().StringP("ignoreVendorPaths", "", "", "ignores any _vendor for module paths matching the given Glob pattern")
 }
 
diff --git a/commands/convert.go b/commands/convert.go
index e2bd4307fad..8c84423f587 100644
--- a/commands/convert.go
+++ b/commands/convert.go
@@ -142,7 +142,7 @@ func (cc *convertCmd) convertAndSavePage(p page.Page, site *hugolib.Site, target
 		return nil
 	}
 
-	errMsg := fmt.Errorf("Error processing file %q", p.Path())
+	errMsg := fmt.Errorf("Error processing file %q", p.File().Path())
 
 	site.Log.Infoln("Attempting to convert", p.File().Filename())
 
@@ -185,10 +185,10 @@ func (cc *convertCmd) convertAndSavePage(p page.Page, site *hugolib.Site, target
 	newFilename := p.File().Filename()
 
 	if cc.outputDir != "" {
-		contentDir := strings.TrimSuffix(newFilename, p.Path())
+		contentDir := strings.TrimSuffix(newFilename, p.File().Path())
 		contentDir = filepath.Base(contentDir)
 
-		newFilename = filepath.Join(cc.outputDir, contentDir, p.Path())
+		newFilename = filepath.Join(cc.outputDir, contentDir, p.File().Path())
 	}
 
 	fs := hugofs.Os
diff --git a/commands/hugo.go b/commands/hugo.go
index d442a62b504..b954bf13cbf 100644
--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -199,7 +199,6 @@ func initializeFlags(cmd *cobra.Command, cfg config.Provider) {
 		"forceSyncStatic",
 		"noTimes",
 		"noChmod",
-		"ignoreVendor",
 		"ignoreVendorPaths",
 		"templateMetrics",
 		"templateMetricsHints",
@@ -281,7 +280,6 @@ func isTerminal() bool {
 }
 
 func (c *commandeer) fullBuild(noBuildLock bool) error {
-
 	var (
 		g         errgroup.Group
 		langCount map[string]uint64
@@ -542,7 +540,6 @@ func (c *commandeer) build() error {
 }
 
 func (c *commandeer) serverBuild() error {
-
 	stopProfiling, err := c.initProfiling()
 	if err != nil {
 		return err
@@ -739,7 +736,6 @@ func (c *commandeer) handleBuildErr(err error, msg string) {
 }
 
 func (c *commandeer) rebuildSites(events []fsnotify.Event) error {
-
 	c.buildErr = nil
 	visited := c.visitedURLs.PeekAllSet()
 	if c.fastRenderMode {
diff --git a/commands/mod.go b/commands/mod.go
index eb6b1a44042..44a48bf7913 100644
--- a/commands/mod.go
+++ b/commands/mod.go
@@ -96,7 +96,7 @@ func (b *commandsBuilder) newModCmd() *modCmd {
 
 	const commonUsage = `
 Note that Hugo will always start out by resolving the components defined in the site
-configuration, provided by a _vendor directory (if no --ignoreVendor flag provided),
+configuration, provided by a _vendor directory (if no --ignoreVendorPaths flag provided),
 Go Modules, or a folder inside the themes directory, in that order.
 
 See https://gohugo.io/hugo-modules/ for more information.
diff --git a/go.mod b/go.mod
index a2cee7dba0b..f10b4a91e66 100644
--- a/go.mod
+++ b/go.mod
@@ -36,7 +36,6 @@ require (
 	github.com/kyokomi/emoji/v2 v2.2.8
 	github.com/magefile/mage v1.11.0
 	github.com/mattn/go-isatty v0.0.14
-	github.com/miekg/mmark v1.3.6
 	github.com/mitchellh/hashstructure v1.1.0
 	github.com/mitchellh/mapstructure v1.4.3
 	github.com/muesli/smartcrop v0.3.0
diff --git a/go.sum b/go.sum
index c0cac3effc6..fa4bc50416b 100644
--- a/go.sum
+++ b/go.sum
@@ -420,8 +420,6 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k
 github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-github.com/miekg/mmark v1.3.6 h1:t47x5vThdwgLJzofNsbsAl7gmIiJ7kbDQN5BxwBmwvY=
-github.com/miekg/mmark v1.3.6/go.mod h1:w7r9mkTvpS55jlfyn22qJ618itLryxXBhA7Jp3FIlkw=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
diff --git a/helpers/content.go b/helpers/content.go
index 2d26a0c4880..080e31909df 100644
--- a/helpers/content.go
+++ b/helpers/content.go
@@ -215,9 +215,6 @@ func (c *ContentSpec) ResolveMarkup(in string) string {
 	case "html", "htm":
 		return "html"
 	default:
-		if in == "mmark" {
-			Deprecated("Markup type mmark", "See https://gohugo.io//content-management/formats/#list-of-content-formats", true)
-		}
 		if conv := c.Converters.Get(in); conv != nil {
 			return conv.Name()
 		}
diff --git a/hugofs/files/classifier.go b/hugofs/files/classifier.go
index aab199850b2..09b239c21a9 100644
--- a/hugofs/files/classifier.go
+++ b/hugofs/files/classifier.go
@@ -40,7 +40,6 @@ var (
 		"mdown", "markdown", "md",
 		"asciidoc", "adoc", "ad",
 		"rest", "rst",
-		"mmark",
 		"org",
 		"pandoc", "pdc",
 	}
diff --git a/hugolib/config.go b/hugolib/config.go
index e79899b94c0..dffecd9a3df 100644
--- a/hugolib/config.go
+++ b/hugolib/config.go
@@ -53,7 +53,6 @@ var ErrNoConfigFile = errors.New("Unable to locate config file or config directo
 // LoadConfig loads Hugo configuration into a new Viper and then adds
 // a set of defaults.
 func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provider) error) (config.Provider, []string, error) {
-
 	if d.Environment == "" {
 		d.Environment = hugo.EnvironmentProduction
 	}
@@ -110,15 +109,8 @@ func LoadConfig(d ConfigSourceDescriptor, doWithConfig ...func(cfg config.Provid
 	}
 
 	// Config deprecations.
-	// We made this a Glob pattern in Hugo 0.75, we don't need both.
-	if l.cfg.GetBool("ignoreVendor") {
-		helpers.Deprecated("--ignoreVendor", "Use --ignoreVendorPaths \"**\"", true)
-		l.cfg.Set("ignoreVendorPaths", "**")
-	}
-
 	if l.cfg.GetString("markup.defaultMarkdownHandler") == "blackfriday" {
 		helpers.Deprecated("markup.defaultMarkdownHandler=blackfriday", "See https://gohugo.io//content-management/formats/#list-of-content-formats", false)
-
 	}
 
 	// Some settings are used before we're done collecting all settings,
diff --git a/hugolib/content_map_page.go b/hugolib/content_map_page.go
index 698c96cff7a..228564351e3 100644
--- a/hugolib/content_map_page.go
+++ b/hugolib/content_map_page.go
@@ -403,7 +403,7 @@ func (m *pageMap) assembleResources(s string, p *pageState, parentBucket *pagesM
 			if err != nil {
 				return true
 			}
-			rp.m.resourcePath = filepath.ToSlash(strings.TrimPrefix(rp.Path(), p.File().Dir()))
+			rp.m.resourcePath = filepath.ToSlash(strings.TrimPrefix(rp.File().Path(), p.File().Dir()))
 			r = rp
 
 		case files.ContentClassFile:
@@ -468,7 +468,6 @@ func (m *pageMap) assembleSections() error {
 
 		kind := page.KindSection
 		if s == "/" {
-
 			kind = page.KindHome
 		}
 
@@ -580,7 +579,7 @@ func (m *pageMap) attachPageToViews(s string, b *contentNode) {
 		w := getParamToLower(b.p, viewName.plural+"_weight")
 		weight, err := cast.ToIntE(w)
 		if err != nil {
-			m.s.Log.Errorf("Unable to convert taxonomy weight %#v to int for %q", w, b.p.Path())
+			m.s.Log.Errorf("Unable to convert taxonomy weight %#v to int for %q", w, b.p.Pathc())
 			// weight will equal zero, so let the flow continue
 		}
 
diff --git a/hugolib/page.go b/hugolib/page.go
index f35865cf0c9..d2d96204408 100644
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -145,7 +145,7 @@ func (p *pageState) Eq(other interface{}) bool {
 }
 
 func (p *pageState) GetIdentity() identity.Identity {
-	return identity.NewPathIdentity(files.ComponentFolderContent, filepath.FromSlash(p.Path()))
+	return identity.NewPathIdentity(files.ComponentFolderContent, filepath.FromSlash(p.Pathc()))
 }
 
 func (p *pageState) GitInfo() *gitmap.GitInfo {
@@ -895,8 +895,8 @@ func (p *pageState) pathOrTitle() string {
 		return p.File().Filename()
 	}
 
-	if p.Path() != "" {
-		return p.Path()
+	if p.Pathc() != "" {
+		return p.Pathc()
 	}
 
 	return p.Title()
diff --git a/hugolib/page__meta.go b/hugolib/page__meta.go
index 7bd9f6ac791..6a10b1d36a8 100644
--- a/hugolib/page__meta.go
+++ b/hugolib/page__meta.go
@@ -232,6 +232,24 @@ func (p *pageMeta) Params() maps.Params {
 }
 
 func (p *pageMeta) Path() string {
+	if !p.File().IsZero() {
+		const example = `
+  {{ $path := "" }}
+  {{ with .File }}
+	{{ $path = .Path }}
+  {{ else }}
+	{{ $path = .Path }}
+  {{ end }}
+`
+		helpers.Deprecated(".Path when the page is backed by a file", "We plan to use Path for a canonical source path and you probably want to check the source is a file. To get the current behaviour, you can use a construct simlar to the below:\n"+example, false)
+
+	}
+
+	return p.Pathc()
+}
+
+// This is just a bridge method, use Path in templates.
+func (p *pageMeta) Pathc() string {
 	if !p.File().IsZero() {
 		return p.File().Path()
 	}
@@ -759,7 +777,7 @@ func (p *pageMeta) newContentConverter(ps *pageState, markup string, renderingCo
 		converter.DocumentContext{
 			Document:        newPageForRenderHook(ps),
 			DocumentID:      id,
-			DocumentName:    p.Path(),
+			DocumentName:    p.File().Path(),
 			Filename:        filename,
 			ConfigOverrides: renderingConfigOverrides,
 		},
diff --git a/hugolib/site.go b/hugolib/site.go
index dce4b8d2548..bde8a2199a5 100644
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -689,12 +689,6 @@ func (s *SiteInfo) AllRegularPages() page.Pages {
 	return s.s.AllRegularPages()
 }
 
-func (s *SiteInfo) Permalinks() map[string]string {
-	// Remove in 0.61
-	helpers.Deprecated(".Site.Permalinks", "", true)
-	return s.permalinks
-}
-
 func (s *SiteInfo) LastChange() time.Time {
 	return s.s.lastmod
 }
@@ -825,7 +819,7 @@ func (s siteRefLinker) logNotFound(ref, what string, p page.Page, position text.
 	} else if p == nil {
 		s.errorLogger.Printf("[%s] REF_NOT_FOUND: Ref %q: %s", s.s.Lang(), ref, what)
 	} else {
-		s.errorLogger.Printf("[%s] REF_NOT_FOUND: Ref %q from page %q: %s", s.s.Lang(), ref, p.Path(), what)
+		s.errorLogger.Printf("[%s] REF_NOT_FOUND: Ref %q from page %q: %s", s.s.Lang(), ref, p.Pathc(), what)
 	}
 }
 
@@ -1402,7 +1396,6 @@ func (s *Site) getMenusFromConfig() navigation.Menus {
 					}
 					s.Log.Errorf("unable to process menus in site config\n")
 					s.Log.Errorln(err)
-
 				}
 
 				for _, entry := range m {
diff --git a/markup/markup.go b/markup/markup.go
index 31fa6b0f7be..287db7369ec 100644
--- a/markup/markup.go
+++ b/markup/markup.go
@@ -27,7 +27,6 @@ import (
 	"github.com/gohugoio/hugo/markup/asciidocext"
 	"github.com/gohugoio/hugo/markup/blackfriday"
 	"github.com/gohugoio/hugo/markup/converter"
-	"github.com/gohugoio/hugo/markup/mmark"
 	"github.com/gohugoio/hugo/markup/pandoc"
 	"github.com/gohugoio/hugo/markup/rst"
 )
@@ -73,9 +72,6 @@ func NewConverterProvider(cfg converter.ProviderConfig) (ConverterProvider, erro
 	if err := add(blackfriday.Provider); err != nil {
 		return nil, err
 	}
-	if err := add(mmark.Provider); err != nil {
-		return nil, err
-	}
 	if err := add(asciidocext.Provider, "ad", "adoc"); err != nil {
 		return nil, err
 	}
diff --git a/markup/mmark/convert.go b/markup/mmark/convert.go
deleted file mode 100644
index b4cc8b09618..00000000000
--- a/markup/mmark/convert.go
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2019 The Hugo Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Package mmark converts Markdown to HTML using MMark v1.
-package mmark
-
-import (
-	"github.com/gohugoio/hugo/identity"
-	"github.com/gohugoio/hugo/markup/blackfriday/blackfriday_config"
-	"github.com/gohugoio/hugo/markup/converter"
-	"github.com/miekg/mmark"
-)
-
-// Provider is the package entry point.
-var Provider converter.ProviderProvider = provider{}
-
-type provider struct {
-}
-
-func (p provider) New(cfg converter.ProviderConfig) (converter.Provider, error) {
-	defaultBlackFriday := cfg.MarkupConfig.BlackFriday
-	defaultExtensions := getMmarkExtensions(defaultBlackFriday)
-
-	return converter.NewProvider("mmark", func(ctx converter.DocumentContext) (converter.Converter, error) {
-		b := defaultBlackFriday
-		extensions := defaultExtensions
-
-		if ctx.ConfigOverrides != nil {
-			var err error
-			b, err = blackfriday_config.UpdateConfig(b, ctx.ConfigOverrides)
-			if err != nil {
-				return nil, err
-			}
-			extensions = getMmarkExtensions(b)
-		}
-
-		return &mmarkConverter{
-			ctx:        ctx,
-			b:          b,
-			extensions: extensions,
-			cfg:        cfg,
-		}, nil
-	}), nil
-}
-
-type mmarkConverter struct {
-	ctx        converter.DocumentContext
-	extensions int
-	b          blackfriday_config.Config
-	cfg        converter.ProviderConfig
-}
-
-func (c *mmarkConverter) Convert(ctx converter.RenderContext) (converter.Result, error) {
-	r := getHTMLRenderer(c.ctx, c.b, c.cfg)
-	return mmark.Parse(ctx.Src, r, c.extensions), nil
-}
-
-func (c *mmarkConverter) Supports(feature identity.Identity) bool {
-	return false
-}
-
-func getHTMLRenderer(
-	ctx converter.DocumentContext,
-	cfg blackfriday_config.Config,
-	pcfg converter.ProviderConfig) mmark.Renderer {
-	var (
-		flags      int
-		documentID string
-	)
-
-	documentID = ctx.DocumentID
-
-	renderParameters := mmark.HtmlRendererParameters{
-		FootnoteAnchorPrefix:       cfg.FootnoteAnchorPrefix,
-		FootnoteReturnLinkContents: cfg.FootnoteReturnLinkContents,
-	}
-
-	if documentID != "" && !cfg.PlainIDAnchors {
-		renderParameters.FootnoteAnchorPrefix = documentID + ":" + renderParameters.FootnoteAnchorPrefix
-	}
-
-	htmlFlags := flags
-	htmlFlags |= mmark.HTML_FOOTNOTE_RETURN_LINKS
-
-	return &mmarkRenderer{
-		BlackfridayConfig: cfg,
-		Config:            pcfg,
-		Renderer:          mmark.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters),
-	}
-}
-
-func getMmarkExtensions(cfg blackfriday_config.Config) int {
-	flags := 0
-	flags |= mmark.EXTENSION_TABLES
-	flags |= mmark.EXTENSION_FENCED_CODE
-	flags |= mmark.EXTENSION_AUTOLINK
-	flags |= mmark.EXTENSION_SPACE_HEADERS
-	flags |= mmark.EXTENSION_CITATION
-	flags |= mmark.EXTENSION_TITLEBLOCK_TOML
-	flags |= mmark.EXTENSION_HEADER_IDS
-	flags |= mmark.EXTENSION_AUTO_HEADER_IDS
-	flags |= mmark.EXTENSION_UNIQUE_HEADER_IDS
-	flags |= mmark.EXTENSION_FOOTNOTES
-	flags |= mmark.EXTENSION_SHORT_REF
-	flags |= mmark.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK
-	flags |= mmark.EXTENSION_INCLUDE
-
-	for _, extension := range cfg.Extensions {
-		if flag, ok := mmarkExtensionMap[extension]; ok {
-			flags |= flag
-		}
-	}
-	return flags
-}
-
-var mmarkExtensionMap = map[string]int{
-	"tables":                 mmark.EXTENSION_TABLES,
-	"fencedCode":             mmark.EXTENSION_FENCED_CODE,
-	"autolink":               mmark.EXTENSION_AUTOLINK,
-	"laxHtmlBlocks":          mmark.EXTENSION_LAX_HTML_BLOCKS,
-	"spaceHeaders":           mmark.EXTENSION_SPACE_HEADERS,
-	"hardLineBreak":          mmark.EXTENSION_HARD_LINE_BREAK,
-	"footnotes":              mmark.EXTENSION_FOOTNOTES,
-	"noEmptyLineBeforeBlock": mmark.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK,
-	"headerIds":              mmark.EXTENSION_HEADER_IDS,
-	"autoHeaderIds":          mmark.EXTENSION_AUTO_HEADER_IDS,
-}
diff --git a/markup/mmark/renderer.go b/markup/mmark/renderer.go
deleted file mode 100644
index 6cb7f105e4d..00000000000
--- a/markup/mmark/renderer.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2019 The Hugo Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package mmark
-
-import (
-	"bytes"
-	"strings"
-
-	"github.com/gohugoio/hugo/markup/blackfriday/blackfriday_config"
-	"github.com/gohugoio/hugo/markup/converter"
-	"github.com/miekg/mmark"
-)
-
-// hugoHTMLRenderer wraps a blackfriday.Renderer, typically a blackfriday.Html
-// adding some custom behaviour.
-type mmarkRenderer struct {
-	Config            converter.ProviderConfig
-	BlackfridayConfig blackfriday_config.Config
-	mmark.Renderer
-}
-
-// BlockCode renders a given text as a block of code.
-func (r *mmarkRenderer) BlockCode(out *bytes.Buffer, text []byte, lang string, caption []byte, subfigure bool, callouts bool) {
-	if r.Config.MarkupConfig.Highlight.CodeFences {
-		str := strings.Trim(string(text), "\n\r")
-		highlighted, _ := r.Config.Highlight(str, lang, "")
-		out.WriteString(highlighted)
-	} else {
-		r.Renderer.BlockCode(out, text, lang, caption, subfigure, callouts)
-	}
-}
diff --git a/modules/client.go b/modules/client.go
index 5b61e564432..17e149ecfb8 100644
--- a/modules/client.go
+++ b/modules/client.go
@@ -191,7 +191,7 @@ func (c *Client) Tidy() error {
 //
 // We, by default, use the /_vendor folder first, if found. To disable,
 // run with
-//    hugo --ignoreVendor
+//    hugo --ignoreVendorPaths=".*"
 //
 // Given a module tree, Hugo will pick the first module for a given path,
 // meaning that if the top-level module is vendored, that will be the full
diff --git a/resources/page/page.go b/resources/page/page.go
index 0b402c4e78f..f23069a68de 100644
--- a/resources/page/page.go
+++ b/resources/page/page.go
@@ -180,6 +180,9 @@ type PageMetaProvider interface {
 	// to the source of this Page. It will be relative to any content root.
 	Path() string
 
+	// This is just a temporary bridge method. Use Path in templates.
+	Pathc() string
+
 	// The slug, typically defined in front matter.
 	Slug() string
 
@@ -392,5 +395,4 @@ type DeprecatedWarningPageMethods1 interface {
 
 // Move here to trigger ERROR instead of WARNING.
 // TODO(bep) create wrappers and put into the Page once it has some methods.
-type DeprecatedErrorPageMethods interface {
-}
+type DeprecatedErrorPageMethods interface{}
diff --git a/resources/page/page_generate/generate_page_wrappers.go b/resources/page/page_generate/generate_page_wrappers.go
index 17346ec12c4..ae05ad5c2ee 100644
--- a/resources/page/page_generate/generate_page_wrappers.go
+++ b/resources/page/page_generate/generate_page_wrappers.go
@@ -26,6 +26,7 @@ import (
 
 	"github.com/gohugoio/hugo/codegen"
 	"github.com/gohugoio/hugo/resources/page"
+	"github.com/gohugoio/hugo/resources/resource"
 	"github.com/gohugoio/hugo/source"
 )
 
@@ -88,6 +89,8 @@ func generateMarshalJSON(c *codegen.Inspector) error {
 		// Leave this out for now. We need to revisit the author issue.
 		reflect.TypeOf((*page.AuthorProvider)(nil)).Elem(),
 
+		reflect.TypeOf((*resource.ErrProvider)(nil)).Elem(),
+
 		// navigation.PageMenus
 
 		// Prevent loops.
@@ -163,7 +166,7 @@ func generateDeprecatedWrappers(c *codegen.Inspector) error {
 			}
 		}
 
-		return fmt.Sprintf("helpers.Deprecated(%q, %q, false)", "Page."+name, alternative)
+		return fmt.Sprintf("helpers.Deprecated(%q, %q, true)", "Page."+name, alternative)
 	}
 
 	var buff bytes.Buffer
@@ -214,7 +217,9 @@ func generateFileIsZeroWrappers(c *codegen.Inspector) error {
 	warning := func(name string, tp reflect.Type) string {
 		msg := fmt.Sprintf(".File.%s on zero object. Wrap it in if or with: {{ with .File }}{{ .%s }}{{ end }}", name, name)
 
-		return fmt.Sprintf("z.log.Println(%q)", msg)
+		// We made this a Warning in 0.92.0.
+		// When we remove this construct in 0.93.0, people will get a nil pointer.
+		return fmt.Sprintf("z.log.Warnln(%q)", msg)
 	}
 
 	var buff bytes.Buffer
diff --git a/resources/page/page_marshaljson.autogen.go b/resources/page/page_marshaljson.autogen.go
index 2286f1e633f..6cfa411e21a 100644
--- a/resources/page/page_marshaljson.autogen.go
+++ b/resources/page/page_marshaljson.autogen.go
@@ -17,6 +17,9 @@ package page
 
 import (
 	"encoding/json"
+	"html/template"
+	"time"
+
 	"github.com/bep/gitmap"
 	"github.com/gohugoio/hugo/common/maps"
 	"github.com/gohugoio/hugo/config"
@@ -26,8 +29,6 @@ import (
 	"github.com/gohugoio/hugo/media"
 	"github.com/gohugoio/hugo/navigation"
 	"github.com/gohugoio/hugo/source"
-	"html/template"
-	"time"
 )
 
 func MarshalPageToJSON(p Page) ([]byte, error) {
@@ -68,7 +69,7 @@ func MarshalPageToJSON(p Page) ([]byte, error) {
 	linkTitle := p.LinkTitle()
 	isNode := p.IsNode()
 	isPage := p.IsPage()
-	path := p.Path()
+	path := p.Pathc()
 	slug := p.Slug()
 	lang := p.Lang()
 	isSection := p.IsSection()
diff --git a/resources/page/page_matcher.go b/resources/page/page_matcher.go
index 8e81f810d84..0c4c2d0e29e 100644
--- a/resources/page/page_matcher.go
+++ b/resources/page/page_matcher.go
@@ -59,7 +59,7 @@ func (m PageMatcher) Matches(p Page) bool {
 	if m.Path != "" {
 		g, err := glob.GetGlob(m.Path)
 		// TODO(bep) Path() vs filepath vs leading slash.
-		p := strings.ToLower(filepath.ToSlash(p.Path()))
+		p := strings.ToLower(filepath.ToSlash(p.Pathc()))
 		if !(strings.HasPrefix(p, "/")) {
 			p = "/" + p
 		}
@@ -104,7 +104,6 @@ func DecodeCascade(in interface{}) (map[PageMatcher]maps.Params, error) {
 	}
 
 	return cascade, nil
-
 }
 
 // DecodePageMatcher decodes m into v.
diff --git a/resources/page/page_nop.go b/resources/page/page_nop.go
index 4f91883a0b9..011fabfc05c 100644
--- a/resources/page/page_nop.go
+++ b/resources/page/page_nop.go
@@ -338,6 +338,10 @@ func (p *nopPage) Path() string {
 	return ""
 }
 
+func (p *nopPage) Pathc() string {
+	return ""
+}
+
 func (p *nopPage) Permalink() string {
 	return ""
 }
diff --git a/resources/page/page_wrappers.autogen.go b/resources/page/page_wrappers.autogen.go
index 53f0c09d298..2bdd5112180 100644
--- a/resources/page/page_wrappers.autogen.go
+++ b/resources/page/page_wrappers.autogen.go
@@ -32,66 +32,66 @@ type pageDeprecated struct {
 }
 
 func (p *pageDeprecated) Filename() string {
-	helpers.Deprecated("Page.Filename", "Use .File.Filename", false)
+	helpers.Deprecated("Page.Filename", "Use .File.Filename", true)
 	return p.p.Filename()
 }
 func (p *pageDeprecated) Dir() string {
-	helpers.Deprecated("Page.Dir", "Use .File.Dir", false)
+	helpers.Deprecated("Page.Dir", "Use .File.Dir", true)
 	return p.p.Dir()
 }
 func (p *pageDeprecated) IsDraft() bool {
-	helpers.Deprecated("Page.IsDraft", "Use .Draft.", false)
+	helpers.Deprecated("Page.IsDraft", "Use .Draft.", true)
 	return p.p.IsDraft()
 }
 func (p *pageDeprecated) Extension() string {
-	helpers.Deprecated("Page.Extension", "Use .File.Extension", false)
+	helpers.Deprecated("Page.Extension", "Use .File.Extension", true)
 	return p.p.Extension()
 }
 func (p *pageDeprecated) Hugo() hugo.Info {
-	helpers.Deprecated("Page.Hugo", "Use the global hugo function.", false)
+	helpers.Deprecated("Page.Hugo", "Use the global hugo function.", true)
 	return p.p.Hugo()
 }
 func (p *pageDeprecated) Ext() string {
-	helpers.Deprecated("Page.Ext", "Use .File.Ext", false)
+	helpers.Deprecated("Page.Ext", "Use .File.Ext", true)
 	return p.p.Ext()
 }
 func (p *pageDeprecated) LanguagePrefix() string {
-	helpers.Deprecated("Page.LanguagePrefix", "Use .Site.LanguagePrefix.", false)
+	helpers.Deprecated("Page.LanguagePrefix", "Use .Site.LanguagePrefix.", true)
 	return p.p.LanguagePrefix()
 }
 func (p *pageDeprecated) GetParam(arg0 string) interface{} {
-	helpers.Deprecated("Page.GetParam", "Use .Param or .Params.myParam.", false)
+	helpers.Deprecated("Page.GetParam", "Use .Param or .Params.myParam.", true)
 	return p.p.GetParam(arg0)
 }
 func (p *pageDeprecated) LogicalName() string {
-	helpers.Deprecated("Page.LogicalName", "Use .File.LogicalName", false)
+	helpers.Deprecated("Page.LogicalName", "Use .File.LogicalName", true)
 	return p.p.LogicalName()
 }
 func (p *pageDeprecated) BaseFileName() string {
-	helpers.Deprecated("Page.BaseFileName", "Use .File.BaseFileName", false)
+	helpers.Deprecated("Page.BaseFileName", "Use .File.BaseFileName", true)
 	return p.p.BaseFileName()
 }
 func (p *pageDeprecated) RSSLink() template.URL {
-	helpers.Deprecated("Page.RSSLink", "Use the Output Format's link, e.g. something like:\n    {{ with .OutputFormats.Get \"RSS\" }}{{ .RelPermalink }}{{ end }}", false)
+	helpers.Deprecated("Page.RSSLink", "Use the Output Format's link, e.g. something like:\n    {{ with .OutputFormats.Get \"RSS\" }}{{ .RelPermalink }}{{ end }}", true)
 	return p.p.RSSLink()
 }
 func (p *pageDeprecated) TranslationBaseName() string {
-	helpers.Deprecated("Page.TranslationBaseName", "Use .File.TranslationBaseName", false)
+	helpers.Deprecated("Page.TranslationBaseName", "Use .File.TranslationBaseName", true)
 	return p.p.TranslationBaseName()
 }
 func (p *pageDeprecated) URL() string {
-	helpers.Deprecated("Page.URL", "Use .Permalink or .RelPermalink. If what you want is the front matter URL value, use .Params.url", false)
+	helpers.Deprecated("Page.URL", "Use .Permalink or .RelPermalink. If what you want is the front matter URL value, use .Params.url", true)
 	return p.p.URL()
 }
 func (p *pageDeprecated) ContentBaseName() string {
-	helpers.Deprecated("Page.ContentBaseName", "Use .File.ContentBaseName", false)
+	helpers.Deprecated("Page.ContentBaseName", "Use .File.ContentBaseName", true)
 	return p.p.ContentBaseName()
 }
 func (p *pageDeprecated) UniqueID() string {
-	helpers.Deprecated("Page.UniqueID", "Use .File.UniqueID", false)
+	helpers.Deprecated("Page.UniqueID", "Use .File.UniqueID", true)
 	return p.p.UniqueID()
 }
 func (p *pageDeprecated) FileInfo() hugofs.FileMetaInfo {
-	helpers.Deprecated("Page.FileInfo", "Use .File.FileInfo", false)
+	helpers.Deprecated("Page.FileInfo", "Use .File.FileInfo", true)
 	return p.p.FileInfo()
 }
diff --git a/resources/page/zero_file.autogen.go b/resources/page/zero_file.autogen.go
index e4718a70051..72d98998ec2 100644
--- a/resources/page/zero_file.autogen.go
+++ b/resources/page/zero_file.autogen.go
@@ -35,54 +35,54 @@ func (zeroFile) IsZero() bool {
 }
 
 func (z zeroFile) Path() (o0 string) {
-	z.log.Println(".File.Path on zero object. Wrap it in if or with: {{ with .File }}{{ .Path }}{{ end }}")
+	z.log.Warnln(".File.Path on zero object. Wrap it in if or with: {{ with .File }}{{ .Path }}{{ end }}")
 	return
 }
 func (z zeroFile) Section() (o0 string) {
-	z.log.Println(".File.Section on zero object. Wrap it in if or with: {{ with .File }}{{ .Section }}{{ end }}")
+	z.log.Warnln(".File.Section on zero object. Wrap it in if or with: {{ with .File }}{{ .Section }}{{ end }}")
 	return
 }
 func (z zeroFile) Lang() (o0 string) {
-	z.log.Println(".File.Lang on zero object. Wrap it in if or with: {{ with .File }}{{ .Lang }}{{ end }}")
+	z.log.Warnln(".File.Lang on zero object. Wrap it in if or with: {{ with .File }}{{ .Lang }}{{ end }}")
 	return
 }
 func (z zeroFile) Filename() (o0 string) {
-	z.log.Println(".File.Filename on zero object. Wrap it in if or with: {{ with .File }}{{ .Filename }}{{ end }}")
+	z.log.Warnln(".File.Filename on zero object. Wrap it in if or with: {{ with .File }}{{ .Filename }}{{ end }}")
 	return
 }
 func (z zeroFile) Dir() (o0 string) {
-	z.log.Println(".File.Dir on zero object. Wrap it in if or with: {{ with .File }}{{ .Dir }}{{ end }}")
+	z.log.Warnln(".File.Dir on zero object. Wrap it in if or with: {{ with .File }}{{ .Dir }}{{ end }}")
 	return
 }
 func (z zeroFile) Extension() (o0 string) {
-	z.log.Println(".File.Extension on zero object. Wrap it in if or with: {{ with .File }}{{ .Extension }}{{ end }}")
+	z.log.Warnln(".File.Extension on zero object. Wrap it in if or with: {{ with .File }}{{ .Extension }}{{ end }}")
 	return
 }
 func (z zeroFile) Ext() (o0 string) {
-	z.log.Println(".File.Ext on zero object. Wrap it in if or with: {{ with .File }}{{ .Ext }}{{ end }}")
+	z.log.Warnln(".File.Ext on zero object. Wrap it in if or with: {{ with .File }}{{ .Ext }}{{ end }}")
 	return
 }
 func (z zeroFile) LogicalName() (o0 string) {
-	z.log.Println(".File.LogicalName on zero object. Wrap it in if or with: {{ with .File }}{{ .LogicalName }}{{ end }}")
+	z.log.Warnln(".File.LogicalName on zero object. Wrap it in if or with: {{ with .File }}{{ .LogicalName }}{{ end }}")
 	return
 }
 func (z zeroFile) BaseFileName() (o0 string) {
-	z.log.Println(".File.BaseFileName on zero object. Wrap it in if or with: {{ with .File }}{{ .BaseFileName }}{{ end }}")
+	z.log.Warnln(".File.BaseFileName on zero object. Wrap it in if or with: {{ with .File }}{{ .BaseFileName }}{{ end }}")
 	return
 }
 func (z zeroFile) TranslationBaseName() (o0 string) {
-	z.log.Println(".File.TranslationBaseName on zero object. Wrap it in if or with: {{ with .File }}{{ .TranslationBaseName }}{{ end }}")
+	z.log.Warnln(".File.TranslationBaseName on zero object. Wrap it in if or with: {{ with .File }}{{ .TranslationBaseName }}{{ end }}")
 	return
 }
 func (z zeroFile) ContentBaseName() (o0 string) {
-	z.log.Println(".File.ContentBaseName on zero object. Wrap it in if or with: {{ with .File }}{{ .ContentBaseName }}{{ end }}")
+	z.log.Warnln(".File.ContentBaseName on zero object. Wrap it in if or with: {{ with .File }}{{ .ContentBaseName }}{{ end }}")
 	return
 }
 func (z zeroFile) UniqueID() (o0 string) {
-	z.log.Println(".File.UniqueID on zero object. Wrap it in if or with: {{ with .File }}{{ .UniqueID }}{{ end }}")
+	z.log.Warnln(".File.UniqueID on zero object. Wrap it in if or with: {{ with .File }}{{ .UniqueID }}{{ end }}")
 	return
 }
 func (z zeroFile) FileInfo() (o0 hugofs.FileMetaInfo) {
-	z.log.Println(".File.FileInfo on zero object. Wrap it in if or with: {{ with .File }}{{ .FileInfo }}{{ end }}")
+	z.log.Warnln(".File.FileInfo on zero object. Wrap it in if or with: {{ with .File }}{{ .FileInfo }}{{ end }}")
 	return
 }
diff --git a/resources/resource/resourcetypes.go b/resources/resource/resourcetypes.go
index 788cdb86abb..c96f3d49523 100644
--- a/resources/resource/resourcetypes.go
+++ b/resources/resource/resourcetypes.go
@@ -37,6 +37,11 @@ type OriginProvider interface {
 	GetFieldString(pattern string) (string, bool)
 }
 
+// ErrProvider provides an Err.
+type ErrProvider interface {
+	Err() error
+}
+
 // Resource represents a linkable resource, i.e. a content page, image etc.
 type Resource interface {
 	ResourceTypeProvider
@@ -45,7 +50,7 @@ type Resource interface {
 	ResourceMetaProvider
 	ResourceParamsProvider
 	ResourceDataProvider
-	Err() error
+	ErrProvider
 }
 
 // Image represents an image resource.


Test patch:
diff --git a/commands/commands_test.go b/commands/commands_test.go
index ef61dc7a5e7..9966cd93787 100644
--- a/commands/commands_test.go
+++ b/commands/commands_test.go
@@ -162,16 +162,6 @@ func TestFlags(t *testing.T) {
 		args  []string
 		check func(c *qt.C, cmd *serverCmd)
 	}{
-		{
-			// https://github.com/gohugoio/hugo/issues/7642
-			name: "ignoreVendor as bool",
-			args: []string{"server", "--ignoreVendor"},
-			check: func(c *qt.C, cmd *serverCmd) {
-				cfg := config.New()
-				cmd.flagsToConfig(cfg)
-				c.Assert(cfg.Get("ignoreVendor"), qt.Equals, true)
-			},
-		},
 		{
 			// https://github.com/gohugoio/hugo/issues/7642
 			name: "ignoreVendorPaths",
diff --git a/helpers/general_test.go b/helpers/general_test.go
index db8cb30a849..7fe00c51a63 100644
--- a/helpers/general_test.go
+++ b/helpers/general_test.go
@@ -46,7 +46,6 @@ func TestResolveMarkup(t *testing.T) {
 		{"rst", "rst"},
 		{"pandoc", "pandoc"},
 		{"pdc", "pandoc"},
-		{"mmark", "mmark"},
 		{"html", "html"},
 		{"htm", "html"},
 		{"org", "org"},
diff --git a/hugolib/page_test.go b/hugolib/page_test.go
index c59177652cc..7d55787c8e3 100644
--- a/hugolib/page_test.go
+++ b/hugolib/page_test.go
@@ -375,7 +375,6 @@ func testAllMarkdownEnginesForPages(t *testing.T,
 		shouldExecute func() bool
 	}{
 		{"md", func() bool { return true }},
-		{"mmark", func() bool { return true }},
 		{"ad", func() bool { return asciidocext.Supports() }},
 		{"rst", func() bool { return rst.Supports() }},
 	}
diff --git a/hugolib/shortcode_test.go b/hugolib/shortcode_test.go
index 6316afc98e6..9fc9a9675fb 100644
--- a/hugolib/shortcode_test.go
+++ b/hugolib/shortcode_test.go
@@ -533,17 +533,7 @@ e`,
 			filepath.FromSlash("public/sect/doc8/index.html"),
 			"<div class=\"document\">\n\n\n<p><strong>Shortcodes:</strong> <em>b: b c: c</em></p>\n</div>",
 		},
-		{
-			"sect/doc9.mmark", `
----
-menu:
-  main:
-    parent: 'parent'
----
-**Shortcodes:** *b: {{< b >}} c: {{% c %}}*`,
-			filepath.FromSlash("public/sect/doc9/index.html"),
-			"<p><strong>Shortcodes:</strong> <em>b: b c: c</em></p>\n",
-		},
+
 		// Issue #1229: Menus not available in shortcode.
 		{
 			"sect/doc10.md", `---
@@ -562,6 +552,9 @@ tags:
 			"sect/doc11.md", `---
 tags:
 - Bugs
+menu:
+  main:
+    parent: 'parent'
 ---
 **Tags:** {{< tags >}}`,
 			filepath.FromSlash("public/sect/doc11/index.html"),
@@ -1390,7 +1383,7 @@ outputs: ["html", "css", "csv", "json"]
 
 		b.Build(BuildCfg{})
 
-		//helpers.PrintFs(b.Fs.Destination, "public", os.Stdout)
+		// helpers.PrintFs(b.Fs.Destination, "public", os.Stdout)
 
 		for i := 0; i < numPages; i++ {
 			b.AssertFileContent(fmt.Sprintf("public/page%d/index.html", i), "Short-HTML")
diff --git a/hugolib/site_test.go b/hugolib/site_test.go
index e259911643f..73cea855a5f 100644
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -957,7 +957,7 @@ func TestRefLinking(t *testing.T) {
 func checkLinkCase(site *Site, link string, currentPage page.Page, relative bool, outputFormat string, expected string, t *testing.T, i int) {
 	t.Helper()
 	if out, err := site.refLink(link, currentPage, relative, outputFormat); err != nil || out != expected {
-		t.Fatalf("[%d] Expected %q from %q to resolve to %q, got %q - error: %s", i, link, currentPage.Path(), expected, out, err)
+		t.Fatalf("[%d] Expected %q from %q to resolve to %q, got %q - error: %s", i, link, currentPage.Pathc(), expected, out, err)
 	}
 }
 
diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go
index 72e22ed1d85..105654c4f30 100644
--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -800,7 +800,6 @@ func (s *sitesBuilder) NpmInstall() hexec.Runner {
 	command, err := ex.New("npm", "install")
 	s.Assert(err, qt.IsNil)
 	return command
-
 }
 
 func newTestHelper(cfg config.Provider, fs *hugofs.Fs, t testing.TB) testHelper {
@@ -998,7 +997,7 @@ func content(c resource.ContentProvider) string {
 func pagesToString(pages ...page.Page) string {
 	var paths []string
 	for _, p := range pages {
-		paths = append(paths, p.Path())
+		paths = append(paths, p.Pathc())
 	}
 	sort.Strings(paths)
 	return strings.Join(paths, "|")
@@ -1020,7 +1019,7 @@ func dumpPages(pages ...page.Page) {
 	fmt.Println("---------")
 	for _, p := range pages {
 		fmt.Printf("Kind: %s Title: %-10s RelPermalink: %-10s Path: %-10s sections: %s Lang: %s\n",
-			p.Kind(), p.Title(), p.RelPermalink(), p.Path(), p.SectionsPath(), p.Lang())
+			p.Kind(), p.Title(), p.RelPermalink(), p.Pathc(), p.SectionsPath(), p.Lang())
 	}
 }
 
@@ -1028,7 +1027,7 @@ func dumpSPages(pages ...*pageState) {
 	for i, p := range pages {
 		fmt.Printf("%d: Kind: %s Title: %-10s RelPermalink: %-10s Path: %-10s sections: %s\n",
 			i+1,
-			p.Kind(), p.Title(), p.RelPermalink(), p.Path(), p.SectionsPath())
+			p.Kind(), p.Title(), p.RelPermalink(), p.Pathc(), p.SectionsPath())
 	}
 }
 
diff --git a/markup/markup_test.go b/markup/markup_test.go
index 71d39075dc7..c0cc5ba8bc5 100644
--- a/markup/markup_test.go
+++ b/markup/markup_test.go
@@ -39,7 +39,6 @@ func TestConverterRegistry(t *testing.T) {
 	c.Assert(r.Get("markdown").Name(), qt.Equals, "goldmark")
 
 	checkName("goldmark")
-	checkName("mmark")
 	checkName("asciidocext")
 	checkName("rst")
 	checkName("pandoc")
diff --git a/markup/mmark/convert_test.go b/markup/mmark/convert_test.go
deleted file mode 100644
index 414e023ab0b..00000000000
--- a/markup/mmark/convert_test.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2019 The Hugo Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package mmark
-
-import (
-	"testing"
-
-	"github.com/gohugoio/hugo/config"
-
-	"github.com/gohugoio/hugo/common/loggers"
-
-	qt "github.com/frankban/quicktest"
-	"github.com/gohugoio/hugo/markup/blackfriday/blackfriday_config"
-	"github.com/gohugoio/hugo/markup/converter"
-	"github.com/miekg/mmark"
-)
-
-func TestGetMmarkExtensions(t *testing.T) {
-	b := blackfriday_config.Default
-
-	// TODO: This is doing the same just with different marks...
-	type data struct {
-		testFlag int
-	}
-
-	b.Extensions = []string{"tables"}
-	b.ExtensionsMask = []string{""}
-	allExtensions := []data{
-		{mmark.EXTENSION_TABLES},
-		{mmark.EXTENSION_FENCED_CODE},
-		{mmark.EXTENSION_AUTOLINK},
-		{mmark.EXTENSION_SPACE_HEADERS},
-		{mmark.EXTENSION_CITATION},
-		{mmark.EXTENSION_TITLEBLOCK_TOML},
-		{mmark.EXTENSION_HEADER_IDS},
-		{mmark.EXTENSION_AUTO_HEADER_IDS},
-		{mmark.EXTENSION_UNIQUE_HEADER_IDS},
-		{mmark.EXTENSION_FOOTNOTES},
-		{mmark.EXTENSION_SHORT_REF},
-		{mmark.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK},
-		{mmark.EXTENSION_INCLUDE},
-	}
-
-	actualFlags := getMmarkExtensions(b)
-	for _, e := range allExtensions {
-		if actualFlags&e.testFlag != e.testFlag {
-			t.Errorf("Flag %v was not found in the list of extensions.", e)
-		}
-	}
-}
-
-func TestConvert(t *testing.T) {
-	c := qt.New(t)
-	p, err := Provider.New(converter.ProviderConfig{Cfg: config.New(), Logger: loggers.NewErrorLogger()})
-	c.Assert(err, qt.IsNil)
-	conv, err := p.New(converter.DocumentContext{})
-	c.Assert(err, qt.IsNil)
-	b, err := conv.Convert(converter.RenderContext{Src: []byte("testContent")})
-	c.Assert(err, qt.IsNil)
-	c.Assert(string(b.Bytes()), qt.Equals, "<p>testContent</p>\n")
-}
diff --git a/resources/page/testhelpers_test.go b/resources/page/testhelpers_test.go
index a21ab2ff30d..57077ecf871 100644
--- a/resources/page/testhelpers_test.go
+++ b/resources/page/testhelpers_test.go
@@ -414,6 +414,10 @@ func (p *testPage) Path() string {
 	return p.path
 }
 
+func (p *testPage) Pathc() string {
+	return p.path
+}
+
 func (p *testPage) Permalink() string {
 	panic("not implemented")
 }