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 }