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 ) {
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 , "/" ) {
if p , err := c . getFromCache ( ref ) ; err == nil && p != nil {
return p , nil
}
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 )
if p , err := c . getFromCache ( ppath ) ; err == nil && p != nil {
return p , nil
}
}
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.
if p , err := c . getFromCache ( "/" + ref ) ; 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-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-05-29 21:35:27 -04:00
2018-07-17 05:18:29 -04:00
if err != nil {
if context != nil {
2018-07-19 17:02:33 -04:00
return nil , fmt . Errorf ( "failed to resolve path from page %q: %s" , context . absoluteSourceRef ( ) , err )
2018-05-29 21:35:27 -04:00
}
2018-07-17 05:18:29 -04:00
return nil , fmt . Errorf ( "failed to resolve page: %s" , err )
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 {
first := page . Resources [ 0 ]
dir := path . Dir ( first . RelPermalink ( ) )
2018-03-21 12:21:46 -04:00
dir = strings . TrimPrefix ( dir , page . LanguagePrefix ( ) )
2018-07-29 08:26:45 -04:00
dir = strings . TrimPrefix ( dir , page . s . BaseURL . Path ( ) )
Add Hugo Piper with SCSS support and much more
Before this commit, you would have to use page bundles to do image processing etc. in Hugo.
This commit adds
* A new `/assets` top-level project or theme dir (configurable via `assetDir`)
* A new template func, `resources.Get` which can be used to "get a resource" that can be further processed.
This means that you can now do this in your templates (or shortcodes):
```bash
{{ $sunset := (resources.Get "images/sunset.jpg").Fill "300x200" }}
```
This also adds a new `extended` build tag that enables powerful SCSS/SASS support with source maps. To compile this from source, you will also need a C compiler installed:
```
HUGO_BUILD_TAGS=extended mage install
```
Note that you can use output of the SCSS processing later in a non-SCSSS-enabled Hugo.
The `SCSS` processor is a _Resource transformation step_ and it can be chained with the many others in a pipeline:
```bash
{{ $css := resources.Get "styles.scss" | resources.ToCSS | resources.PostCSS | resources.Minify | resources.Fingerprint }}
<link rel="stylesheet" href="{{ $styles.RelPermalink }}" integrity="{{ $styles.Data.Digest }}" media="screen">
```
The transformation funcs above have aliases, so it can be shortened to:
```bash
{{ $css := resources.Get "styles.scss" | toCSS | postCSS | minify | fingerprint }}
<link rel="stylesheet" href="{{ $styles.RelPermalink }}" integrity="{{ $styles.Data.Digest }}" media="screen">
```
A quick tip would be to avoid the fingerprinting part, and possibly also the not-superfast `postCSS` when you're doing development, as it allows Hugo to be smarter about the rebuilding.
Documentation will follow, but have a look at the demo repo in https://github.com/bep/hugo-sass-test
New functions to create `Resource` objects:
* `resources.Get` (see above)
* `resources.FromString`: Create a Resource from a string.
New `Resource` transformation funcs:
* `resources.ToCSS`: Compile `SCSS` or `SASS` into `CSS`.
* `resources.PostCSS`: Process your CSS with PostCSS. Config file support (project or theme or passed as an option).
* `resources.Minify`: Currently supports `css`, `js`, `json`, `html`, `svg`, `xml`.
* `resources.Fingerprint`: Creates a fingerprinted version of the given Resource with Subresource Integrity..
* `resources.Concat`: Concatenates a list of Resource objects. Think of this as a poor man's bundler.
* `resources.ExecuteAsTemplate`: Parses and executes the given Resource and data context (e.g. .Site) as a Go template.
Fixes #4381
Fixes #4903
Fixes #4858
2018-02-20 04:02:14 -05:00
page . s . ResourceSpec . DeleteCacheByPrefix ( dir )
: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
}
}