| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | // Copyright 2019 The Hugo Authors. All rights reserved.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package hugolib
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import (
 | 
					
						
							|  |  |  | 	"sync"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-28 10:53:47 +02:00
										 |  |  | 	"github.com/gohugoio/hugo/resources/kinds"
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 	"github.com/gohugoio/hugo/resources/page"
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-10 10:11:51 +02:00
										 |  |  | func newPagePaginator(source *pageState) *pagePaginator {
 | 
					
						
							|  |  |  | 	return &pagePaginator{
 | 
					
						
							|  |  |  | 		source:            source,
 | 
					
						
							|  |  |  | 		pagePaginatorInit: &pagePaginatorInit{},
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-10 10:11:51 +02:00
										 |  |  | type pagePaginator struct {
 | 
					
						
							|  |  |  | 	*pagePaginatorInit
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 	source *pageState
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-10 10:11:51 +02:00
										 |  |  | type pagePaginatorInit struct {
 | 
					
						
							|  |  |  | 	init    sync.Once
 | 
					
						
							|  |  |  | 	current *page.Pager
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // reset resets the paginator to allow for a rebuild.
 | 
					
						
							|  |  |  | func (p *pagePaginator) reset() {
 | 
					
						
							|  |  |  | 	p.pagePaginatorInit = &pagePaginatorInit{}
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 22:03:27 +01:00
										 |  |  | func (p *pagePaginator) Paginate(seq any, options ...any) (*page.Pager, error) {
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 	var initErr error
 | 
					
						
							| 
									
										
										
										
											2019-04-10 10:11:51 +02:00
										 |  |  | 	p.init.Do(func() {
 | 
					
						
							| 
									
										
										
										
											2023-01-04 18:24:36 +01:00
										 |  |  | 		pagerSize, err := page.ResolvePagerSize(p.source.s.Conf, options...)
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			initErr = err
 | 
					
						
							|  |  |  | 			return
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		pd := p.source.targetPathDescriptor
 | 
					
						
							|  |  |  | 		pd.Type = p.source.outputFormat()
 | 
					
						
							|  |  |  | 		paginator, err := page.Paginate(pd, seq, pagerSize)
 | 
					
						
							|  |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			initErr = err
 | 
					
						
							|  |  |  | 			return
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		p.current = paginator.Pagers()[0]
 | 
					
						
							|  |  |  | 	})
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if initErr != nil {
 | 
					
						
							|  |  |  | 		return nil, initErr
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return p.current, nil
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-17 22:03:27 +01:00
										 |  |  | func (p *pagePaginator) Paginator(options ...any) (*page.Pager, error) {
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 	var initErr error
 | 
					
						
							| 
									
										
										
										
											2019-04-10 10:11:51 +02:00
										 |  |  | 	p.init.Do(func() {
 | 
					
						
							| 
									
										
										
										
											2023-01-04 18:24:36 +01:00
										 |  |  | 		pagerSize, err := page.ResolvePagerSize(p.source.s.Conf, options...)
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			initErr = err
 | 
					
						
							|  |  |  | 			return
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		pd := p.source.targetPathDescriptor
 | 
					
						
							|  |  |  | 		pd.Type = p.source.outputFormat()
 | 
					
						
							| 
									
										
										
										
											2019-08-03 17:27:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		var pages page.Pages
 | 
					
						
							| 
									
										
										
										
											2020-02-20 14:03:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		switch p.source.Kind() {
 | 
					
						
							| 
									
										
										
										
											2023-07-28 10:53:47 +02:00
										 |  |  | 		case kinds.KindHome:
 | 
					
						
							| 
									
										
										
										
											2019-08-03 17:27:40 +02:00
										 |  |  | 			// From Hugo 0.57 we made home.Pages() work like any other
 | 
					
						
							|  |  |  | 			// section. To avoid the default paginators for the home page
 | 
					
						
							|  |  |  | 			// changing in the wild, we make this a special case.
 | 
					
						
							|  |  |  | 			pages = p.source.s.RegularPages()
 | 
					
						
							| 
									
										
										
										
											2023-07-28 10:53:47 +02:00
										 |  |  | 		case kinds.KindTerm, kinds.KindTaxonomy:
 | 
					
						
							| 
									
										
										
										
											2020-02-20 14:03:56 +01:00
										 |  |  | 			pages = p.source.Pages()
 | 
					
						
							|  |  |  | 		default:
 | 
					
						
							| 
									
										
										
										
											2019-08-17 13:08:03 +02:00
										 |  |  | 			pages = p.source.RegularPages()
 | 
					
						
							| 
									
										
										
										
											2019-08-03 17:27:40 +02:00
										 |  |  | 		}
 | 
					
						
							| 
									
										
										
										
											2020-02-20 14:03:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 17:27:40 +02:00
										 |  |  | 		paginator, err := page.Paginate(pd, pages, pagerSize)
 | 
					
						
							| 
									
										
										
										
											2019-01-02 12:33:26 +01:00
										 |  |  | 		if err != nil {
 | 
					
						
							|  |  |  | 			initErr = err
 | 
					
						
							|  |  |  | 			return
 | 
					
						
							|  |  |  | 		}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		p.current = paginator.Pagers()[0]
 | 
					
						
							|  |  |  | 	})
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if initErr != nil {
 | 
					
						
							|  |  |  | 		return nil, initErr
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return p.current, nil
 | 
					
						
							|  |  |  | }
 |