2017-03-09 13:19:29 -05:00
|
|
|
// Copyright 2017 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 (
|
|
|
|
"fmt"
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
"net/url"
|
|
|
|
"strings"
|
|
|
|
|
2017-06-13 12:42:45 -04:00
|
|
|
"github.com/gohugoio/hugo/helpers"
|
|
|
|
"github.com/gohugoio/hugo/output"
|
2017-03-09 13:19:29 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
// targetPathDescriptor describes how a file path for a given resource
|
|
|
|
// should look like on the file system. The same descriptor is then later used to
|
|
|
|
// create both the permalinks and the relative links, paginator URLs etc.
|
|
|
|
//
|
|
|
|
// The big motivating behind this is to have only one source of truth for URLs,
|
|
|
|
// and by that also get rid of most of the fragile string parsing/encoding etc.
|
|
|
|
//
|
|
|
|
// Page.createTargetPathDescriptor is the Page adapter.
|
|
|
|
//
|
|
|
|
type targetPathDescriptor struct {
|
|
|
|
PathSpec *helpers.PathSpec
|
|
|
|
|
2017-03-16 03:32:14 -04:00
|
|
|
Type output.Format
|
2017-03-09 13:19:29 -05:00
|
|
|
Kind string
|
|
|
|
|
|
|
|
Sections []string
|
|
|
|
|
|
|
|
// For regular content pages this is either
|
|
|
|
// 1) the Slug, if set,
|
|
|
|
// 2) the file base name (TranslationBaseName).
|
|
|
|
BaseName string
|
|
|
|
|
|
|
|
// Source directory.
|
|
|
|
Dir string
|
|
|
|
|
|
|
|
// Language prefix, set if multilingual and if page should be placed in its
|
|
|
|
// language subdir.
|
|
|
|
LangPrefix string
|
|
|
|
|
2017-11-20 04:34:30 -05:00
|
|
|
// Whether this is a multihost multilingual setup.
|
|
|
|
IsMultihost bool
|
|
|
|
|
2018-01-12 11:17:10 -05:00
|
|
|
// URL from front matter if set. Will override any Slug etc.
|
2017-03-09 13:19:29 -05:00
|
|
|
URL string
|
|
|
|
|
|
|
|
// Used to create paginator links.
|
|
|
|
Addends string
|
|
|
|
|
|
|
|
// The expanded permalink if defined for the section, ready to use.
|
|
|
|
ExpandedPermalink string
|
|
|
|
|
|
|
|
// Some types cannot have uglyURLs, even if globally enabled, RSS being one example.
|
|
|
|
UglyURLs bool
|
|
|
|
}
|
|
|
|
|
2017-03-16 03:32:14 -04:00
|
|
|
// createTargetPathDescriptor adapts a Page and the given output.Format into
|
2017-03-09 13:19:29 -05:00
|
|
|
// a targetPathDescriptor. This descriptor can then be used to create paths
|
|
|
|
// and URLs for this Page.
|
2017-03-16 03:32:14 -04:00
|
|
|
func (p *Page) createTargetPathDescriptor(t output.Format) (targetPathDescriptor, error) {
|
2017-03-17 11:35:09 -04:00
|
|
|
if p.targetPathDescriptorPrototype == nil {
|
2017-03-25 15:31:43 -04:00
|
|
|
panic(fmt.Sprintf("Must run initTargetPathDescriptor() for page %q, kind %q", p.Title, p.Kind))
|
2017-03-17 11:35:09 -04:00
|
|
|
}
|
|
|
|
d := *p.targetPathDescriptorPrototype
|
|
|
|
d.Type = t
|
|
|
|
return d, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Page) initTargetPathDescriptor() error {
|
|
|
|
d := &targetPathDescriptor{
|
2017-11-20 04:34:30 -05:00
|
|
|
PathSpec: p.s.PathSpec,
|
|
|
|
Kind: p.Kind,
|
|
|
|
Sections: p.sections,
|
2018-01-11 11:46:43 -05:00
|
|
|
UglyURLs: p.s.Info.uglyURLs(p),
|
2017-11-20 04:34:30 -05:00
|
|
|
Dir: filepath.ToSlash(p.Source.Dir()),
|
2018-01-12 11:17:10 -05:00
|
|
|
URL: p.URLPath.frontMatterURL,
|
2017-11-20 04:34:30 -05:00
|
|
|
IsMultihost: p.s.owner.IsMultihost(),
|
2017-03-09 13:19:29 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if p.Slug != "" {
|
|
|
|
d.BaseName = p.Slug
|
|
|
|
} else {
|
|
|
|
d.BaseName = p.TranslationBaseName()
|
|
|
|
}
|
|
|
|
|
|
|
|
if p.shouldAddLanguagePrefix() {
|
|
|
|
d.LangPrefix = p.Lang()
|
|
|
|
}
|
|
|
|
|
2017-11-06 22:58:41 -05:00
|
|
|
// Expand only KindPage and KindTaxonomy; don't expand other Kinds of Pages
|
|
|
|
// like KindSection or KindTaxonomyTerm because they are "shallower" and
|
|
|
|
// the permalink configuration values are likely to be redundant, e.g.
|
|
|
|
// naively expanding /category/:slug/ would give /category/categories/ for
|
|
|
|
// the "categories" KindTaxonomyTerm.
|
|
|
|
if p.Kind == KindPage || p.Kind == KindTaxonomy {
|
|
|
|
if override, ok := p.Site.Permalinks[p.Section()]; ok {
|
|
|
|
opath, err := override.Expand(p)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2017-03-09 13:19:29 -05:00
|
|
|
|
2017-11-06 22:58:41 -05:00
|
|
|
opath, _ = url.QueryUnescape(opath)
|
|
|
|
opath = filepath.FromSlash(opath)
|
|
|
|
d.ExpandedPermalink = opath
|
|
|
|
}
|
2017-03-09 13:19:29 -05:00
|
|
|
}
|
|
|
|
|
2017-03-17 11:35:09 -04:00
|
|
|
p.targetPathDescriptorPrototype = d
|
|
|
|
return nil
|
2017-03-09 13:19:29 -05:00
|
|
|
|
|
|
|
}
|
|
|
|
|
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
|
|
|
func (p *Page) initURLs() error {
|
|
|
|
if len(p.outputFormats) == 0 {
|
|
|
|
p.outputFormats = p.s.outputFormats[p.Kind]
|
|
|
|
}
|
2018-01-10 04:20:08 -05:00
|
|
|
target := filepath.ToSlash(p.createRelativeTargetPath())
|
|
|
|
rel := p.s.PathSpec.URLizeFilename(target)
|
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
|
|
|
|
|
|
|
var err error
|
|
|
|
f := p.outputFormats[0]
|
|
|
|
p.permalink, err = p.s.permalinkForOutputFormat(rel, f)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2018-01-05 05:07:50 -05:00
|
|
|
|
2018-01-10 04:20:08 -05:00
|
|
|
p.relTargetPathBase = strings.TrimSuffix(target, f.MediaType.FullSuffix())
|
2018-01-05 05:07:50 -05:00
|
|
|
p.relPermalink = p.s.PathSpec.PrependBasePath(rel)
|
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
|
|
|
p.layoutDescriptor = p.createLayoutDescriptor()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Page) initPaths() error {
|
|
|
|
if err := p.initTargetPathDescriptor(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err := p.initURLs(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-03-09 13:19:29 -05:00
|
|
|
// createTargetPath creates the target filename for this Page for the given
|
2017-03-16 03:32:14 -04:00
|
|
|
// output.Format. Some additional URL parts can also be provided, the typical
|
2017-03-09 13:19:29 -05:00
|
|
|
// use case being pagination.
|
2017-11-12 04:03:56 -05:00
|
|
|
func (p *Page) createTargetPath(t output.Format, noLangPrefix bool, addends ...string) (string, error) {
|
2017-03-09 13:19:29 -05:00
|
|
|
d, err := p.createTargetPathDescriptor(t)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
|
2017-11-12 04:03:56 -05:00
|
|
|
if noLangPrefix {
|
|
|
|
d.LangPrefix = ""
|
|
|
|
}
|
|
|
|
|
2017-03-09 13:19:29 -05:00
|
|
|
if len(addends) > 0 {
|
|
|
|
d.Addends = filepath.Join(addends...)
|
|
|
|
}
|
|
|
|
|
|
|
|
return createTargetPath(d), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func createTargetPath(d targetPathDescriptor) string {
|
|
|
|
|
|
|
|
pagePath := helpers.FilePathSeparator
|
|
|
|
|
|
|
|
// The top level index files, i.e. the home page etc., needs
|
|
|
|
// the index base even when uglyURLs is enabled.
|
|
|
|
needsBase := true
|
|
|
|
|
|
|
|
isUgly := d.UglyURLs && !d.Type.NoUgly
|
|
|
|
|
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
|
|
|
if d.ExpandedPermalink == "" && d.BaseName != "" && d.BaseName == d.Type.BaseName {
|
2017-04-27 03:33:40 -04:00
|
|
|
isUgly = true
|
|
|
|
}
|
|
|
|
|
2018-01-12 11:17:10 -05:00
|
|
|
if d.Kind != KindPage && d.URL == "" && len(d.Sections) > 0 {
|
2017-11-06 22:58:41 -05:00
|
|
|
if d.ExpandedPermalink != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.ExpandedPermalink)
|
|
|
|
} else {
|
|
|
|
pagePath = filepath.Join(d.Sections...)
|
|
|
|
}
|
2017-03-09 13:19:29 -05:00
|
|
|
needsBase = false
|
|
|
|
}
|
|
|
|
|
|
|
|
if d.Type.Path != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.Type.Path)
|
|
|
|
}
|
|
|
|
|
2018-01-12 11:17:10 -05:00
|
|
|
if d.Kind != KindHome && d.URL != "" {
|
|
|
|
if d.IsMultihost && d.LangPrefix != "" && !strings.HasPrefix(d.URL, "/"+d.LangPrefix) {
|
|
|
|
pagePath = filepath.Join(d.LangPrefix, pagePath, d.URL)
|
2017-03-09 13:19:29 -05:00
|
|
|
} else {
|
2018-01-12 11:17:10 -05:00
|
|
|
pagePath = filepath.Join(pagePath, d.URL)
|
|
|
|
}
|
|
|
|
if d.Addends != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.Addends)
|
|
|
|
} else if strings.HasSuffix(d.URL, "/") || !strings.Contains(d.URL, ".") {
|
|
|
|
pagePath = filepath.Join(pagePath, d.Type.BaseName+d.Type.MediaType.FullSuffix())
|
|
|
|
}
|
|
|
|
} else if d.Kind == KindPage {
|
|
|
|
if d.ExpandedPermalink != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.ExpandedPermalink)
|
2017-03-09 13:19:29 -05:00
|
|
|
|
2018-01-12 11:17:10 -05:00
|
|
|
} else {
|
|
|
|
if d.Dir != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.Dir)
|
2017-03-09 13:19:29 -05:00
|
|
|
}
|
2018-01-12 11:17:10 -05:00
|
|
|
if d.BaseName != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.BaseName)
|
2017-03-09 13:19:29 -05:00
|
|
|
}
|
2018-01-12 11:17:10 -05:00
|
|
|
}
|
2017-03-09 13:19:29 -05:00
|
|
|
|
2018-01-12 11:17:10 -05:00
|
|
|
if d.Addends != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.Addends)
|
|
|
|
}
|
|
|
|
|
|
|
|
if isUgly {
|
|
|
|
pagePath += d.Type.MediaType.Delimiter + d.Type.MediaType.Suffix
|
|
|
|
} else {
|
|
|
|
pagePath = filepath.Join(pagePath, d.Type.BaseName+d.Type.MediaType.FullSuffix())
|
|
|
|
}
|
|
|
|
|
|
|
|
if d.LangPrefix != "" {
|
|
|
|
pagePath = filepath.Join(d.LangPrefix, pagePath)
|
2017-03-09 13:19:29 -05:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if d.Addends != "" {
|
|
|
|
pagePath = filepath.Join(pagePath, d.Addends)
|
|
|
|
}
|
|
|
|
|
|
|
|
needsBase = needsBase && d.Addends == ""
|
|
|
|
|
|
|
|
// No permalink expansion etc. for node type pages (for now)
|
|
|
|
base := ""
|
|
|
|
|
|
|
|
if needsBase || !isUgly {
|
|
|
|
base = helpers.FilePathSeparator + d.Type.BaseName
|
|
|
|
}
|
|
|
|
|
2017-06-20 02:45:52 -04:00
|
|
|
pagePath += base + d.Type.MediaType.FullSuffix()
|
2017-03-09 13:19:29 -05:00
|
|
|
|
|
|
|
if d.LangPrefix != "" {
|
|
|
|
pagePath = filepath.Join(d.LangPrefix, pagePath)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pagePath = filepath.Join(helpers.FilePathSeparator, pagePath)
|
|
|
|
|
|
|
|
// Note: MakePathSanitized will lower case the path if
|
|
|
|
// disablePathToLower isn't set.
|
|
|
|
return d.PathSpec.MakePathSanitized(pagePath)
|
|
|
|
}
|
|
|
|
|
2018-01-10 04:20:08 -05:00
|
|
|
func (p *Page) createRelativeTargetPath() string {
|
2017-03-09 13:19:29 -05:00
|
|
|
|
2017-03-16 03:32:14 -04:00
|
|
|
if len(p.outputFormats) == 0 {
|
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
|
|
|
if p.Kind == kindUnknown {
|
|
|
|
panic(fmt.Sprintf("Page %q has unknown kind", p.Title))
|
|
|
|
}
|
2017-03-09 13:19:29 -05:00
|
|
|
panic(fmt.Sprintf("Page %q missing output format(s)", p.Title))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Choose the main output format. In most cases, this will be HTML.
|
2017-03-21 19:25:55 -04:00
|
|
|
f := p.outputFormats[0]
|
|
|
|
|
2018-01-10 04:20:08 -05:00
|
|
|
return p.createRelativeTargetPathForOutputFormat(f)
|
2017-03-21 19:25:55 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Page) createRelativePermalinkForOutputFormat(f output.Format) string {
|
2018-01-10 04:20:08 -05:00
|
|
|
return p.s.PathSpec.URLizeFilename(p.createRelativeTargetPathForOutputFormat(f))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Page) createRelativeTargetPathForOutputFormat(f output.Format) string {
|
2017-11-12 04:03:56 -05:00
|
|
|
tp, err := p.createTargetPath(f, p.s.owner.IsMultihost())
|
2017-03-09 13:19:29 -05:00
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
p.s.Log.ERROR.Printf("Failed to create permalink for page %q: %s", p.FullFilePath(), err)
|
|
|
|
return ""
|
|
|
|
}
|
:sparkles: Implement Page bundling and image handling
This commit is not the smallest in Hugo's history.
Some hightlights include:
* Page bundles (for complete articles, keeping images and content together etc.).
* Bundled images can be processed in as many versions/sizes as you need with the three methods `Resize`, `Fill` and `Fit`.
* Processed images are cached inside `resources/_gen/images` (default) in your project.
* Symbolic links (both files and dirs) are now allowed anywhere inside /content
* A new table based build summary
* The "Total in nn ms" now reports the total including the handling of the files inside /static. So if it now reports more than you're used to, it is just **more real** and probably faster than before (see below).
A site building benchmark run compared to `v0.31.1` shows that this should be slightly faster and use less memory:
```bash
▶ ./benchSite.sh "TOML,num_langs=.*,num_root_sections=5,num_pages=(500|1000),tags_per_page=5,shortcodes,render"
benchmark old ns/op new ns/op delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 101785785 78067944 -23.30%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 185481057 149159919 -19.58%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 103149918 85679409 -16.94%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 203515478 169208775 -16.86%
benchmark old allocs new allocs delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 532464 391539 -26.47%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1056549 772702 -26.87%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 555974 406630 -26.86%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 1086545 789922 -27.30%
benchmark old bytes new bytes delta
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 53243246 43598155 -18.12%
BenchmarkSiteBuilding/TOML,num_langs=1,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 105811617 86087116 -18.64%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=500,tags_per_page=5,shortcodes,render-4 54558852 44545097 -18.35%
BenchmarkSiteBuilding/TOML,num_langs=3,num_root_sections=5,num_pages=1000,tags_per_page=5,shortcodes,render-4 106903858 86978413 -18.64%
```
Fixes #3651
Closes #3158
Fixes #1014
Closes #2021
Fixes #1240
Updates #3757
2017-07-24 03:00:23 -04:00
|
|
|
|
2017-03-21 19:25:55 -04:00
|
|
|
// For /index.json etc. we must use the full path.
|
|
|
|
if strings.HasSuffix(f.BaseFilename(), "html") {
|
|
|
|
tp = strings.TrimSuffix(tp, f.BaseFilename())
|
|
|
|
}
|
2017-03-09 13:19:29 -05:00
|
|
|
|
2018-01-10 04:20:08 -05:00
|
|
|
return tp
|
2017-03-09 13:19:29 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Page) TargetPath() (outfile string) {
|
|
|
|
// Delete in Hugo 0.22
|
2017-05-10 14:05:52 -04:00
|
|
|
helpers.Deprecated("Page", "TargetPath", "This method does not make sanse any more.", true)
|
2017-03-09 13:19:29 -05:00
|
|
|
return ""
|
|
|
|
}
|