github.com/kovansky/hugo@v0.92.3-0.20220224232819-63076e4ff19f/markup/converter/converter.go (about)

     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        interface{} // May be nil. Usually a page.Page
   123  	DocumentID      string
   124  	DocumentName    string
   125  	Filename        string
   126  	ConfigOverrides map[string]interface{}
   127  }
   128  
   129  // RenderContext holds contextual information about the content to render.
   130  type RenderContext struct {
   131  	Src       []byte
   132  	RenderTOC bool
   133  
   134  	GetRenderer hooks.GetRendererFunc
   135  }
   136  
   137  var FeatureRenderHooks = identity.NewPathIdentity("markup", "renderingHooks")