hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

converter.go (3733B)

    1 // Copyright 2019 The Hugo Authors. All rights reserved.
    2 //
    3 // Licensed under the Apache License, Version 2.0 (the "License");
    4 // you may not use this file except in compliance with the License.
    5 // You may obtain a copy of the License at
    6 // http://www.apache.org/licenses/LICENSE-2.0
    7 //
    8 // Unless required by applicable law or agreed to in writing, software
    9 // distributed under the License is distributed on an "AS IS" BASIS,
   10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   11 // See the License for the specific language governing permissions and
   12 // limitations under the License.
   13 
   14 package converter
   15 
   16 import (
   17 	"bytes"
   18 
   19 	"github.com/gohugoio/hugo/common/hexec"
   20 	"github.com/gohugoio/hugo/common/loggers"
   21 	"github.com/gohugoio/hugo/config"
   22 	"github.com/gohugoio/hugo/identity"
   23 	"github.com/gohugoio/hugo/markup/converter/hooks"
   24 	"github.com/gohugoio/hugo/markup/highlight"
   25 	"github.com/gohugoio/hugo/markup/markup_config"
   26 	"github.com/gohugoio/hugo/markup/tableofcontents"
   27 	"github.com/spf13/afero"
   28 )
   29 
   30 // ProviderConfig configures a new Provider.
   31 type ProviderConfig struct {
   32 	MarkupConfig markup_config.Config
   33 
   34 	Cfg       config.Provider // Site config
   35 	ContentFs afero.Fs
   36 	Logger    loggers.Logger
   37 	Exec      *hexec.Exec
   38 	highlight.Highlighter
   39 }
   40 
   41 // ProviderProvider creates converter providers.
   42 type ProviderProvider interface {
   43 	New(cfg ProviderConfig) (Provider, error)
   44 }
   45 
   46 // Provider creates converters.
   47 type Provider interface {
   48 	New(ctx DocumentContext) (Converter, error)
   49 	Name() string
   50 }
   51 
   52 // NewProvider creates a new Provider with the given name.
   53 func NewProvider(name string, create func(ctx DocumentContext) (Converter, error)) Provider {
   54 	return newConverter{
   55 		name:   name,
   56 		create: create,
   57 	}
   58 }
   59 
   60 type newConverter struct {
   61 	name   string
   62 	create func(ctx DocumentContext) (Converter, error)
   63 }
   64 
   65 func (n newConverter) New(ctx DocumentContext) (Converter, error) {
   66 	return n.create(ctx)
   67 }
   68 
   69 func (n newConverter) Name() string {
   70 	return n.name
   71 }
   72 
   73 var NopConverter = new(nopConverter)
   74 
   75 type nopConverter int
   76 
   77 func (nopConverter) Convert(ctx RenderContext) (Result, error) {
   78 	return &bytes.Buffer{}, nil
   79 }
   80 
   81 func (nopConverter) Supports(feature identity.Identity) bool {
   82 	return false
   83 }
   84 
   85 // Converter wraps the Convert method that converts some markup into
   86 // another format, e.g. Markdown to HTML.
   87 type Converter interface {
   88 	Convert(ctx RenderContext) (Result, error)
   89 	Supports(feature identity.Identity) bool
   90 }
   91 
   92 // Result represents the minimum returned from Convert.
   93 type Result interface {
   94 	Bytes() []byte
   95 }
   96 
   97 // DocumentInfo holds additional information provided by some converters.
   98 type DocumentInfo interface {
   99 	AnchorSuffix() string
  100 }
  101 
  102 // TableOfContentsProvider provides the content as a ToC structure.
  103 type TableOfContentsProvider interface {
  104 	TableOfContents() tableofcontents.Root
  105 }
  106 
  107 // AnchorNameSanitizer tells how a converter sanitizes anchor names.
  108 type AnchorNameSanitizer interface {
  109 	SanitizeAnchorName(s string) string
  110 }
  111 
  112 // Bytes holds a byte slice and implements the Result interface.
  113 type Bytes []byte
  114 
  115 // Bytes returns itself
  116 func (b Bytes) Bytes() []byte {
  117 	return b
  118 }
  119 
  120 // DocumentContext holds contextual information about the document to convert.
  121 type DocumentContext struct {
  122 	Document     any // May be nil. Usually a page.Page
  123 	DocumentID   string
  124 	DocumentName string
  125 	Filename     string
  126 }
  127 
  128 // RenderContext holds contextual information about the content to render.
  129 type RenderContext struct {
  130 	// Src is the content to render.
  131 	Src []byte
  132 
  133 	// Whether to render TableOfContents.
  134 	RenderTOC bool
  135 
  136 	// GerRenderer provides hook renderers on demand.
  137 	GetRenderer hooks.GetRendererFunc
  138 }
  139 
  140 var FeatureRenderHooks = identity.NewPathIdentity("markup", "renderingHooks")