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 }