hugo

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

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

pathspec.go (2583B)

    1 // Copyright 2016-present 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 helpers
   15 
   16 import (
   17 	"strings"
   18 
   19 	"github.com/gohugoio/hugo/common/loggers"
   20 	"github.com/gohugoio/hugo/config"
   21 	"github.com/gohugoio/hugo/hugofs"
   22 	"github.com/gohugoio/hugo/hugolib/filesystems"
   23 	"github.com/gohugoio/hugo/hugolib/paths"
   24 )
   25 
   26 // PathSpec holds methods that decides how paths in URLs and files in Hugo should look like.
   27 type PathSpec struct {
   28 	*paths.Paths
   29 	*filesystems.BaseFs
   30 
   31 	ProcessingStats *ProcessingStats
   32 
   33 	// The file systems to use
   34 	Fs *hugofs.Fs
   35 
   36 	// The config provider to use
   37 	Cfg config.Provider
   38 }
   39 
   40 // NewPathSpec creates a new PathSpec from the given filesystems and language.
   41 func NewPathSpec(fs *hugofs.Fs, cfg config.Provider, logger loggers.Logger) (*PathSpec, error) {
   42 	return NewPathSpecWithBaseBaseFsProvided(fs, cfg, logger, nil)
   43 }
   44 
   45 // NewPathSpecWithBaseBaseFsProvided creats a new PathSpec from the given filesystems and language.
   46 // If an existing BaseFs is provided, parts of that is reused.
   47 func NewPathSpecWithBaseBaseFsProvided(fs *hugofs.Fs, cfg config.Provider, logger loggers.Logger, baseBaseFs *filesystems.BaseFs) (*PathSpec, error) {
   48 	p, err := paths.New(fs, cfg)
   49 	if err != nil {
   50 		return nil, err
   51 	}
   52 
   53 	var options []func(*filesystems.BaseFs) error
   54 	if baseBaseFs != nil {
   55 		options = []func(*filesystems.BaseFs) error{
   56 			filesystems.WithBaseFs(baseBaseFs),
   57 		}
   58 	}
   59 	bfs, err := filesystems.NewBase(p, logger, options...)
   60 	if err != nil {
   61 		return nil, err
   62 	}
   63 
   64 	ps := &PathSpec{
   65 		Paths:           p,
   66 		BaseFs:          bfs,
   67 		Fs:              fs,
   68 		Cfg:             cfg,
   69 		ProcessingStats: NewProcessingStats(p.Lang()),
   70 	}
   71 
   72 	basePath := ps.BaseURL.Path()
   73 	if basePath != "" && basePath != "/" {
   74 		ps.BasePath = basePath
   75 	}
   76 
   77 	return ps, nil
   78 }
   79 
   80 // PermalinkForBaseURL creates a permalink from the given link and baseURL.
   81 func (p *PathSpec) PermalinkForBaseURL(link, baseURL string) string {
   82 	link = strings.TrimPrefix(link, "/")
   83 	if !strings.HasSuffix(baseURL, "/") {
   84 		baseURL += "/"
   85 	}
   86 	return baseURL + link
   87 }