hugo

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

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

page__output.go (2726B)

    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 	"github.com/gohugoio/hugo/output"
   18 	"github.com/gohugoio/hugo/resources/page"
   19 	"github.com/gohugoio/hugo/resources/resource"
   20 )
   21 
   22 func newPageOutput(
   23 	ps *pageState,
   24 	pp pagePaths,
   25 	f output.Format,
   26 	render bool) *pageOutput {
   27 	var targetPathsProvider targetPathsHolder
   28 	var linksProvider resource.ResourceLinksProvider
   29 
   30 	ft, found := pp.targetPaths[f.Name]
   31 	if !found {
   32 		// Link to the main output format
   33 		ft = pp.targetPaths[pp.firstOutputFormat.Format.Name]
   34 	}
   35 	targetPathsProvider = ft
   36 	linksProvider = ft
   37 
   38 	var paginatorProvider page.PaginatorProvider = page.NopPage
   39 	var pag *pagePaginator
   40 
   41 	if render && ps.IsNode() {
   42 		pag = newPagePaginator(ps)
   43 		paginatorProvider = pag
   44 	}
   45 
   46 	providers := struct {
   47 		page.PaginatorProvider
   48 		resource.ResourceLinksProvider
   49 		targetPather
   50 	}{
   51 		paginatorProvider,
   52 		linksProvider,
   53 		targetPathsProvider,
   54 	}
   55 
   56 	po := &pageOutput{
   57 		f:                       f,
   58 		pagePerOutputProviders:  providers,
   59 		ContentProvider:         page.NopPage,
   60 		TableOfContentsProvider: page.NopPage,
   61 		PageRenderProvider:      page.NopPage,
   62 		render:                  render,
   63 		paginator:               pag,
   64 	}
   65 
   66 	return po
   67 }
   68 
   69 // We create a pageOutput for every output format combination, even if this
   70 // particular page isn't configured to be rendered to that format.
   71 type pageOutput struct {
   72 	// Set if this page isn't configured to be rendered to this format.
   73 	render bool
   74 
   75 	f output.Format
   76 
   77 	// Only set if render is set.
   78 	// Note that this will be lazily initialized, so only used if actually
   79 	// used in template(s).
   80 	paginator *pagePaginator
   81 
   82 	// These interface provides the functionality that is specific for this
   83 	// output format.
   84 	pagePerOutputProviders
   85 	page.ContentProvider
   86 	page.TableOfContentsProvider
   87 	page.PageRenderProvider
   88 
   89 	// May be nil.
   90 	cp *pageContentOutput
   91 }
   92 
   93 func (p *pageOutput) initContentProvider(cp *pageContentOutput) {
   94 	if cp == nil {
   95 		return
   96 	}
   97 	p.ContentProvider = cp
   98 	p.TableOfContentsProvider = cp
   99 	p.PageRenderProvider = cp
  100 	p.cp = cp
  101 }
  102 
  103 func (p *pageOutput) enablePlaceholders() {
  104 	if p.cp != nil {
  105 		p.cp.enablePlaceholders()
  106 	}
  107 }