mirror of
				https://github.com/gohugoio/hugo.git
				synced 2024-05-11 05:54:58 +00:00 
			
		
		
		
	This also speeds up situations where you only need the fragments/toc and not the rendered content, e.g. Related with fragments type indexing: ```bash name old time/op new time/op delta RelatedSite-10 12.3ms ± 2% 10.7ms ± 1% -12.95% (p=0.029 n=4+4) name old alloc/op new alloc/op delta RelatedSite-10 38.6MB ± 0% 38.2MB ± 0% -1.08% (p=0.029 n=4+4) name old allocs/op new allocs/op delta RelatedSite-10 117k ± 0% 115k ± 0% -1.36% (p=0.029 n=4+4) ``` Fixes #10750
		
			
				
	
	
		
			155 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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 converter
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
 | 
						|
	"github.com/gohugoio/hugo/common/hexec"
 | 
						|
	"github.com/gohugoio/hugo/common/loggers"
 | 
						|
	"github.com/gohugoio/hugo/config"
 | 
						|
	"github.com/gohugoio/hugo/identity"
 | 
						|
	"github.com/gohugoio/hugo/markup/converter/hooks"
 | 
						|
	"github.com/gohugoio/hugo/markup/highlight"
 | 
						|
	"github.com/gohugoio/hugo/markup/markup_config"
 | 
						|
	"github.com/gohugoio/hugo/markup/tableofcontents"
 | 
						|
	"github.com/spf13/afero"
 | 
						|
)
 | 
						|
 | 
						|
// ProviderConfig configures a new Provider.
 | 
						|
type ProviderConfig struct {
 | 
						|
	MarkupConfig markup_config.Config
 | 
						|
 | 
						|
	Cfg       config.Provider // Site config
 | 
						|
	ContentFs afero.Fs
 | 
						|
	Logger    loggers.Logger
 | 
						|
	Exec      *hexec.Exec
 | 
						|
	highlight.Highlighter
 | 
						|
}
 | 
						|
 | 
						|
// ProviderProvider creates converter providers.
 | 
						|
type ProviderProvider interface {
 | 
						|
	New(cfg ProviderConfig) (Provider, error)
 | 
						|
}
 | 
						|
 | 
						|
// Provider creates converters.
 | 
						|
type Provider interface {
 | 
						|
	New(ctx DocumentContext) (Converter, error)
 | 
						|
	Name() string
 | 
						|
}
 | 
						|
 | 
						|
// NewProvider creates a new Provider with the given name.
 | 
						|
func NewProvider(name string, create func(ctx DocumentContext) (Converter, error)) Provider {
 | 
						|
	return newConverter{
 | 
						|
		name:   name,
 | 
						|
		create: create,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type newConverter struct {
 | 
						|
	name   string
 | 
						|
	create func(ctx DocumentContext) (Converter, error)
 | 
						|
}
 | 
						|
 | 
						|
func (n newConverter) New(ctx DocumentContext) (Converter, error) {
 | 
						|
	return n.create(ctx)
 | 
						|
}
 | 
						|
 | 
						|
func (n newConverter) Name() string {
 | 
						|
	return n.name
 | 
						|
}
 | 
						|
 | 
						|
var NopConverter = new(nopConverter)
 | 
						|
 | 
						|
type nopConverter int
 | 
						|
 | 
						|
func (nopConverter) Convert(ctx RenderContext) (ResultRender, error) {
 | 
						|
	return &bytes.Buffer{}, nil
 | 
						|
}
 | 
						|
 | 
						|
func (nopConverter) Supports(feature identity.Identity) bool {
 | 
						|
	return false
 | 
						|
}
 | 
						|
 | 
						|
// Converter wraps the Convert method that converts some markup into
 | 
						|
// another format, e.g. Markdown to HTML.
 | 
						|
type Converter interface {
 | 
						|
	Convert(ctx RenderContext) (ResultRender, error)
 | 
						|
	Supports(feature identity.Identity) bool
 | 
						|
}
 | 
						|
 | 
						|
// ParseRenderer is an optional interface.
 | 
						|
// The Goldmark converter implements this, and this allows us
 | 
						|
// to extract the ToC without having to render the content.
 | 
						|
type ParseRenderer interface {
 | 
						|
	Parse(RenderContext) (ResultParse, error)
 | 
						|
	Render(RenderContext, any) (ResultRender, error)
 | 
						|
}
 | 
						|
 | 
						|
// ResultRender represents the minimum returned from Convert and Render.
 | 
						|
type ResultRender interface {
 | 
						|
	Bytes() []byte
 | 
						|
}
 | 
						|
 | 
						|
// ResultParse represents the minimum returned from Parse.
 | 
						|
type ResultParse interface {
 | 
						|
	Doc() any
 | 
						|
	TableOfContents() *tableofcontents.Fragments
 | 
						|
}
 | 
						|
 | 
						|
// DocumentInfo holds additional information provided by some converters.
 | 
						|
type DocumentInfo interface {
 | 
						|
	AnchorSuffix() string
 | 
						|
}
 | 
						|
 | 
						|
// TableOfContentsProvider provides the content as a ToC structure.
 | 
						|
type TableOfContentsProvider interface {
 | 
						|
	TableOfContents() *tableofcontents.Fragments
 | 
						|
}
 | 
						|
 | 
						|
// AnchorNameSanitizer tells how a converter sanitizes anchor names.
 | 
						|
type AnchorNameSanitizer interface {
 | 
						|
	SanitizeAnchorName(s string) string
 | 
						|
}
 | 
						|
 | 
						|
// Bytes holds a byte slice and implements the Result interface.
 | 
						|
type Bytes []byte
 | 
						|
 | 
						|
// Bytes returns itself
 | 
						|
func (b Bytes) Bytes() []byte {
 | 
						|
	return b
 | 
						|
}
 | 
						|
 | 
						|
// DocumentContext holds contextual information about the document to convert.
 | 
						|
type DocumentContext struct {
 | 
						|
	Document     any // May be nil. Usually a page.Page
 | 
						|
	DocumentID   string
 | 
						|
	DocumentName string
 | 
						|
	Filename     string
 | 
						|
}
 | 
						|
 | 
						|
// RenderContext holds contextual information about the content to render.
 | 
						|
type RenderContext struct {
 | 
						|
	// Src is the content to render.
 | 
						|
	Src []byte
 | 
						|
 | 
						|
	// Whether to render TableOfContents.
 | 
						|
	RenderTOC bool
 | 
						|
 | 
						|
	// GerRenderer provides hook renderers on demand.
 | 
						|
	GetRenderer hooks.GetRendererFunc
 | 
						|
}
 | 
						|
 | 
						|
var FeatureRenderHooks = identity.NewPathIdentity("markup", "renderingHooks")
 |