github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/markup/converter/hooks/hooks.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 hooks
    15  
    16  import (
    17  	"fmt"
    18  	"io"
    19  	"strings"
    20  
    21  	"github.com/gohugoio/hugo/identity"
    22  )
    23  
    24  type AttributesProvider interface {
    25  	Attributes() map[string]string
    26  }
    27  
    28  type LinkContext interface {
    29  	Page() interface{}
    30  	Destination() string
    31  	Title() string
    32  	Text() string
    33  	PlainText() string
    34  }
    35  
    36  type LinkRenderer interface {
    37  	RenderLink(w io.Writer, ctx LinkContext) error
    38  	identity.Provider
    39  }
    40  
    41  // HeadingContext contains accessors to all attributes that a HeadingRenderer
    42  // can use to render a heading.
    43  type HeadingContext interface {
    44  	// Page is the page containing the heading.
    45  	Page() interface{}
    46  	// Level is the level of the header (i.e. 1 for top-level, 2 for sub-level, etc.).
    47  	Level() int
    48  	// Anchor is the HTML id assigned to the heading.
    49  	Anchor() string
    50  	// Text is the rendered (HTML) heading text, excluding the heading marker.
    51  	Text() string
    52  	// PlainText is the unrendered version of Text.
    53  	PlainText() string
    54  
    55  	// Attributes (e.g. CSS classes)
    56  	AttributesProvider
    57  }
    58  
    59  // HeadingRenderer describes a uniquely identifiable rendering hook.
    60  type HeadingRenderer interface {
    61  	// Render writes the rendered content to w using the data in w.
    62  	RenderHeading(w io.Writer, ctx HeadingContext) error
    63  	identity.Provider
    64  }
    65  
    66  type Renderers struct {
    67  	LinkRenderer    LinkRenderer
    68  	ImageRenderer   LinkRenderer
    69  	HeadingRenderer HeadingRenderer
    70  }
    71  
    72  func (r Renderers) Eq(other interface{}) bool {
    73  	ro, ok := other.(Renderers)
    74  	if !ok {
    75  		return false
    76  	}
    77  
    78  	if r.IsZero() || ro.IsZero() {
    79  		return r.IsZero() && ro.IsZero()
    80  	}
    81  
    82  	var b1, b2 bool
    83  	b1, b2 = r.ImageRenderer == nil, ro.ImageRenderer == nil
    84  	if (b1 || b2) && (b1 != b2) {
    85  		return false
    86  	}
    87  	if !b1 && r.ImageRenderer.GetIdentity() != ro.ImageRenderer.GetIdentity() {
    88  		return false
    89  	}
    90  
    91  	b1, b2 = r.LinkRenderer == nil, ro.LinkRenderer == nil
    92  	if (b1 || b2) && (b1 != b2) {
    93  		return false
    94  	}
    95  	if !b1 && r.LinkRenderer.GetIdentity() != ro.LinkRenderer.GetIdentity() {
    96  		return false
    97  	}
    98  
    99  	b1, b2 = r.HeadingRenderer == nil, ro.HeadingRenderer == nil
   100  	if (b1 || b2) && (b1 != b2) {
   101  		return false
   102  	}
   103  	if !b1 && r.HeadingRenderer.GetIdentity() != ro.HeadingRenderer.GetIdentity() {
   104  		return false
   105  	}
   106  
   107  	return true
   108  }
   109  
   110  func (r Renderers) IsZero() bool {
   111  	return r.HeadingRenderer == nil && r.LinkRenderer == nil && r.ImageRenderer == nil
   112  }
   113  
   114  func (r Renderers) String() string {
   115  	if r.IsZero() {
   116  		return "<zero>"
   117  	}
   118  
   119  	var sb strings.Builder
   120  
   121  	if r.LinkRenderer != nil {
   122  		sb.WriteString(fmt.Sprintf("LinkRenderer<%s>|", r.LinkRenderer.GetIdentity()))
   123  	}
   124  	if r.HeadingRenderer != nil {
   125  		sb.WriteString(fmt.Sprintf("HeadingRenderer<%s>|", r.HeadingRenderer.GetIdentity()))
   126  	}
   127  	if r.ImageRenderer != nil {
   128  		sb.WriteString(fmt.Sprintf("ImageRenderer<%s>|", r.ImageRenderer.GetIdentity()))
   129  	}
   130  
   131  	return sb.String()
   132  }