2016-11-03 19:34:25 -04:00
// Copyright 2016 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
2017-05-25 05:32:02 -04:00
import (
2018-05-29 21:35:27 -04:00
"fmt"
2017-05-25 05:32:02 -04:00
"path"
2018-07-19 12:26:10 -04:00
"path/filepath"
2018-01-24 03:47:30 -05:00
"strings"
2017-05-25 14:13:03 -04:00
2018-07-17 05:18:29 -04:00
"github.com/gohugoio/hugo/cache"
2018-07-19 17:02:33 -04:00
"github.com/gohugoio/hugo/helpers"
2017-05-25 05:32:02 -04:00
)
2016-11-11 03:01:47 -05:00
// PageCollections contains the page collections for a site.
2016-11-03 19:34:25 -04:00
type PageCollections struct {
2016-11-11 03:01:47 -05:00
// Includes only pages of all types, and only pages in the current language.
2016-11-03 19:34:25 -04:00
Pages Pages
// Includes all pages in all languages, including the current one.
2017-02-02 16:25:42 -05:00
// Includes pages of all types.
2016-11-03 19:34:25 -04:00
AllPages Pages
2016-11-11 03:01:47 -05:00
// A convenience cache for the traditional index types, taxonomies, home page etc.
// This is for the current language only.
indexPages Pages
2016-11-03 19:34:25 -04:00
2016-11-11 03:01:47 -05:00
// A convenience cache for the regular pages.
2016-11-03 19:34:25 -04:00
// This is for the current language only.
2016-11-13 08:27:10 -05:00
RegularPages Pages
2016-11-03 19:34:25 -04:00
2016-11-16 15:06:10 -05:00
// A convenience cache for the all the regular pages.
AllRegularPages Pages
2016-11-03 19:34:25 -04:00
// Includes absolute all pages (of all types), including drafts etc.
rawAllPages Pages
2017-05-25 14:13:03 -04:00
2018-01-23 08:02:54 -05:00
// Includes headless bundles, i.e. bundles that produce no output for its content page.
headlessPages Pages
2018-07-17 05:18:29 -04:00
pageIndex * cache . Lazy
2018-05-29 21:35:27 -04:00
}
// Get initializes the index if not already done so, then
// looks up the given page ref, returns nil if no value found.
2018-07-17 05:18:29 -04:00
func ( c * PageCollections ) getFromCache ( ref string ) ( * Page , error ) {
v , found , err := c . pageIndex . Get ( ref )
if err != nil {
return nil , err
}
if ! found {
return nil , nil
}
p := v . ( * Page )
if p != ambiguityFlag {
return p , nil
}
return nil , fmt . Errorf ( "page reference %q is ambiguous" , ref )
2018-05-29 21:35:27 -04:00
}
2018-07-17 05:18:29 -04:00
var ambiguityFlag = & Page { Kind : kindUnknown , title : "ambiguity flag" }
2018-05-29 21:35:27 -04:00
2016-11-03 19:34:25 -04:00
func ( c * PageCollections ) refreshPageCaches ( ) {
2016-11-16 11:52:03 -05:00
c . indexPages = c . findPagesByKindNotIn ( KindPage , c . Pages )
c . RegularPages = c . findPagesByKindIn ( KindPage , c . Pages )
2016-11-16 15:06:10 -05:00
c . AllRegularPages = c . findPagesByKindIn ( KindPage , c . AllPages )
2016-11-07 14:24:37 -05:00
2018-07-17 05:18:29 -04:00
indexLoader := func ( ) ( map [ string ] interface { } , error ) {
index := make ( map [ string ] interface { } )
add := func ( ref string , p * Page ) {
existing := index [ ref ]
if existing == nil {
index [ ref ] = p
} else if existing != ambiguityFlag && existing != p {
index [ ref ] = ambiguityFlag
}
}
2018-05-29 21:35:27 -04:00
2018-07-17 15:44:08 -04:00
for _ , pageCollection := range [ ] Pages { c . RegularPages , c . headlessPages } {
2018-05-29 21:35:27 -04:00
for _ , p := range pageCollection {
sourceRef := p . absoluteSourceRef ( )
2018-07-17 15:44:08 -04:00
if sourceRef != "" {
// index the canonical ref
// e.g. /section/article.md
add ( sourceRef , p )
}
2018-05-29 21:35:27 -04:00
2018-07-17 15:44:08 -04:00
// Ref/Relref supports this potentially ambiguous lookup.
add ( p . Source . LogicalName ( ) , p )
2018-07-17 05:18:29 -04:00
2018-07-17 15:44:08 -04:00
translationBaseName := p . Source . TranslationBaseName ( )
2018-05-29 21:35:27 -04:00
2018-07-17 15:44:08 -04:00
dir , _ := path . Split ( sourceRef )
dir = strings . TrimSuffix ( dir , "/" )
2018-01-17 13:26:34 -05:00
2018-07-17 15:44:08 -04:00
if translationBaseName == "index" {
add ( dir , p )
add ( path . Base ( dir ) , p )
} else {
add ( translationBaseName , p )
2017-05-25 14:13:03 -04:00
}
2018-07-17 15:44:08 -04:00
// We need a way to get to the current language version.
pathWithNoExtensions := path . Join ( dir , translationBaseName )
add ( pathWithNoExtensions , p )
2018-05-29 21:35:27 -04:00
}
}
for _ , p := range c . indexPages {
// index the canonical, unambiguous ref for any backing file
// e.g. /section/_index.md
sourceRef := p . absoluteSourceRef ( )
if sourceRef != "" {
2018-07-17 05:18:29 -04:00
add ( sourceRef , p )
2017-05-25 05:32:02 -04:00
}
2018-05-29 21:35:27 -04:00
ref := path . Join ( p . sections ... )
// index the canonical, unambiguous virtual ref
// e.g. /section
// (this may already have been indexed above)
2018-07-17 05:18:29 -04:00
add ( "/" + ref , p )
2016-11-07 14:24:37 -05:00
}
2017-05-22 18:20:31 -04:00
2018-07-17 05:18:29 -04:00
return index , nil
2017-05-25 14:13:03 -04:00
}
2018-07-17 05:18:29 -04:00
c . pageIndex = cache . NewLazy ( indexLoader )
2017-05-25 14:13:03 -04:00
}
2017-05-25 05:32:02 -04:00
2017-05-25 14:13:03 -04:00
func newPageCollections ( ) * PageCollections {
return & PageCollections { }
2017-05-25 05:32:02 -04:00
}
2017-05-25 14:13:03 -04:00
func newPageCollectionsFromPages ( pages Pages ) * PageCollections {
return & PageCollections { rawAllPages : pages }
}
2017-05-22 18:20:31 -04:00
2018-07-19 12:26:10 -04:00
// This is an adapter func for the old API with Kind as first argument.
// This is invoked when you do .Site.GetPage. We drop the Kind and fails
// if there are more than 2 arguments, which would be ambigous.
func ( c * PageCollections ) getPageOldVersion ( ref ... string ) ( * Page , error ) {
var refs [ ] string
for _ , r := range ref {
// A common construct in the wild is
// .Site.GetPage "home" "" or
// .Site.GetPage "home" "/"
if r != "" && r != "/" {
refs = append ( refs , r )
}
}
var key string
if len ( refs ) > 2 {
// This was allowed in Hugo <= 0.44, but we cannot support this with the
// new API. This should be the most unusual case.
return nil , fmt . Errorf ( ` too many arguments to .Site.GetPage: %v. Use lookups on the form {{ .Site .GetPage "/posts/mypage-md" }} ` , ref )
}
if len ( refs ) == 0 || refs [ 0 ] == KindHome {
key = "/"
} else if len ( refs ) == 1 {
2018-07-24 04:10:51 -04:00
if len ( ref ) == 2 && refs [ 0 ] == KindSection {
// This is an old style reference to the "Home Page section".
// Typically fetched via {{ .Site.GetPage "section" .Section }}
// See https://github.com/gohugoio/hugo/issues/4989
key = "/"
} else {
key = refs [ 0 ]
}
2018-07-19 12:26:10 -04:00
} else {
key = refs [ 1 ]
}
key = filepath . ToSlash ( key )
if ! strings . HasPrefix ( key , "/" ) {
key = "/" + key
}
return c . getPageNew ( nil , key )
}
// Only used in tests.
2018-07-17 05:18:29 -04:00
func ( c * PageCollections ) getPage ( typ string , sections ... string ) * Page {
2018-07-19 12:26:10 -04:00
refs := append ( [ ] string { typ } , path . Join ( sections ... ) )
p , _ := c . getPageOldVersion ( refs ... )
2018-07-17 05:18:29 -04:00
return p
}
2018-05-29 21:35:27 -04:00
2018-07-17 05:18:29 -04:00
// Ref is either unix-style paths (i.e. callers responsible for
// calling filepath.ToSlash as necessary) or shorthand refs.
func ( c * PageCollections ) getPageNew ( context * Page , ref string ) ( * Page , error ) {
2018-09-05 04:31:15 -04:00
var anError error
2017-05-22 18:20:31 -04:00
2018-07-17 05:18:29 -04:00
// Absolute (content root relative) reference.
if strings . HasPrefix ( ref , "/" ) {
2018-09-05 04:31:15 -04:00
p , err := c . getFromCache ( ref )
if err == nil && p != nil {
2018-07-17 05:18:29 -04:00
return p , nil
}
2018-09-05 04:31:15 -04:00
if err != nil {
anError = err
}
2018-07-19 11:47:05 -04:00
} else if context != nil {
// Try the page-relative path.
2018-07-17 05:18:29 -04:00
ppath := path . Join ( "/" , strings . Join ( context . sections , "/" ) , ref )
2018-09-05 04:31:15 -04:00
p , err := c . getFromCache ( ppath )
if err == nil && p != nil {
2018-07-17 05:18:29 -04:00
return p , nil
}
2018-09-05 04:31:15 -04:00
if err != nil {
anError = err
}
2018-07-17 05:18:29 -04:00
}
2018-05-29 21:35:27 -04:00
2018-07-17 05:18:29 -04:00
if ! strings . HasPrefix ( ref , "/" ) {
// Many people will have "post/foo.md" in their content files.
2018-09-05 04:31:15 -04:00
p , err := c . getFromCache ( "/" + ref )
if err == nil && p != nil {
2018-07-19 17:02:33 -04:00
if context != nil {
// TODO(bep) remove this case and the message below when the storm has passed
helpers . DistinctFeedbackLog . Printf ( ` WARNING: make non-relative ref/relref page reference(s) in page %q absolute, e.g. {{ < ref "/blog/my-post.md" > }} ` , context . absoluteSourceRef ( ) )
}
2018-07-17 05:18:29 -04:00
return p , nil
2018-05-29 21:35:27 -04:00
}
2018-09-05 04:31:15 -04:00
if err != nil {
anError = err
}
2018-07-17 05:18:29 -04:00
}
2018-05-29 21:35:27 -04:00
2018-07-17 05:18:29 -04:00
// Last try.
ref = strings . TrimPrefix ( ref , "/" )
2018-07-19 14:55:16 -04:00
p , err := c . getFromCache ( ref )
2018-07-17 05:18:29 -04:00
if err != nil {
2018-09-05 04:31:15 -04:00
anError = err
}
if p == nil && anError != nil {
2018-07-17 05:18:29 -04:00
if context != nil {
2018-09-05 04:31:15 -04:00
return nil , fmt . Errorf ( "failed to resolve path from page %q: %s" , context . absoluteSourceRef ( ) , anError )
2018-05-29 21:35:27 -04:00
}
2018-09-05 04:31:15 -04:00
return nil , fmt . Errorf ( "failed to resolve page: %s" , anError )
2017-05-25 14:13:03 -04:00
}
2017-05-22 18:20:31 -04:00
2018-07-19 14:55:16 -04:00
return p , nil
2016-11-07 14:24:37 -05:00
}
2016-11-16 11:52:03 -05:00
func ( * PageCollections ) findPagesByKindIn ( kind string , inPages Pages ) Pages {
2016-11-03 19:34:25 -04:00
var pages Pages
for _ , p := range inPages {
2016-11-16 11:52:03 -05:00
if p . Kind == kind {
2016-11-03 19:34:25 -04:00
pages = append ( pages , p )
}
}
return pages
}
2018-02-25 04:50:44 -05:00
func ( * PageCollections ) findFirstPageByKindIn ( kind string , inPages Pages ) * Page {
for _ , p := range inPages {
if p . Kind == kind {
return p
}
}
return nil
}
2016-11-16 11:52:03 -05:00
func ( * PageCollections ) findPagesByKindNotIn ( kind string , inPages Pages ) Pages {
2016-11-03 19:34:25 -04:00
var pages Pages
for _ , p := range inPages {
2016-11-16 11:52:03 -05:00
if p . Kind != kind {
2016-11-03 19:34:25 -04:00
pages = append ( pages , p )
}
}
return pages
}
2016-11-16 11:52:03 -05:00
func ( c * PageCollections ) findPagesByKind ( kind string ) Pages {
return c . findPagesByKindIn ( kind , c . Pages )
2016-11-03 19:34:25 -04:00
}
func ( c * PageCollections ) addPage ( page * Page ) {
c . rawAllPages = append ( c . rawAllPages , page )
}
2018-03-21 12:21:46 -04:00
func ( c * PageCollections ) removePageFilename ( filename string ) {
if i := c . rawAllPages . findPagePosByFilename ( filename ) ; i >= 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
c . clearResourceCacheForPage ( c . rawAllPages [ i ] )
2016-11-03 19:34:25 -04:00
c . rawAllPages = append ( c . rawAllPages [ : i ] , c . rawAllPages [ i + 1 : ] ... )
}
: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
2016-11-03 19:34:25 -04:00
}
func ( c * PageCollections ) removePage ( page * Page ) {
2017-06-08 16:32:01 -04:00
if i := c . rawAllPages . findPagePos ( page ) ; i >= 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
c . clearResourceCacheForPage ( c . rawAllPages [ i ] )
2016-11-03 19:34:25 -04:00
c . rawAllPages = append ( c . rawAllPages [ : i ] , c . rawAllPages [ i + 1 : ] ... )
}
: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
2016-11-03 19:34:25 -04:00
}
2017-03-10 14:54:50 -05:00
func ( c * PageCollections ) findPagesByShortcode ( shortcode string ) Pages {
var pages Pages
for _ , p := range c . rawAllPages {
if p . shortcodeState != nil {
if _ , ok := p . shortcodeState . nameSet [ shortcode ] ; ok {
pages = append ( pages , p )
}
}
}
return pages
}
2016-11-03 19:34:25 -04:00
func ( c * PageCollections ) replacePage ( page * Page ) {
// will find existing page that matches filepath and remove it
c . removePage ( page )
c . addPage ( page )
}
: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 ( c * PageCollections ) clearResourceCacheForPage ( page * Page ) {
if len ( page . Resources ) > 0 {
2018-08-16 06:02:31 -04:00
page . s . ResourceSpec . DeleteCacheByPrefix ( page . relTargetPathBase )
: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
}
}