github.com/graemephi/kahugo@v0.62.3-0.20211121071557-d78c0423784d/hugolib/shortcode_page.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 hugolib
    15  
    16  import (
    17  	"html/template"
    18  
    19  	"github.com/gohugoio/hugo/resources/page"
    20  )
    21  
    22  var tocShortcodePlaceholder = createShortcodePlaceholder("TOC", 0)
    23  
    24  // This is sent to the shortcodes. They cannot access the content
    25  // they're a part of. It would cause an infinite regress.
    26  //
    27  // Go doesn't support virtual methods, so this careful dance is currently (I think)
    28  // the best we can do.
    29  type pageForShortcode struct {
    30  	page.PageWithoutContent
    31  	page.ContentProvider
    32  
    33  	// We need to replace it after we have rendered it, so provide a
    34  	// temporary placeholder.
    35  	toc template.HTML
    36  
    37  	p *pageState
    38  }
    39  
    40  func newPageForShortcode(p *pageState) page.Page {
    41  	return &pageForShortcode{
    42  		PageWithoutContent: p,
    43  		ContentProvider:    page.NopPage,
    44  		toc:                template.HTML(tocShortcodePlaceholder),
    45  		p:                  p,
    46  	}
    47  }
    48  
    49  func (p *pageForShortcode) page() page.Page {
    50  	return p.PageWithoutContent.(page.Page)
    51  }
    52  
    53  func (p *pageForShortcode) TableOfContents() template.HTML {
    54  	p.p.enablePlaceholders()
    55  	return p.toc
    56  }
    57  
    58  // This is what is sent into the content render hooks (link, image).
    59  type pageForRenderHooks struct {
    60  	page.PageWithoutContent
    61  	page.TableOfContentsProvider
    62  	page.ContentProvider
    63  }
    64  
    65  func newPageForRenderHook(p *pageState) page.Page {
    66  	return &pageForRenderHooks{
    67  		PageWithoutContent:      p,
    68  		ContentProvider:         page.NopPage,
    69  		TableOfContentsProvider: page.NopPage,
    70  	}
    71  }
    72  
    73  func (p *pageForRenderHooks) page() page.Page {
    74  	return p.PageWithoutContent.(page.Page)
    75  }