github.com/kovansky/hugo@v0.92.3-0.20220224232819-63076e4ff19f/hugolib/page__output.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  	"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  }