Compare commits

...

145 Commits

Author SHA1 Message Date
hugoreleaser 428907cc34 releaser: Add release notes to /docs for release of 0.73.0
[ci skip]
2020-06-23 16:29:21 +00:00
hugoreleaser a78b3e3415 releaser: Bump versions for release of 0.73.0
[ci skip]
2020-06-23 16:29:21 +00:00
Bjørn Erik Pedersen cfcb014515 Release 0.73.0 2020-06-23 18:21:12 +02:00
hugoreleaser ee5d027cd5 releaser: Add release notes for 0.73.0
Rename to *-ready.md to continue.
[ci skip]
2020-06-23 08:57:01 +00:00
Bjørn Erik Pedersen 4a340ba254 Remove some old release notes 2020-06-23 09:37:25 +02:00
Nico 3466884e36 Create robots.txt in the domain root directory
Before a robots.txt is created in every Site. So in public/robots.txt if there are no languages (was correct). But if there are multiple languages in every language directory, too (was wrong). If defaultContentLanguageInSubdir is true, no language is created into the root directory, so no robots.txt is in the root directory (was wrong). If multihosts are configured for each language, that is the only case where one robots.txt must be created in each language directory (was correct).

I've changed the behaviour, that only in the multihost case the robots.txt is created in the language directories. In any other case it is created in public/robots.txt. I've also added tests that files are not created in the wrong directories.

Fixes #5160
See also #4193
2020-06-20 17:13:26 +02:00
Bjørn Erik Pedersen 6ff435aa3f Make GroupByParamDate work with string params
Fixes #3983
2020-06-19 11:58:58 +02:00
Bjørn Erik Pedersen 82abca32fa Add GroupByLastmod
Fixes #7408
2020-06-19 11:58:58 +02:00
Bjørn Erik Pedersen fc045e12a9 Rename taxonomy kinds from taxonomy to term, taxonomyTerm to taxonomy
And we have taken great measures to limit potential site breakage:

* For `disableKinds` and `outputs` we try to map from old to new values if possible, if not we print an ERROR that can be toggled off if not relevant.
* The layout lookup is mostly compatible with more options for the new `term` kind.

That leaves:

* Where queries in site.Pages using taxonomy/taxonomyTerm Kind values as filter.
* Other places where these kind value are used in the templates (classes etc.)

Fixes #6911
Fixes #7395
2020-06-18 09:09:56 +02:00
Helder Pereira 9679023f2b Fix aliases with path in baseURL 2020-06-17 10:52:35 +02:00
Bjørn Erik Pedersen 0a9172672a Merge commit 'efa74c5c6e6ff1daddeb5834ea7c69bed2acf171' 2020-06-16 14:19:31 +02:00
Bjørn Erik Pedersen efa74c5c6e Squashed 'docs/' changes from 9be494de3..ac2c4a487
ac2c4a487 Update documentation for Ugly URLs (#1082)
88bdec17a Change 072.0 to 0.72.0 in release post's description
2aa7d7818 Update rss.md (#1104)
c80677aeb Update quick-start.md (#1076)
d04196bbd Minor spelling and capitalization fixes
837d2feba Fixed spelling mistake
67dc78e12 Update installing.md
ce280c5d6 Update relurl.md
bb4d0e703 Capitalization and Redirecting URL fixes
e1fecada0 Update partials.md
1d99bb182 Typos and whitespacing issues fixed
b20dba125 actually fix index function link this time
f47d6f1e3 Fixing typos, whitespace issues and links
dc82309b9 fix link to the index function
1eab0cbea add missing word (#1130)
9c3ee62ae more fixes
e9bc5880a whitespace, typos and HTTPS fixes
93b806493 Add missing word to Module section
80ced9062 Display image on page bundles page.
727029b0a Update index.md
51fc48e4d Release 0.72.0
1ff68ac3b releaser: Add release notes to /docs for release of 0.72.0
f74a25b92 common/maps: Add Scratch.Values
2fd83db96 Add redirect support to the server
bdfccf9f4 Fix typo in install instructions
e12737ea6 Create SUPPORT.md

git-subtree-dir: docs
git-subtree-split: ac2c4a4871
2020-06-16 14:18:51 +02:00
Bjørn Erik Pedersen 6408c1cbc8 Fix server data race/nil pointer in withMaps
Fixes #7392
2020-06-16 11:48:10 +02:00
Bjørn Erik Pedersen 522ba1cd98 Fix order of GetTerms
Preserve the order from front matter, which would be behaviour when doing this manually (before GetTerms).

Fixes #7213
2020-06-15 22:23:02 +02:00
Cameron Moore 889dc47ceb Add genDocsHelper mage target
Expose the functionality of the hidden `hugo gen docshelper` command as
a mage target.
2020-06-15 20:07:28 +02:00
Helder Pereira f720fe56db Fix aliases with uglyURLs 2020-06-15 12:19:59 +02:00
Bjørn Erik Pedersen d6ed17c60f Fix crash for closing shortcode with no .Inner set
Fixes #6857
Closes #7330
2020-06-14 20:19:08 +02:00
Helder Pereira 145b3fcce3 Fix aliases with relativeURLs 2020-06-14 14:08:41 +02:00
Bjørn Erik Pedersen 01e249e97c Regenerate templates 2020-06-12 11:29:04 +02:00
Joe Mooring 4b560cc119 Beautify HTML generated by pagination template
Fixes #7199.
2020-06-12 11:27:20 +02:00
Bjørn Erik Pedersen e3e627e6b7 Add a nested data dir test
Ref. a discussion.
2020-06-12 09:14:20 +02:00
Raphael Krupinski 83d03a5201 hugofs: Use os.PathError in RootMappingFs.doLstat 2020-06-11 14:59:01 +02:00
Bjørn Erik Pedersen fc0f13b684 commands: Fix URL rewrites vs fast render server mode
Fixes #7357
2020-06-06 12:37:42 +02:00
Edouard 7eeebe1e5a tpl/crypto: Add hmac 2020-06-05 20:04:11 +02:00
Alexandros 740fa4a91d Remove credit (#7347) 2020-06-02 19:31:15 +02:00
Bjørn Erik Pedersen f8c67f93e1 Allow hook template per section/type
Fixes #7349
2020-06-02 19:02:10 +02:00
Sam Smith 3d9235e8fc tpl: Fix bad rounding in NumFmt
strconv.FormatFloat doesn't round properly sometimes, this adds a
different method of rounding, fixes #7116
2020-06-02 17:20:36 +02:00
hugoreleaser f7d909f394 releaser: Prepare repository for 0.73.0-DEV
[ci skip]
2020-05-31 12:16:50 +00:00
hugoreleaser 8a7ef3cf4e releaser: Add release notes to /docs for release of 0.72.0
[ci skip]
2020-05-31 12:05:36 +00:00
hugoreleaser 2dfe242ea6 releaser: Bump versions for release of 0.72.0
[ci skip]
2020-05-31 12:05:36 +00:00
Bjørn Erik Pedersen 7a1464e547 Release 0.72.0 2020-05-31 13:48:27 +02:00
hugoreleaser 41d50b4dd3 releaser: Add release notes for 0.72.0
Rename to *-ready.md to continue.
[ci skip]
2020-05-31 11:03:50 +00:00
Bjørn Erik Pedersen 4d53ae697e releaser: Adjust the "thanks" section 2020-05-31 12:46:18 +02:00
Bjørn Erik Pedersen 626b16e024 Merge commit '9e1dcefc5f559944b70d2fa520f6acd5c56a69f2' 2020-05-31 12:43:33 +02:00
Bjørn Erik Pedersen 9e1dcefc5f Squashed 'docs/' changes from 6c2195936..9be494de3
9be494de3 Clean up the markup config
c3e123133 Remove JustComment
bc1b02bc5 Add Smart to Anchor section
49e796409 Added where .RegularPagesRecursive was added
a92296e31 Fixed the new-in shortcode in pages-vs-site-pages
051e1267c Documented .RegularPagesRecursive
5bcec88a3 Fix broken link in RSS templates page
3db79d433 Correct pull request link on migrations.md
55c347168 Release 0.71.1
11a4e36c3 Merge branch 'temp711'
481fc8ed6 releaser: Add release notes to /docs for release of 0.71.1
40ba83c26 Update site.md
382632b58 Use-modules: More help how to get started importing a theme (#1107)
06751d465 Addition of hugefastsearch to search options (#1118)
8346d3b18 Add example of how to set the permalinks option for pages in "root"
ebb3b4f3a Refine highlight shortcode options
1075a172a Update index.md
7cc927ea6 Fix typo in v0.71.0 release notes
4121da273 Pull in latest theme version to get link hooks
4809be651 Document render-heading feature
2078a3bd1 Release 0.71.0
c09f6899e releaser: Add release notes to /docs for release of 0.71.0
90ffe2b50 Merge commit 'c9403cbceaaeff53ff4833561f4eefe1dc1a405e'
bf3dd0837 Add math.Pow

git-subtree-dir: docs
git-subtree-split: 9be494de3a
2020-05-31 12:43:23 +02:00
Bjørn Erik Pedersen 2919a6a503 common/maps: Add Scratch.Values
Fixes #7335
2020-05-29 19:51:49 +02:00
Bjørn Erik Pedersen 432885c499 deps: Update Goldmark to improve Typographer
See https://github.com/yuin/goldmark/releases/tag/v1.1.31
See #7289
2020-05-29 19:02:30 +02:00
Bjørn Erik Pedersen 6a3e89743c Add redirect support to the server
Fixes #7323
2020-05-28 16:25:34 +02:00
Yash Murty 9613e3e8a8 Fix typo in install instructions 2020-05-27 13:54:11 +02:00
Bjørn Erik Pedersen c950c86b4e publisher: Fix tag collector for nested table elements
Fixes #7318
2020-05-27 11:10:48 +02:00
Anthony Fok 915202494b snap: Fix build error: my previous commits did not fix it
- Revert to legacy snap and my custom plugin x-nodejs for now
- Quote "@babel/cli" and add "@babel/core"
- Change bin/babel.js to bin/babel
2020-05-25 11:26:26 -06:00
hugoreleaser b3e4f911f4 releaser: Prepare repository for 0.72.0-DEV
[ci skip]
2020-05-25 09:21:10 +00:00
hugoreleaser a301f6b2ae releaser: Add release notes to /docs for release of 0.71.1
[ci skip]
2020-05-25 09:08:55 +00:00
hugoreleaser 646bc85088 releaser: Bump versions for release of 0.71.1
[ci skip]
2020-05-25 09:08:55 +00:00
hugoreleaser 5c0d10045d releaser: Add release notes for 0.71.1
[ci skip]
2020-05-25 09:08:55 +00:00
Bjørn Erik Pedersen 81f5633245 Add some more date test cases
See #7310
2020-05-24 14:35:49 +02:00
Bjørn Erik Pedersen 9698b0dab1 Fix RenderString vs render hooks
Fixes #7265
2020-05-24 13:20:57 +02:00
Bjørn Erik Pedersen 32344fe3db Prevent WARNINGs in RenderString 2020-05-24 12:49:45 +02:00
Bjørn Erik Pedersen 4d7fa9f114 Fix IsAncestor/IsDescendant for taxonomies
Fixes #7305
2020-05-24 12:35:45 +02:00
Bjørn Erik Pedersen a985efcecf Fix GetPage on section/bundle name overlaps
In the internal Radix we stored the directory based nodes without a traling slash, e.g. `/blog`.

The original motivation was probably to make it easy to do prefix searching: Give me all ancestors.

This, however have lead to some ambigouty with overlapping directory names.

This particular problem was, however, not possible to work around in an easy way, so from now we store these as `/blog/`.

Fixes #7301
2020-05-24 12:35:45 +02:00
Bjørn Erik Pedersen 6c3c6686f5 Fix Go template script escaping
Fixes #6695
2020-05-23 22:00:34 +02:00
Bjørn Erik Pedersen c34bf48560 Add a test helper 2020-05-22 10:57:25 +02:00
hugoreleaser 833d16d467 releaser: Prepare repository for 0.72.0-DEV
[ci skip]
2020-05-18 16:18:12 +00:00
hugoreleaser 06150c87be releaser: Add release notes to /docs for release of 0.71.0
[ci skip]
2020-05-18 16:05:47 +00:00
hugoreleaser 330e52ebe6 releaser: Bump versions for release of 0.71.0
[ci skip]
2020-05-18 16:05:47 +00:00
Bjørn Erik Pedersen 9e78235374 Release 0.71 2020-05-18 17:57:12 +02:00
hugoreleaser 7cd66c53b9 releaser: Add release notes for 0.71.0
Rename to *-ready.md to continue.
[ci skip]
2020-05-18 15:47:00 +00:00
Bjørn Erik Pedersen 723ec555e7 Fix Babel on Windows
Fixes #7251
2020-05-18 16:57:13 +02:00
Bjørn Erik Pedersen 518d149646 commands: Use WARN log level also for the early initialization
Fixes #7285
2020-05-18 16:52:45 +02:00
Bjørn Erik Pedersen e0e81b280f Merge commit 'c9403cbceaaeff53ff4833561f4eefe1dc1a405e' 2020-05-18 15:25:26 +02:00
Bjørn Erik Pedersen c9403cbcea Squashed 'docs/' changes from ec0abe052..6c2195936
6c2195936 Update featured.png
109a0fcca add len function to navigation side menu
39a356bc5 Revert "Add some rickrolls redirects"
b8393b1b5 Add some rickrolls redirects
2ce21c34b Update configuration-markup.md (add rel="noopener")
95bd7974e Disambiguate global and page resources
5e233dc4b Update base.md
959b9dc3a Fix typo on "where" page
aff8059a1 Release 0.70.0
44a172ac0 releaser: Add release notes to /docs for release of 0.70.0
1b01c8988 Release 0.70.0
5ece21c6c Merge commit '89044b8f8795f17c36396c67823183a20fc88139'
0894aec5b Rename transpileJS to babel
5da27c7a6 resources: Add JavaScript transpiling solution

git-subtree-dir: docs
git-subtree-split: 6c21959360
2020-05-18 15:24:58 +02:00
Bjørn Erik Pedersen 3cc41523be Update to Go 1.14.3 and Go 1.13.11 2020-05-16 23:25:45 +02:00
Bjørn Erik Pedersen 2fd0a5a678 Improve error message when no Babel installed 2020-05-16 12:51:35 +02:00
Cameron Little 6e051c053e Add test for headings render hook 2020-05-15 21:12:43 +02:00
Eli W. Hunter 423b8f2fb8 Add render template hooks for headings
This commit also

* Renames previous types to be non-specific. (e.g. hookedRenderer rather
  than linkRenderer)

Resolves #6713
2020-05-15 21:12:43 +02:00
Joe Mooring 991934497e Add math.Pow
Closes #7266
2020-05-14 10:00:31 +02:00
John Weldon 558c09305e deploy: Do not suppress .well-known/ directory
Deployments ignore directories with a leading `.`, but should not ignore
certain well known 'hidden' directories like `.well-known/`

Fixes #6691
2020-05-14 09:56:53 +02:00
Anthony Fok b69a36140f snap: Quote "@babel/cli" to solve build error
Cannot parse snapcraft.yaml from ~gohugoio/hugo/+git/hugo:master:
  while scanning for the next token found character ‘@’ that cannot
  start any token in “”, line 70, column 34: node-packages:
  [postcss-cli, @babel/cli] ^

Also:

- Upgrade to snapcraft 3.x by adding "base: core"
- Add "license: Apache-2.0"
2020-05-12 14:29:57 -06:00
Anthony Fok a0103864ab snap: Remove custom x-nodejs plugin
My changes have been merged into snapcraft upstream.

https://bugs.launchpad.net/snapcraft/+bug/1795531
https://bugs.launchpad.net/snapcraft/+bug/1797374

Revert "snap: Add custom x-nodejs plugin to support ppc64el and s390x"

This reverts commit 91f49c0700.
2020-05-12 14:27:57 -06:00
Cameron Little b342e8fbdb Upgrade chroma to 0.7.3 to fix invalid css
The new version of chroma includes a fix to not emit styles for tokens
without a class (which is invalid).

Fixes #7207
2020-05-09 17:05:14 +02:00
Daniel Tipping 6205d56b85 Use .Lastmod for og:updated_time
.Lastmod is the time at which the website was most recently updated,
rather than .Date which is the time at which the website content file
was created.
2020-05-07 18:42:20 +02:00
hugoreleaser a5039dddaf releaser: Prepare repository for 0.71.0-DEV
[ci skip]
2020-05-06 11:29:18 +00:00
hugoreleaser 7f47b99ea9 releaser: Add release notes to /docs for release of 0.70.0
[ci skip]
2020-05-06 11:16:40 +00:00
hugoreleaser b98e2f66b0 releaser: Bump versions for release of 0.70.0
[ci skip]
2020-05-06 11:16:40 +00:00
Bjørn Erik Pedersen 57ebab7c23 Release 0.70.0 2020-05-06 13:06:10 +02:00
hugoreleaser 0e314925fb releaser: Add release notes for 0.70.0
Rename to *-ready.md to continue.
[ci skip]
2020-05-06 10:24:22 +00:00
Bjørn Erik Pedersen e4621446ce Merge commit '89044b8f8795f17c36396c67823183a20fc88139' 2020-05-06 12:12:57 +02:00
Bjørn Erik Pedersen 89044b8f87 Squashed 'docs/' changes from 19f44e150..ec0abe052
ec0abe052 Update index.md
ed44339cd Update bio.md
cef04eb95 Minor edits
4d45dcc8d Submitting Digital.gov to the Hugo Showcase
d35126af7 Azure uses storage containers, not buckets; edited accordingly. (#1078)
9c249cc89 fix grammatical error
9728699a3 Release Hugo 0.69.2
cccabed0c Merge branch 'temp692'
3d0a740c4 releaser: Add release notes to /docs for release of 0.69.2
b760aceb1 HTTPS external links in docs
49e4631b0 Release 0.69.1
01f3da870 Merge branch 'temp691'
8280d85aa releaser: Add release notes to /docs for release of 0.69.1
40ea44d24 fix typo (#1088)
725f53643 Rebuild cache
80ee1efd9 Add KeyCDN Showcase
f253e906e docs: Fix typo in Hugo's Security Model
b3ffd1ad3 Mentioning a range is equivalent to foreach (#1086)
0c396911f Update jsonify function docs
376befc9a Fix typo (#1084)
4bdc9bc72 Mark .Page.UniqueID as deprecated and add .File.UniqueID
30a7b7bf2 Update hosting-on-github.md
c5db4ba2b Update postprocess.md
1121f74a5 Update install guide with Scoop extended
8988aa6fa Merge branch 'postprocess'
225d3f9c7 Release Hugo 0.69.0
4caf7a89a releaser: Add release notes to /docs for release of 0.69.0
664b2a0fa Document resources.PostProcess and buildStats
9737b34e9 docs: Regen docs helper
0fab3ba24 Merge commit 'da3c3e5fbd0de65f956618cd2e35401460a3cd02'
96dad83b1 Update hosting-on-aws-amplify.md
57eb27897 Merge commit 'c494c37a4523fbf2db6274dc87e0877fd5bec24b'
dcc7afef7 fix typo in getting started

git-subtree-dir: docs
git-subtree-split: ec0abe052b
2020-05-06 12:12:21 +02:00
Piotr Perzyna 01befcce35 deps: Update minify to v2.6.2
Fixes #6699
2020-05-03 17:29:26 +02:00
Tom 04b1a6d997 Add support for sort by boolean 2020-05-02 11:57:34 +02:00
Bjørn Erik Pedersen dd31e80007 deps: Update to Libsass 3.6.4
Fixes #7231
2020-05-01 19:14:04 +02:00
Bjørn Erik Pedersen 6add6d77b4 Rename transpileJS to babel
And add a test.

Updates #5764
2020-04-29 10:51:33 +02:00
Niek de Wit 2a171ff1c5 resources: Add JavaScript transpiling solution
Add a new pipe called TranspileJS which uses the Babel cli. This makes it possible for users to write ES6 JavaScript code and transpile it to ES5 during website generation so that the code still works with older browser versions.

Fixes #5764
2020-04-29 10:51:33 +02:00
Bjørn Erik Pedersen 67f920419a Disable a test locally
It has started to fail in LiteIDE for some reason (works from the shell and on CI).
2020-04-28 12:24:02 +02:00
Bjørn Erik Pedersen c03ea2b660 Fix some missing JS class collector cases
Fixes #7216
2020-04-27 19:06:29 +02:00
Michael Lynch fe60b7d9e4 Add diagnostic hints to init timeout message
Expand the text in the init timeout message to give the reader more hints as to what may be causing the issue.

The current error sent me on a wild goose chase trying to debug my shortcodes, but it turned out that the issue was just that I wasn't caching my resources/ directory on my build server. Once I found this blog post, I solved the issue in minutes:

https://www.henriksommerfeld.se/hugo-timeout-not-a-circular-loop-in-shortcode/

Googling the error message yields several additional posts from users who focus on loops in their shortcode when the problem seems to be overly-expensive builds.
2020-04-27 13:23:35 +02:00
hugoreleaser c2d9fd1ebe releaser: Prepare repository for 0.70.0-DEV
[ci skip]
2020-04-24 08:00:48 +00:00
hugoreleaser ec9dcf3048 releaser: Add release notes to /docs for release of 0.69.2
[ci skip]
2020-04-24 07:48:07 +00:00
hugoreleaser 03802ff3cb releaser: Bump versions for release of 0.69.2
[ci skip]
2020-04-24 07:48:07 +00:00
hugoreleaser 5e31198c98 releaser: Add release notes for 0.69.2
[ci skip]
2020-04-24 07:48:07 +00:00
Takayama Fumihiko 8d5766d417 Fix IsAncestor and IsDescendant when the same page is passed 2020-04-23 20:23:42 +02:00
SatowTakeshi 5c41f41ad4 deps: Update goldmark-highlighting
Recreate #7027
Fixes #6596
2020-04-23 18:48:52 +02:00
Takayama Fumihiko 27a4c4410c Fix IsAncestor and IsDescendant under subsection 2020-04-23 18:12:13 +02:00
hugoreleaser ade27699e5 releaser: Prepare repository for 0.70.0-DEV
[ci skip]
2020-04-22 08:07:03 +00:00
hugoreleaser 17661debb6 releaser: Add release notes to /docs for release of 0.69.1
[ci skip]
2020-04-22 07:55:01 +00:00
hugoreleaser 8549189e8e releaser: Bump versions for release of 0.69.1
[ci skip]
2020-04-22 07:55:01 +00:00
hugoreleaser c2c7a4ce5b releaser: Add release notes for 0.69.1
[ci skip]
2020-04-22 07:55:01 +00:00
Panagiotis Koursaris 49e6c8cb4e hugolib/filesystems: Fix typo in test suite 2020-04-21 23:16:36 +02:00
Bjørn Erik Pedersen f37e77f2d3 Fix class collector when running with --minify
Also add a related stresstest.

Fixes #7161
2020-04-21 21:00:52 +02:00
Bjørn Erik Pedersen 27af5a339a related: Fix toLower
Don't change the slice.

Fixes #7198
2020-04-21 17:46:26 +02:00
Bjørn Erik Pedersen b3c825756f Fix broken test 2020-04-21 16:44:35 +02:00
BurtonQin 5146dc614f tpl/tmplimpl/template: Change defer RLock to RUnlock 2020-04-21 13:23:31 +02:00
Boqin Qin 736f84b2d5 hugolib: Add Unlock before panic 2020-04-20 17:47:34 +02:00
Onur Yaman cd4d820201 docs: Fix typo in Hugo's Security Model 2020-04-18 14:16:42 +02:00
Niklas Fasching 2b28e5a9cb deps: Update go-org to v1.1.0
- inline source blocks and exports
- result blocks and source block :exports parameter
- fix: html escaping in example blocks
- #+LINK based links
2020-04-17 22:07:52 +02:00
Steve 102ec2da7a commands: Modify gen chromastyles to output all CSS classes
Chroma was updated to include a new function to output all CSS
classes without skipping any considered redundant with the current
style.

This will modify the `hugo gen chromastyles` command to use this new
function by default, which avoids potential problems if the style is
later modified.

Also includes requires the updated Chroma (v0.7.2).

Resolves #7167
2020-04-13 18:31:33 +02:00
Bjørn Erik Pedersen feaa582cbe deps: Update to goldmark v1.1.28
Fixes #7113
2020-04-13 16:55:23 +02:00
Bjørn Erik Pedersen ee67dbeff5 Fix query parameter handling in server fast render mode
There may be a simpler way to get to the raw path, but this will have to do for now.

Fixes #7163
2020-04-12 19:18:54 +02:00
hugoreleaser 4a3f2427ed releaser: Prepare repository for 0.70.0-DEV
[ci skip]
2020-04-10 09:19:20 +00:00
hugoreleaser 4205844bce releaser: Add release notes to /docs for release of 0.69.0
[ci skip]
2020-04-10 09:08:37 +00:00
hugoreleaser 9b55d13589 releaser: Bump versions for release of 0.69.0
[ci skip]
2020-04-10 09:08:37 +00:00
Bjørn Erik Pedersen 6f56a636f6 Update 0.69.0-relnotes.md 2020-04-10 10:58:36 +02:00
hugoreleaser 5ec7fa343a releaser: Add release notes for 0.69.0
Rename to *-ready.md to continue.
[ci skip]
2020-04-10 08:25:47 +00:00
Bjørn Erik Pedersen b7ff4dc23e docs: Regen docs helper 2020-04-10 09:07:41 +02:00
Bjørn Erik Pedersen da3c3e5fbd Squashed 'docs/' changes from 20d77860b..19f44e150
19f44e150 fix typo (#1077)
b66478084 Fix build listing improvements version

git-subtree-dir: docs
git-subtree-split: 19f44e150f
2020-04-10 09:06:04 +02:00
Bjørn Erik Pedersen 30748decf1 Merge commit 'da3c3e5fbd0de65f956618cd2e35401460a3cd02' 2020-04-10 09:06:04 +02:00
Bjørn Erik Pedersen 095bf64c99 Collect HTML elements during the build to use in PurgeCSS etc.
The main use case for this is to use with resources.PostProcess and resources.PostCSS with purgecss.

You would normally set it up to extract keywords from your templates, doing it from the full /public takes forever for bigger sites.

Doing the template thing misses dynamically created class names etc., and it's hard/impossible to set up in when using themes.

You can enable this in your site config:

```toml
[build]
  writeStats = true
```

It will then write a `hugo_stats.json` file to the project root as part of the build.

If you're only using this for the production build, you should consider putting it below `config/production`.

You can then set it up with PostCSS like this:

```js
const purgecss = require('@fullhuman/postcss-purgecss')({
    content: [ './hugo_stats.json' ],
    defaultExtractor: (content) => {
        let els = JSON.parse(content).htmlElements;
        return els.tags.concat(els.classes, els.ids);
    }
});

module.exports = {
    plugins: [
        require('tailwindcss'),
        require('autoprefixer'),
        ...(process.env.HUGO_ENVIRONMENT === 'production' ? [ purgecss ] : [])
    ]
};
```

Fixes #6999
2020-04-09 22:57:26 +02:00
Elliott Sales de Andrade 7791a804e2 deps: Update to latest emoji package 2020-04-08 12:56:14 +02:00
Helicer c774b230e9 Update hosting-on-aws-amplify.md
AWS Amplify now supports a GUI method for using the latest `hugo` version. Please feel free to modify my wording here, etc.
2020-04-07 22:48:55 +02:00
Bjørn Erik Pedersen 2f721f8ec6 Add basic "post resource publish support"
Fixes #7146
2020-04-07 21:59:20 +02:00
Cameron Moore 8568928aa8 tpl: Extend Jsonify to support options map
Add support for prefix and indent options used by json.MarshalIndent
from the Go stdlib.
2020-04-07 20:01:57 +02:00
Cameron Moore 1bc93021e3 tpl: Extend Jsonify to support optional indent parameter
Fixes #5040
2020-04-07 20:01:57 +02:00
Robert Fekete 7eba37ae9b Typo correction 2020-04-07 19:47:44 +02:00
Jay Williams efc61d6f3b commands: Use semver for min_version per recommendations
See https://github.com/gohugoio/hugoThemes#themetoml
2020-04-07 19:42:45 +02:00
Bjørn Erik Pedersen d8d6a25b57 modules: Fix hugo mod vendor for regular file mounts
Fixes #7140
2020-04-07 10:13:55 +02:00
Bjørn Erik Pedersen 9f12be54ee Revert "Revert "common/herrors: Fix typos in comments""
OK, I'm getting tired. Sorry for the noise.

This reverts commit 4437e918cd.
2020-04-06 01:07:57 +02:00
Bjørn Erik Pedersen 4437e918cd Revert "common/herrors: Fix typos in comments"
This reverts commit 1123711b09.
2020-04-06 01:06:27 +02:00
Shubham Shahare 4de3ecdc26 deps: Updateto gitmap v1.1.2
Fixes #6985
2020-04-04 23:24:33 +02:00
rnazmo 1123711b09 common/herrors: Fix typos in comments 2020-04-02 22:06:22 +02:00
Bjørn Erik Pedersen 3d84ef9720 Merge commit 'c494c37a4523fbf2db6274dc87e0877fd5bec24b' 2020-03-31 22:11:54 +02:00
Bjørn Erik Pedersen c494c37a45 Squashed 'docs/' changes from 2a0ea423d..20d77860b
20d77860b Remove the calibre image action
58f53654d Improve image metadata formatting (#1067)
c569f3657 Update theme
80e6d362e Update theme
d5806cca5 Update theme
efc5cb227 Remove broken link on "where" page (#1058)
443266076 Comments Alternatives (#1036)
9b480ebb7 Fix typo
1402365ee Fix included typo in build-options.md
3b5a76de1 Update index.md
1196c7695 Update index.md
1887ea1ed Update index.md
d0666e74e Hugo 0.68.3
d514cfac9 Merge branch 'temp683'
49e57362b releaser: Add release notes to /docs for release of 0.68.3
fa0ac3bf1 Merge branch 'temp682'
46993c209 Release 0.68.2
4c8d6d242 releaser: Add release notes to /docs for release of 0.68.2
9694f4d36 Update index.md
368a03754 Update index.md
0d997010c Merge branch 'temp681'
24138a9cd releaser: Add release notes to /docs for release of 0.68.1
7dd6cc788 Update index.md
b6125b4a8 Update build-options.md
a2dead37a Release 0.68.0
7cff41348 Merge branch 'temp680'
b3b37959c releaser: Add release notes to /docs for release of 0.68.0
0f98184b0 Some minify configuration adjustments
02219f787 Add minify config
efeea7be0 Allow headless bundles to list pages via $page.Pages and $page.RegularPages
7950d0ad1 Mention `resources` folder in the "Directory structure"  docs.

git-subtree-dir: docs
git-subtree-split: 20d77860b2
2020-03-31 22:10:45 +02:00
SatowTakeshi 9c9987535f helpers: Fix TrimShortHTML
Where some tags are siblings of p tag.

Fixes #7081
2020-03-28 11:10:25 +01:00
Bjørn Erik Pedersen 4a39564efe Fix IsDescendant/IsAncestor for overlapping section names
Fixes #7096
2020-03-26 16:11:36 +01:00
Stéphane Wirtel b6e097cfe6 fix typo in getting started 2020-03-24 17:31:37 +01:00
hugoreleaser 19a8accc9f releaser: Prepare repository for 0.69.0-DEV
[ci skip]
2020-03-24 12:16:13 +00:00
hugoreleaser 157669a0e6 releaser: Add release notes to /docs for release of 0.68.3
[ci skip]
2020-03-24 12:04:27 +00:00
hugoreleaser 8f49df946a releaser: Bump versions for release of 0.68.3
[ci skip]
2020-03-24 12:04:27 +00:00
hugoreleaser 1a68ad4e31 releaser: Add release notes for 0.68.3
[ci skip]
2020-03-24 12:04:27 +00:00
Bjørn Erik Pedersen 523d51948f Fix _build.list.local logic
Fixes #7089
2020-03-24 12:47:42 +01:00
hugoreleaser 971b28904b releaser: Prepare repository for 0.69.0-DEV
[ci skip]
2020-03-24 08:33:02 +00:00
hugoreleaser 63bbb40dfb releaser: Add release notes to /docs for release of 0.68.2
[ci skip]
2020-03-24 08:21:09 +00:00
hugoreleaser 73ae6d581d releaser: Bump versions for release of 0.68.2
[ci skip]
2020-03-24 08:21:09 +00:00
hugoreleaser e18a2ad3f4 releaser: Add release notes for 0.68.2
[ci skip]
2020-03-24 08:21:09 +00:00
Bjørn Erik Pedersen cfa73050a4 Fix cache reset for a page's collections on server live reload
Fixes #7085
2020-03-23 23:14:39 +01:00
hugoreleaser 244e49c0ea releaser: Prepare repository for 0.69.0-DEV
[ci skip]
2020-03-22 10:47:54 +00:00
343 changed files with 6246 additions and 1657 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
defaults: &defaults
docker:
- image: bepsays/ci-goreleaser:1.14.1-t
- image: bepsays/ci-goreleaser:1.14.3
environment:
CGO_ENABLED: "0"
+1
View File
@@ -20,6 +20,7 @@ dock.sh
GoBuilds
dist
hugolib/hugo_stats.json
resources/sunset.jpg
vendor
+2 -2
View File
@@ -12,8 +12,8 @@ env:
git:
depth: false
go:
- "1.13.9"
- "1.14.1"
- "1.13.11"
- "1.14.3"
- master
arch:
+1 -1
View File
@@ -48,7 +48,7 @@ Hugo has become a fully featured static site generator, so any new functionality
* strive not to break existing sites.
* close or update an open [Hugo issue](https://github.com/gohugoio/hugo/issues)
If it is of some complexity, the contributor is expected to maintain and support the new future (answer questions on the forum, fix any bugs etc.).
If it is of some complexity, the contributor is expected to maintain and support the new feature in the future (answer questions on the forum, fix any bugs etc.).
It is recommended to open up a discussion on the [Hugo Forum](https://discourse.gohugo.io/) to get feedback on your idea before you begin. If you are submitting a complex feature, create a small design proposal on the [Hugo issue tracker](https://github.com/gohugoio/hugo/issues) before you start.
+5 -2
View File
@@ -179,7 +179,7 @@ func newCommandeer(mustHaveConfigFile, running bool, h *hugoBuilderCommon, f fla
debounce: rebuildDebouncer,
fullRebuildSem: semaphore.NewWeighted(1),
// This will be replaced later, but we need something to log to before the configuration is read.
logger: loggers.NewLogger(jww.LevelError, jww.LevelError, out, ioutil.Discard, running),
logger: loggers.NewLogger(jww.LevelWarn, jww.LevelError, out, ioutil.Discard, running),
}
return c, c.loadConfig(mustHaveConfigFile, running)
@@ -346,7 +346,10 @@ func (c *commandeer) loadConfig(mustHaveConfigFile, running bool) error {
cfg.Logger = logger
c.logger = logger
c.serverConfig = hconfig.DecodeServer(cfg.Cfg)
c.serverConfig, err = hconfig.DecodeServer(cfg.Cfg)
if err != nil {
return err
}
createMemFs := config.GetBool("renderToMemory")
+1 -1
View File
@@ -68,7 +68,7 @@ func (g *genChromaStyles) generate() error {
if err != nil {
return err
}
formatter := html.New(html.WithClasses(true))
formatter := html.New(html.WithAllClasses(true))
formatter.WriteCSS(os.Stdout, style)
return nil
}
+1 -1
View File
@@ -156,7 +156,7 @@ description = ""
homepage = "http://example.com/"
tags = []
features = []
min_version = "0.41"
min_version = "0.41.0"
[author]
name = ""
+40 -8
View File
@@ -292,6 +292,18 @@ type fileServer struct {
s *serverCmd
}
func (f *fileServer) rewriteRequest(r *http.Request, toPath string) *http.Request {
r2 := new(http.Request)
*r2 = *r
r2.URL = new(url.URL)
*r2.URL = *r.URL
r2.URL.Path = toPath
r2.Header.Set("X-Rewrite-Original-URI", r.URL.RequestURI())
return r2
}
func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, error) {
baseURL := f.baseURLs[i]
root := f.roots[i]
@@ -356,28 +368,48 @@ func (f *fileServer) createEndpoint(i int) (*http.ServeMux, string, string, erro
w.Header().Set("Pragma", "no-cache")
}
for _, header := range f.c.serverConfig.Match(r.RequestURI) {
// Ignore any query params for the operations below.
requestURI := strings.TrimSuffix(r.RequestURI, "?"+r.URL.RawQuery)
for _, header := range f.c.serverConfig.MatchHeaders(requestURI) {
w.Header().Set(header.Key, header.Value)
}
if redirect := f.c.serverConfig.MatchRedirect(requestURI); !redirect.IsZero() {
// This matches Netlify's behaviour and is needed for SPA behaviour.
// See https://docs.netlify.com/routing/redirects/rewrites-proxies/
if redirect.Status == 200 {
if r2 := f.rewriteRequest(r, strings.TrimPrefix(redirect.To, u.Path)); r2 != nil {
requestURI = redirect.To
r = r2
}
} else {
w.Header().Set("Content-Type", "")
http.Redirect(w, r, redirect.To, redirect.Status)
return
}
}
if f.c.fastRenderMode && f.c.buildErr == nil {
p := r.RequestURI
if strings.HasSuffix(p, "/") || strings.HasSuffix(p, "html") || strings.HasSuffix(p, "htm") {
if !f.c.visitedURLs.Contains(p) {
if strings.HasSuffix(requestURI, "/") || strings.HasSuffix(requestURI, "html") || strings.HasSuffix(requestURI, "htm") {
if !f.c.visitedURLs.Contains(requestURI) {
// If not already on stack, re-render that single page.
if err := f.c.partialReRender(p); err != nil {
f.c.handleBuildErr(err, fmt.Sprintf("Failed to render %q", p))
if err := f.c.partialReRender(requestURI); err != nil {
f.c.handleBuildErr(err, fmt.Sprintf("Failed to render %q", requestURI))
if f.c.showErrorInBrowser {
http.Redirect(w, r, p, http.StatusMovedPermanently)
http.Redirect(w, r, requestURI, http.StatusMovedPermanently)
return
}
}
}
f.c.visitedURLs.Add(p)
f.c.visitedURLs.Add(requestURI)
}
}
h.ServeHTTP(w, r)
})
}
@@ -1,4 +1,4 @@
// Copyright 2018 The Hugo Authors. All rights reserved.
// Copyright 2020 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.
@@ -11,4 +11,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package publisher
package collections
type Order interface {
// Ordinal is a zero-based ordinal that represents the order of an object
// in a collection.
Ordinal() int
}
+21
View File
@@ -0,0 +1,21 @@
// Copyright 2020 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 constants
// Error IDs.
// Do not change these values.
const (
ErrIDAmbigousDisableKindTaxonomy = "error-disable-taxonomy"
ErrIDAmbigousOutputKindTaxonomy = "error-output-taxonomy"
)
+1 -1
View File
@@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
// Package errors contains common Hugo errors and error related utilities.
// Package herrors contains common Hugo errors and error related utilities.
package herrors
import (
+1 -1
View File
@@ -11,7 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
// Package errors contains common Hugo errors and error related utilities.
// Package herrors contains common Hugo errors and error related utilities.
package herrors
import (
+1 -1
View File
@@ -9,7 +9,7 @@
// 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
// limitatio ns under the License.
// limitations under the License.
package herrors
+1 -1
View File
@@ -9,7 +9,7 @@
// 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
// limitatio ns under the License.
// limitations under the License.
package herrors
+9
View File
@@ -16,6 +16,9 @@ package hugo
import (
"fmt"
"html/template"
"os"
"github.com/gohugoio/hugo/config"
)
const (
@@ -69,3 +72,9 @@ func NewInfo(environment string) Info {
Environment: environment,
}
}
func GetExecEnviron(cfg config.Provider) []string {
env := os.Environ()
config.SetEnvVars(&env, "HUGO_ENVIRONMENT", cfg.GetString("environment"))
return env
}
+2 -2
View File
@@ -16,7 +16,7 @@ package hugo
// CurrentVersion represents the current build version.
// This should be the only one.
var CurrentVersion = Version{
Number: 0.68,
PatchLevel: 1,
Number: 0.73,
PatchLevel: 0,
Suffix: "",
}
+52
View File
@@ -0,0 +1,52 @@
// Copyright 2020 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 loggers
import (
"fmt"
"strings"
)
// IgnorableLogger is a logger that ignores certain log statements.
type IgnorableLogger struct {
logger *Logger
statements map[string]bool
}
// NewIgnorableLogger wraps the given logger and ignores the log statement IDs given.
func NewIgnorableLogger(logger *Logger, statements ...string) IgnorableLogger {
statementsSet := make(map[string]bool)
for _, s := range statements {
statementsSet[strings.ToLower(s)] = true
}
return IgnorableLogger{
logger: logger,
statements: statementsSet,
}
}
func (l IgnorableLogger) Errorf(statementID, format string, v ...interface{}) {
if l.statements[statementID] {
// Ignore.
return
}
ignoreMsg := fmt.Sprintf(`
If you feel that this should not be logged as an ERROR, you can ignore it by adding this to your site config:
ignoreErrors = [%q]`, statementID)
format += ignoreMsg
l.logger.ERROR.Printf(format, v...)
}
+10 -1
View File
@@ -107,6 +107,15 @@ func (c *Scratch) Get(key string) interface{} {
return val
}
// Values returns the raw backing map. Note that you should just use
// this method on the locally scoped Scratch instances you obtain via newScratch, not
// .Page.Scratch etc., as that will lead to concurrency issues.
func (c *Scratch) Values() map[string]interface{} {
c.mu.RLock()
defer c.mu.RUnlock()
return c.values
}
// SetInMap stores a value to a map with the given key in the Node context.
// This map can later be retrieved with GetSortedMapValues.
func (c *Scratch) SetInMap(key string, mapKey string, value interface{}) string {
@@ -147,7 +156,7 @@ func (c *Scratch) GetSortedMapValues(key string) interface{} {
return sortedArray
}
// NewScratch returns a new instance Scratch.
// NewScratch returns a new instance of Scratch.
func NewScratch() *Scratch {
return &Scratch{values: make(map[string]interface{})}
}
+3
View File
@@ -47,6 +47,9 @@ func TestScratchAdd(t *testing.T) {
scratch.Add("scratch", scratch)
_, err := scratch.Add("scratch", scratch)
m := scratch.Values()
c.Assert(m, qt.HasLen, 5)
if err == nil {
t.Errorf("Expected error from invalid arithmetic")
}
+76 -10
View File
@@ -14,6 +14,8 @@
package config
import (
"github.com/pkg/errors"
"sort"
"strings"
"sync"
@@ -29,11 +31,16 @@ import (
var DefaultBuild = Build{
UseResourceCacheWhen: "fallback",
WriteStats: false,
}
// Build holds some build related condfiguration.
type Build struct {
UseResourceCacheWhen string // never, fallback, always. Default is fallback
// When enabled, will collect and write a hugo_stats.json with some build
// related aggregated data (e.g. CSS class names).
WriteStats bool
}
func (b Build) UseResourceCache(err error) bool {
@@ -96,26 +103,36 @@ func DecodeSitemap(prototype Sitemap, input map[string]interface{}) Sitemap {
// Config for the dev server.
type Server struct {
Headers []Headers
Headers []Headers
Redirects []Redirect
compiledInit sync.Once
compiled []glob.Glob
compiledInit sync.Once
compiledHeaders []glob.Glob
compiledRedirects []glob.Glob
}
func (s *Server) Match(pattern string) []types.KeyValueStr {
func (s *Server) init() {
s.compiledInit.Do(func() {
for _, h := range s.Headers {
s.compiled = append(s.compiled, glob.MustCompile(h.For))
s.compiledHeaders = append(s.compiledHeaders, glob.MustCompile(h.For))
}
for _, r := range s.Redirects {
s.compiledRedirects = append(s.compiledRedirects, glob.MustCompile(r.From))
}
})
}
if s.compiled == nil {
func (s *Server) MatchHeaders(pattern string) []types.KeyValueStr {
s.init()
if s.compiledHeaders == nil {
return nil
}
var matches []types.KeyValueStr
for i, g := range s.compiled {
for i, g := range s.compiledHeaders {
if g.Match(pattern) {
h := s.Headers[i]
for k, v := range h.Values {
@@ -132,18 +149,67 @@ func (s *Server) Match(pattern string) []types.KeyValueStr {
}
func (s *Server) MatchRedirect(pattern string) Redirect {
s.init()
if s.compiledRedirects == nil {
return Redirect{}
}
pattern = strings.TrimSuffix(pattern, "index.html")
for i, g := range s.compiledRedirects {
redir := s.Redirects[i]
// No redirect to self.
if redir.To == pattern {
return Redirect{}
}
if g.Match(pattern) {
return redir
}
}
return Redirect{}
}
type Headers struct {
For string
Values map[string]interface{}
}
func DecodeServer(cfg Provider) *Server {
type Redirect struct {
From string
To string
Status int
}
func (r Redirect) IsZero() bool {
return r.From == ""
}
func DecodeServer(cfg Provider) (*Server, error) {
m := cfg.GetStringMap("server")
s := &Server{}
if m == nil {
return s
return s, nil
}
_ = mapstructure.WeakDecode(m, s)
return s
for i, redir := range s.Redirects {
// Get it in line with the Hugo server.
redir.To = strings.TrimSuffix(redir.To, "index.html")
if !strings.HasPrefix(redir.To, "https") && !strings.HasSuffix(redir.To, "/") {
// There are some tricky infinite loop situations when dealing
// when the target does not have a trailing slash.
// This can certainly be handled better, but not time for that now.
return nil, errors.Errorf("unspported redirect to value %q in server config; currently this must be either a remote destination or a local folder, e.g. \"/blog/\" or \"/blog/index.html\"", redir.To)
}
s.Redirects[i] = redir
}
return s, nil
}
+60 -2
View File
@@ -70,15 +70,73 @@ for = "/*.jpg"
X-Frame-Options = "DENY"
X-XSS-Protection = "1; mode=block"
X-Content-Type-Options = "nosniff"
[[server.redirects]]
from = "/foo/**"
to = "/foo/index.html"
status = 200
[[server.redirects]]
from = "/google/**"
to = "https://google.com/"
status = 301
[[server.redirects]]
from = "/**"
to = "/default/index.html"
status = 301
`, "toml")
c.Assert(err, qt.IsNil)
s := DecodeServer(cfg)
s, err := DecodeServer(cfg)
c.Assert(err, qt.IsNil)
c.Assert(s.Match("/foo.jpg"), qt.DeepEquals, []types.KeyValueStr{
c.Assert(s.MatchHeaders("/foo.jpg"), qt.DeepEquals, []types.KeyValueStr{
{Key: "X-Content-Type-Options", Value: "nosniff"},
{Key: "X-Frame-Options", Value: "DENY"},
{Key: "X-XSS-Protection", Value: "1; mode=block"}})
c.Assert(s.MatchRedirect("/foo/bar/baz"), qt.DeepEquals, Redirect{
From: "/foo/**",
To: "/foo/",
Status: 200,
})
c.Assert(s.MatchRedirect("/someother"), qt.DeepEquals, Redirect{
From: "/**",
To: "/default/",
Status: 301,
})
c.Assert(s.MatchRedirect("/google/foo"), qt.DeepEquals, Redirect{
From: "/google/**",
To: "https://google.com/",
Status: 301,
})
// No redirect loop, please.
c.Assert(s.MatchRedirect("/default/index.html"), qt.DeepEquals, Redirect{})
c.Assert(s.MatchRedirect("/default/"), qt.DeepEquals, Redirect{})
for _, errorCase := range []string{`[[server.redirects]]
from = "/**"
to = "/file"
status = 301`,
`[[server.redirects]]
from = "/**"
to = "/foo/file.html"
status = 301`,
} {
cfg, err := FromConfigString(errorCase, "toml")
c.Assert(err, qt.IsNil)
_, err = DecodeServer(cfg)
c.Assert(err, qt.Not(qt.IsNil))
}
}
+19 -1
View File
@@ -440,6 +440,21 @@ func (lf *localFile) MD5() []byte {
return lf.md5
}
// knownHiddenDirectory checks if the specified name is a well known
// hidden directory.
func knownHiddenDirectory(name string) bool {
var knownDirectories = []string{
".well-known",
}
for _, dir := range knownDirectories {
if name == dir {
return true
}
}
return false
}
// walkLocal walks the source directory and returns a flat list of files,
// using localFile.SlashPath as the map keys.
func walkLocal(fs afero.Fs, matchers []*matcher, include, exclude glob.Glob) (map[string]*localFile, error) {
@@ -451,7 +466,10 @@ func walkLocal(fs afero.Fs, matchers []*matcher, include, exclude glob.Glob) (ma
if info.IsDir() {
// Skip hidden directories.
if path != "" && strings.HasPrefix(info.Name(), ".") {
return filepath.SkipDir
// Except for specific hidden directories
if !knownHiddenDirectory(info.Name()) {
return filepath.SkipDir
}
}
return nil
}
+59
View File
@@ -207,6 +207,65 @@ func TestFindDiffs(t *testing.T) {
}
}
func TestWalkLocal(t *testing.T) {
tests := map[string]struct {
Given []string
Expect []string
}{
"Empty": {
Given: []string{},
Expect: []string{},
},
"Normal": {
Given: []string{"file.txt", "normal_dir/file.txt"},
Expect: []string{"file.txt", "normal_dir/file.txt"},
},
"Hidden": {
Given: []string{"file.txt", ".hidden_dir/file.txt", "normal_dir/file.txt"},
Expect: []string{"file.txt", "normal_dir/file.txt"},
},
"Well Known": {
Given: []string{"file.txt", ".hidden_dir/file.txt", ".well-known/file.txt"},
Expect: []string{"file.txt", ".well-known/file.txt"},
},
}
for desc, tc := range tests {
t.Run(desc, func(t *testing.T) {
fs := afero.NewMemMapFs()
for _, name := range tc.Given {
dir, _ := path.Split(name)
if dir != "" {
if err := fs.MkdirAll(dir, 0755); err != nil {
t.Fatal(err)
}
}
if fd, err := fs.Create(name); err != nil {
t.Fatal(err)
} else {
fd.Close()
}
}
if got, err := walkLocal(fs, nil, nil, nil); err != nil {
t.Fatal(err)
} else {
expect := map[string]interface{}{}
for _, path := range tc.Expect {
if _, ok := got[path]; !ok {
t.Errorf("expected %q in results, but was not found", path)
}
expect[path] = nil
}
for path := range got {
if _, ok := expect[path]; !ok {
t.Errorf("got %q in results unexpectedly", path)
}
}
}
})
}
}
func TestLocalFile(t *testing.T) {
const (
content = "hello world!"
+17 -9
View File
@@ -2,6 +2,7 @@ package deps
import (
"sync"
"sync/atomic"
"time"
"github.com/pkg/errors"
@@ -92,8 +93,9 @@ type Deps struct {
// BuildStartListeners will be notified before a build starts.
BuildStartListeners *Listeners
// Atomic flags set during a build.
BuildFlags *BuildFlags
// Atomic values set during a build.
// This is common/global for all sites.
BuildState *BuildState
*globalErrHandler
}
@@ -236,8 +238,9 @@ func New(cfg DepsCfg) (*Deps, error) {
}
errorHandler := &globalErrHandler{}
buildState := &BuildState{}
resourceSpec, err := resources.NewSpec(ps, fileCaches, logger, errorHandler, cfg.OutputFormats, cfg.MediaTypes)
resourceSpec, err := resources.NewSpec(ps, fileCaches, buildState, logger, errorHandler, cfg.OutputFormats, cfg.MediaTypes)
if err != nil {
return nil, err
}
@@ -275,7 +278,7 @@ func New(cfg DepsCfg) (*Deps, error) {
Site: cfg.Site,
FileCaches: fileCaches,
BuildStartListeners: &Listeners{},
BuildFlags: &BuildFlags{},
BuildState: buildState,
Timeout: time.Duration(timeoutms) * time.Millisecond,
globalErrHandler: errorHandler,
}
@@ -308,7 +311,7 @@ func (d Deps) ForLanguage(cfg DepsCfg, onCreated func(d *Deps) error) (*Deps, er
// The resource cache is global so reuse.
// TODO(bep) clean up these inits.
resourceCache := d.ResourceSpec.ResourceCache
d.ResourceSpec, err = resources.NewSpec(d.PathSpec, d.ResourceSpec.FileCaches, d.Log, d.globalErrHandler, cfg.OutputFormats, cfg.MediaTypes)
d.ResourceSpec, err = resources.NewSpec(d.PathSpec, d.ResourceSpec.FileCaches, d.BuildState, d.Log, d.globalErrHandler, cfg.OutputFormats, cfg.MediaTypes)
if err != nil {
return nil, err
}
@@ -376,10 +379,15 @@ type DepsCfg struct {
Running bool
}
// BuildFlags are flags that may be turned on during a build.
type BuildFlags struct {
// BuildState are flags that may be turned on during a build.
type BuildState struct {
counter uint64
}
func NewBuildFlags() BuildFlags {
return BuildFlags{}
func (b *BuildState) Incr() int {
return int(atomic.AddUint64(&b.counter, uint64(1)))
}
func NewBuildState() BuildState {
return BuildState{}
}
+10
View File
@@ -15,8 +15,18 @@ package deps
import (
"testing"
qt "github.com/frankban/quicktest"
)
func TestBuildFlags(t *testing.T) {
c := qt.New(t)
var bf BuildState
bf.Incr()
bf.Incr()
bf.Incr()
c.Assert(bf.Incr(), qt.Equals, 4)
}
+3
View File
@@ -0,0 +1,3 @@
### Asking Support Questions
We have an active [discussion forum](https://discourse.gohugo.io) where users and developers can ask questions. Please don't use the GitHub issue tracker to ask questions.
-12
View File
@@ -1,12 +0,0 @@
name: Compress images
on: pull_request
jobs:
build:
name: calibreapp/image-actions
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: calibreapp/image-actions
uses: docker://calibreapp/github-image-actions
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -1,4 +1,3 @@
.header-link:after {
position: relative;
left: 0.5em;
@@ -2,7 +2,7 @@
@import '_tachyons';
/* purgecss start ignore */
@import '_anchorforid';
@import '_header-link';
@import '_animation';
@import '_documentation-styles';
@@ -36,4 +36,4 @@
.mw-90 {
max-width:90%;
}
/* purgecss end ignore */
/* purgecss end ignore */
@@ -1,6 +1,5 @@
require("typeface-muli")
import styles from './css/main.css';
import './js/anchorforid.js'
import './js/clipboardjs.js'
import './js/codeblocks.js'
import './js/docsearch.js'
@@ -11,6 +10,3 @@ import './js/scrolldir.js'
import './js/smoothscroll.js'
import './js/tabs.js'
import './js/nojs.js'
@@ -1,34 +0,0 @@
/**
* Anchor for ID BPNY
**/
var anchorForId = function (id) {
var anchor = document.createElement("a");
anchor.className = "header-link";
anchor.href = "#" + id;
anchor.innerHTML = ' <svg class="fill-current o-60 hover-accent-color-light" height="22px" viewBox="0 0 24 24" width="22px" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg>';
return anchor;
};
var linkifyAnchors = function (level, containingElement) {
var headers = containingElement.getElementsByTagName("h" + level);
for (var h = 0; h < headers.length; h++) {
var header = headers[h];
if (typeof header.id !== "undefined" && header.id !== "") {
header.appendChild(anchorForId(header.id));
}
}
};
document.onreadystatechange = function () {
if (this.readyState === "complete") {
var contentBlock = document.getElementsByClassName("prose")[0]
if (!contentBlock) {
return;
}
for (var level = 2; level <= 4; level++) {
linkifyAnchors(level, contentBlock);
}
}
};
@@ -1,5 +1,4 @@
import styles from './../css/main.css';
import './anchorforid.js'
import './clipboardjs.js'
import './codeblocks.js'
import './docsearch.js'
@@ -10,9 +9,7 @@ import './smoothscroll.js'
import './tabs.js'
import './nojs.js'
// TO use Jquery, just call the modules you want
// TO use jQuery, just call the modules you want
// var $ = require('jquery/src/core');
// require('jquery/src/core/init');
// require('jquery/src/manipulation');
@@ -5280,3 +5280,4 @@ code, .code, pre code, .highlight pre {
max-width:90%;
}
/* purgecss end ignore */
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }}
{{- if and (ge .Level 2) (le .Level 4) }}{{" " -}}
<a class="header-link" href="#{{ .Anchor | safeURL }}"><svg class="fill-current o-60 hover-accent-color-light" height="22px" viewBox="0 0 24 24" width="22px" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"/></svg></a>
{{- end -}}
</h{{ .Level }}>
@@ -1,70 +1,72 @@
<!DOCTYPE html>
<html class="no-js" lang="{{ with $.Site.LanguageCode }}{{ . }}{{ else }}en-us{{ end }}">
<head>
<meta charset="utf-8">
{{/* https://www.zachleat.com/web/preload/ */}}
<link rel="preload" href="{{ "fonts/muli-latin-200.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ "fonts/muli-latin-400.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ "fonts/muli-latin-800.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
{{/* NOTE: the Site's title, and if there is a page title, that is set too */}}
<title>{{ block "title" . }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title>
<head>
<meta charset="utf-8">
{{/* https://www.zachleat.com/web/preload/ */}}
<link rel="preload" href="{{ "fonts/muli-latin-200.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ "fonts/muli-latin-400.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ "fonts/muli-latin-800.woff2" | absURL }}" as="font" type="font/woff2" crossorigin>
<meta name="viewport" content="width=device-width,minimum-scale=1">
{{ hugo.Generator }}
<meta http-equiv="X-UA-Compatible" content="IE=edge">
{{/* NOTE: the Site's title, and if there is a page title, that is set too */}}
<title>{{ block "title" . }}{{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }}{{ end }}</title>
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
<meta name="robots" content="index, follow">
{{ else }}
<meta name="robots" content="noindex, nofollow">
{{ end }}
<meta name="viewport" content="width=device-width,minimum-scale=1">
{{ hugo.Generator }}
{{ range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink | safeURL }}">
{{ end -}}
{{ $isDev := eq hugo.Environment "development" }}
{{ $stylesheet := resources.Get "output/css/app.css" }}
{{ if not $isDev }}
{{ $stylesheet = $stylesheet | minify | fingerprint }}
{{ end }}
{{ with $stylesheet }}
{{ if $isDev }}
<link rel="stylesheet" href="{{ .RelPermalink }}" crossorigin="anonymous">
{{ else }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{ end }}
{{ $.Scratch.Set "stylesheet" . }}
{{end}}
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
<meta name="robots" content="index, follow">
{{ else }}
<meta name="robots" content="noindex, nofollow">
{{ end }}
{{ range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink | safeURL }}">
{{ end -}}
{{ $isDev := eq hugo.Environment "development" }}
{{ $stylesheet := resources.Get "output/css/app.css" }}
{{ if not $isDev }}
{{ $stylesheet = $stylesheet | minify | fingerprint }}
{{ end }}
{{ with $stylesheet }}
{{ if $isDev }}
<link rel="stylesheet" href="{{ .RelPermalink }}" crossorigin="anonymous">
{{ else }}
<link rel="stylesheet" href="{{ .RelPermalink }}" integrity="{{ .Data.Integrity }}" crossorigin="anonymous">
{{ end }}
{{ $.Scratch.Set "stylesheet" . }}
{{end}}
{{ block "scripts" . }}
{{- partial "site-scripts.html" . -}}
{{ end }}
{{ partial "site-manifest.html" . }}
{{- partial "head-additions.html" . -}}
{{- template "_internal/opengraph.html" . -}}
{{- template "_internal/schema.html" . -}}
{{- template "_internal/twitter_cards.html" . -}}
{{ block "scripts" . }}
{{- partial "site-scripts.html" . -}}
{{ end }}
{{ partial "site-manifest.html" . }}
{{- partial "head-additions.html" . -}}
{{- template "_internal/opengraph.html" . -}}
{{- template "_internal/schema.html" . -}}
{{- template "_internal/twitter_cards.html" . -}}
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
{{ partial "gtag" . }}
{{ end }}
{{ if eq (getenv "HUGO_ENV") "production" | or (eq .Site.Params.env "production") }}
{{ partial "gtag" . }}
{{ end }}
</head>
<body class="ma0 sans-serif bg-primary-color-light{{ with getenv "HUGO_ENV" }} {{ . }}{{ end }}">
{{ block "nav" . }}{{ partial "site-nav.html" . }}{{ end }}
{{ block "header" . }}{{ end }}
<main role="main" class="content-with-sidebar min-vh-100 pb7 pb0-ns">
{{ block "main" . }}{{ end }}
</main>
{{ block "footer" . }}{{ partialCached "site-footer.html" . }}{{ end }}
</head>
</body>
</html>
<body class="ma0 sans-serif bg-primary-color-light{{ with getenv "HUGO_ENV" }} {{ . }}{{ end }}">
{{ block "nav" . }}{{ partial "site-nav.html" . }}{{ end }}
{{ block "header" . }}{{ end }}
<main role="main" class="content-with-sidebar min-vh-100 pb7 pb0-ns">
{{ block "main" . }}{{ end }}
</main>
{{ block "footer" . }}{{ partialCached "site-footer.html" . }}{{ end }}
</body>
</html>
+1 -1
View File
@@ -1 +1 @@
# github.com/gohugoio/gohugoioTheme v0.0.0-20200128164921-1d0bc5482051
# github.com/gohugoio/gohugoioTheme v0.0.0-20200518165806-0095b7b902a7
-8
View File
@@ -58,14 +58,6 @@ pattern = "2006"
[social]
twitter = "GoHugoIO"
# MARKDOWN
## Configuration for BlackFriday markdown parser: https://github.com/russross/blackfriday
[blackfriday]
plainIDAnchors = true
# See https://github.com/gohugoio/hugo/issues/2424
hrefTargetBlank = false
angledQuotes = false
latexDashes = true
[imaging]
# See https://github.com/disintegration/imaging
-6
View File
@@ -14,12 +14,6 @@ pluralizeListTitles = false
# We do redirects via Netlify's _redirects file, generated by Hugo (see "outputs" below).
disableAliases = true
[markup]
[markup.highlight]
style = "trac"
lineNumbersInTable = true
noClasses = false
[outputs]
home = [ "HTML", "RSS", "REDIR", "HEADERS" ]
section = [ "HTML", "RSS"]
+7
View File
@@ -0,0 +1,7 @@
defaultMarkdownHandler = "goldmark"
[highlight]
style = "trac"
lineNumbersInTable = true
noClasses = false
+1 -1
View File
@@ -28,7 +28,7 @@ This has many benefits. The most noticeable is performance. HTTP servers are *ve
## More on Static Site Generators
* ["An Introduction to Static Site Generators", David Walsh][]
* ["Hugo vs. Wordpress page load speed comparison: Hugo leaves WordPress in its dust", GettingThingsTech][hugovwordpress]
* ["Hugo vs. WordPress page load speed comparison: Hugo leaves WordPress in its dust", GettingThingsTech][hugovwordpress]
* ["Static Site Generators", O'Reilly][]
* [StaticGen: Top Open-Source Static Site Generators (GitHub Stars)][]
* ["Top 10 Static Website Generators", Netlify blog][]
+1 -1
View File
@@ -44,7 +44,7 @@ toc: true
* Automatic and user defined [content summaries][]
* [Shortcodes][] to enable rich content inside of Markdown
* ["Minutes to Read"][pagevars] functionality
* ["Wordcount"][pagevars] functionality
* ["WordCount"][pagevars] functionality
## Additional Features
+1 -3
View File
@@ -1,5 +1,3 @@
---
title: Hugo and the General Data Protection Regulation (GDPR)
linktitle: Hugo and GDPR
@@ -98,7 +96,7 @@ useSessionStorage
simple
: If simple mode is enabled, a static and no-JS version of the Instagram image card will be built. Note that this only supports image cards and the image itself will be fetched from Instagram's servers.
**Note:** If you use the _simple mode_ for Instagram and a site styled with Bootstrap 4, you may want to disable the inlines styles provided by Hugo:
**Note:** If you use the _simple mode_ for Instagram and a site styled with Bootstrap 4, you may want to disable the inline styles provided by Hugo:
{{< code-toggle file="config">}}
[services]
@@ -1,6 +1,6 @@
---
title: Hugo's Security Model
description: A summary of Hugo's security model.
description: A summary of Hugo's security model.
date: 2019-10-01
layout: single
keywords: ["Security", "Privacy"]
@@ -19,14 +19,14 @@ toc: true
Hugo produces static output, so once built, the runtime is the browser (assuming the output is HTML) and any server (API) that you integrate with.
But when developing and building your site, the runtime is the `hugo` executable. Securing a runtime can be [a real challenge](https://blog.logrocket.com/how-to-protect-your-node-js-applications-from-malicious-dependencies-5f2e60ea08f9/).
But when developing and building your site, the runtime is the `hugo` executable. Securing a runtime can be [a real challenge](https://blog.logrocket.com/how-to-protect-your-node-js-applications-from-malicious-dependencies-5f2e60ea08f9/).
**Hugo's main approach is that of sandboxing:**
* Hugo has a virtual file system and only the main project (not third-party components) is allowed to mount directories or files outside the project root.
* Only the main project can walk symbolic links.
* User-defined components have only read-access to the filesystem.
* We shell out to some external binaries to support [Asciidoctor](/content-management/formats/#list-of-content-formats) and simliar, but those binaries and their flags are predefined. General functions to run arbitrary external OS commands have been [discussed](https://github.com/gohugoio/hugo/issues/796), but not implemented because of security concerns.
* We shell out to some external binaries to support [Asciidoctor](/content-management/formats/#list-of-content-formats) and similar, but those binaries and their flags are predefined. General functions to run arbitrary external OS commands have been [discussed](https://github.com/gohugoio/hugo/issues/796), but not implemented because of security concerns.
Hugo will soon introduce a concept of _Content Source Plugins_ (AKA _Pages from Data_), but the above will still hold true.
+3 -5
View File
@@ -39,9 +39,7 @@ Hugo is for people who want to hand code their own website without worrying abou
Hugo is for people building a blog, a company site, a portfolio site, documentation, a single landing page, or a website with thousands of pages.
[@spf13]: https://twitter.com/@spf13
[@spf13]: https://twitter.com/spf13
[Aerobatic]: https://www.aerobatic.com/
[Amazon S3]: https://aws.amazon.com/s3/
[Azure]: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-static-website
@@ -51,7 +49,7 @@ Hugo is for people building a blog, a company site, a portfolio site, documentat
[GitHub Pages]: https://pages.github.com/
[GitLab Pages]: https://about.gitlab.com/features/pages/
[Go language]: https://golang.org/
[GoDaddy]: https://www.godaddy.com/ "Godaddy.com Hosting"
[GoDaddy]: https://www.godaddy.com/ "GoDaddy.com Hosting"
[Google Cloud Storage]: https://cloud.google.com/storage/
[Heroku]: https://www.heroku.com/
[Jekyll]: https://jekyllrb.com/
@@ -61,5 +59,5 @@ Hugo is for people building a blog, a company site, a portfolio site, documentat
[Rackspace]: https://www.rackspace.com/cloud/files
[Surge]: https://surge.sh
[contributing to it]: https://github.com/gohugoio/hugo
[rackspace]: https://www.rackspace.com/cloud/files
[rackspace]: https://www.rackspace.com/openstack/public/files
[static site generator]: /about/benefits/
+1 -1
View File
@@ -15,7 +15,7 @@ hugo is the main command, used to build your Hugo site.
Hugo is a Fast and Flexible Static Site Generator
built with love by spf13 and friends in Go.
Complete documentation is available at http://gohugo.io/.
Complete documentation is available at https://gohugo.io/.
```
hugo [flags]
+1 -1
View File
@@ -13,7 +13,7 @@ Generate Markdown documentation for the Hugo CLI.
Generate Markdown documentation for the Hugo CLI.
This command is, mostly, used to create up-to-date documentation
of Hugo's command-line interface for http://gohugo.io/.
of Hugo's command-line interface for https://gohugo.io/.
It creates one Markdown file per command with front matter suitable
for rendering in Hugo.
@@ -15,7 +15,6 @@ Delete the Hugo Module cache for the current project.
Note that after you run this command, all of your dependencies will be re-downloaded next time you run "hugo".
Also note that if you configure a positive maxAge for the "modules" file cache, it will also be cleaned as part of "hugo --gc".
```
+1 -1
View File
@@ -18,7 +18,7 @@ Some examples:
Install the latest version possible for a given module:
hugo mod get github.com/gohugoio/testshortcodes
Install a specific version:
hugo mod get github.com/gohugoio/testshortcodes@v0.3.0
@@ -18,8 +18,6 @@ toc: true
comments: Before this page is published, need to also update both site- and page-level variables documentation.
---
Larger sites often have multiple content authors. Hugo provides standardized author profiles to organize relationships between content and content creators for sites operating under a distributed authorship model.
## Author Profiles
@@ -107,7 +105,7 @@ You can find a list of all template variables to access the profile information
### Link Social Network Accounts
As aforementioned, Hugo is able to generate links to profiles of the most popular social networks. The following social networks with their corresponding identifiers are supported: `github`, `facebook`, `twitter`, `pinterest`, `instagram`, `youtube` and `linkedin`.
As aforementioned, Hugo is able to generate links to profiles of the most popular social networks. The following social networks with their corresponding identifiers are supported: `github`, `facebook`, `twitter`, `pinterest`, `instagram`, `youtube` and `linkedin`.
This is can be done with the `.Social.URL` function. Its only parameter is the name of the social network as they are defined in the profile (e.g. `facebook`, `twitter`). Custom variables like `website` remain as they are.
@@ -30,18 +30,18 @@ If true, the page will be treated as a published page, holding its dedicated out
#### list
Note that we extended this property from a boolean to an enum in Hugo 0.58.0.
Note that we extended this property from a boolean to an enum in Hugo 0.68.0.
Valid values are:
never
: The page will not be incldued in any page collection.
: The page will not be included in any page collection.
always (default)
: The page will be included in all page collections, e.g. `site.RegularPages`, `$page.Pages`.
local
: The page will be included in any _local_ page collection, e.g. `$page.RegularPages`, `$page.Pages`. One use case for this would be to create fully navigable, but headless content sections. {{< new-in "0.58.0" >}}
: The page will be included in any _local_ page collection, e.g. `$page.RegularPages`, `$page.Pages`. One use case for this would be to create fully navigable, but headless content sections. {{< new-in "0.68.0" >}}
If true, the page will be treated as part of the project's collections and, when appropriate, returned by Hugo's listing methods (`.Pages`, `.RegularPages` etc...).
@@ -105,4 +105,4 @@ cascade:
{{ .Content }}
</blockquote>
{{ end }}
</section>
</section>
@@ -51,17 +51,17 @@ Disqus has its own [internal template](https://gohugo.io/templates/internal/#dis
There are a few alternatives to commenting on static sites for those who do not want to use Disqus:
* [Static Man](https://staticman.net/)
* [Staticman](https://staticman.net/)
* [Talkyard](https://www.talkyard.io/blog-comments) (Open source, & serverless hosting)
* [IntenseDebate](https://intensedebate.com/)
* [Graph Comment][]
* [Muut](https://muut.com/)
* [isso](https://posativ.org/isso/) (Self-hosted, Python)
* [Isso](https://posativ.org/isso/) (Self-hosted, Python)
* [Tutorial on Implementing Isso with Hugo][issotutorial]
* [Utterances](https://utteranc.es/) (Open source, Github comments widget built on Github issues)
* [Utterances](https://utteranc.es/) (Open source, GitHub comments widget built on GitHub issues)
* [Remark](https://github.com/umputun/remark) (Open source, Golang, Easy to run docker)
* [Commento](https://commento.io/) (Open Source, available as a service, local install, or docker image)
* [JustComments](https://just-comments.com) (Open Source, available as a service, can be self-hosted)
* [Hyvor Talk](https://talk.hyvor.com/) (Available as a service)
[configuration]: /getting-started/configuration/
@@ -34,7 +34,7 @@ The current list of content formats in Hugo:
|MMark|mmark|Mmark is deprecated and will be removed in a future release.|
|Emacs Org-Mode|org|See [go-org](https://github.com/niklasfasching/go-org).|
|Asciidoc|asciidoc, adoc, ad|Needs Asciidoc or [Asciidoctor][ascii] installed.|
|RST|rst|Needs [RST](http://docutils.sourceforge.net/rst.html) installed.|
|RST|rst|Needs [RST](https://docutils.sourceforge.io/rst.html) installed.|
|Pandoc|pandoc, pdc|Needs [Pandoc](https://www.pandoc.org/) installed.|
|HTML|html, htm|To be treated as a content file, with layout, shortcodes etc., it must have front matter. If not, it will be copied as-is.|
@@ -88,7 +88,7 @@ Markdown syntax is simple enough to learn in a single sitting. The following are
[mmark]: https://github.com/mmarkdown/mmark
[org]: https://orgmode.org/
[pandoc]: https://www.pandoc.org/
[Pygments]: http://pygments.org/
[rest]: http://docutils.sourceforge.net/rst.html
[Pygments]: https://pygments.org/
[rest]: https://docutils.sourceforge.io/rst.html
[sc]: /content-management/shortcodes/
[sct]: /templates/shortcode-templates/
@@ -4,7 +4,7 @@ description: "Image Page resources can be resized and cropped."
date: 2018-01-24T13:10:00-05:00
linktitle: "Image Processing"
categories: ["content management"]
keywords: [resources,images]
keywords: [resources, images]
weight: 4004
draft: false
toc: true
@@ -18,16 +18,24 @@ menu:
The `image` is a [Page Resource]({{< relref "/content-management/page-resources" >}}), and the processing methods listed below do not work on images inside your `/static` folder.
To get all images in a [Page Bundle]({{< relref "/content-management/organization#page-bundles" >}}):
To print all images paths in a [Page Bundle]({{< relref "/content-management/organization#page-bundles" >}}):
```go-html-template
{{ with .Resources.ByType "image" }}
{{ range . }}
{{ .RelPermalink }}
{{ end }}
{{ end }}
```
## Image Processing Methods
## The Image Resource
The `image` resource can also be retrieved from a [global resource]({{< relref "/hugo-pipes/introduction#from-file-to-resource" >}})
{{- $image := resources.Get "images/logo.jpg" -}}
## Image Processing Methods
The `image` resource implements the methods `Resize`, `Fit` and `Fill`, each returning the transformed image using the specified dimensions and processing options. The `image` resource also, since Hugo 0.58, implements the method `Exif` and `Filter`.
@@ -37,27 +45,29 @@ Resizes the image to the specified width and height.
```go
// Resize to a width of 600px and preserve ratio
{{ $image := $resource.Resize "600x" }}
{{ $image := $resource.Resize "600x" }}
// Resize to a height of 400px and preserve ratio
{{ $image := $resource.Resize "x400" }}
{{ $image := $resource.Resize "x400" }}
// Resize to a width 600px and a height of 400px
{{ $image := $resource.Resize "600x400" }}
```
### Fit
Scale down the image to fit the given dimensions while maintaining aspect ratio. Both height and width are required.
```go
{{ $image := $resource.Fit "600x400" }}
{{ $image := $resource.Fit "600x400" }}
```
### Fill
Resize and crop the image to match the given dimensions. Both height and width are required.
```go
{{ $image := $resource.Fill "600x400" }}
{{ $image := $resource.Fill "600x400" }}
```
### Filter
@@ -74,7 +84,7 @@ The above can also be written in a more functional style using pipes:
{{ $img = $img | images.Filter (images.GaussianBlur 6) (images.Pixelate 8) }}
```
The filters will be applied in the given order.
The filters will be applied in the given order.
Sometimes it can be useful to create the filter chain once and then reuse it:
@@ -88,13 +98,13 @@ Sometimes it can be useful to create the filter chain once and then reuse it:
Provides an [Exif](https://en.wikipedia.org/wiki/Exif) object with metadata about the image.
Note that this is only suported for JPEG and TIFF images, so it's recommended to wrap the access with a `with`, e.g.:
Note that this is only supported for JPEG and TIFF images, so it's recommended to wrap the access with a `with`, e.g.:
```go-html-template
{{ with $img.Exif }}
Date: {{ .Date }}
Lat/Long: {{ .Lat}}/{{ .Long }}
Tags:
Tags:
{{ range $k, $v := .Tags }}
TAG: {{ $k }}: {{ $v }}
{{ end }}
@@ -104,14 +114,22 @@ TAG: {{ $k }}: {{ $v }}
Or individually access EXIF data with dot access, e.g.:
```go-html-template
{{ with $img.Exif }}
Date: {{ .Date }}
Lat/Long: {{ .Lat }}/{{ .Long }}
Aperture: {{ .Tags.ApertureValue }}
Focal Length: {{ .Tags.FocalLength }}
{{ with $src.Exif }}
<ul>
{{ with .Date }}<li>Date: {{ .Format "January 02, 2006" }}</li>{{ end }}
{{ with .Tags.ApertureValue }}<li>Aperture: {{ lang.NumFmt 2 . }}</li>{{ end }}
{{ with .Tags.BrightnessValue }}<li>Brightness: {{ lang.NumFmt 2 . }}</li>{{ end }}
{{ with .Tags.ExposureTime }}<li>Exposure Time: {{ . }}</li>{{ end }}
{{ with .Tags.FNumber }}<li>F Number: {{ . }}</li>{{ end }}
{{ with .Tags.FocalLength }}<li>Focal Length: {{ . }}</li>{{ end }}
{{ with .Tags.ISOSpeedRatings }}<li>ISO Speed Ratings: {{ . }}</li>{{ end }}
{{ with .Tags.LensModel }}<li>Lens Model: {{ . }}</li>{{ end }}
</ul>
{{ end }}
```
Some fields may need to be formatted with [`lang.NumFmt`]({{< relref "functions/numfmt" >}}) function to prevent display like `Aperture: 2.278934289` instead of `Aperture: 2.28`.
#### Exif fields
Date
@@ -125,10 +143,6 @@ Long
See [Image Processing Config](#image-processing-config) for how to configure what gets included in Exif.
## Image Processing Options
In addition to the dimensions (e.g. `600x400`), Hugo supports a set of additional image options.
@@ -148,6 +162,7 @@ For color codes, see https://www.google.com/search?q=color+picker
**Note** that you also set a default background color to use, see [Image Processing Config](#image-processing-config).
### JPEG Quality
Only relevant for JPEG images, values 1 to 100 inclusive, higher is better. Default is 75.
```go
@@ -155,26 +170,32 @@ Only relevant for JPEG images, values 1 to 100 inclusive, higher is better. Defa
```
### Rotate
Rotates an image by the given angle counter-clockwise. The rotation will be performed first to get the dimensions correct. The main use of this is to be able to manually correct for [EXIF orientation](https://github.com/golang/go/issues/4341) of JPEG images.
```go
{{ $image.Resize "600x r90" }}
```
### Anchor
Only relevant for the `Fill` method. This is useful for thumbnail generation where the main motive is located in, say, the left corner.
Valid are `Center`, `TopLeft`, `Top`, `TopRight`, `Left`, `Right`, `BottomLeft`, `Bottom`, `BottomRight`.
### Anchor
Only relevant for the `Fill` method. This is useful for thumbnail generation where the main motive is located in, say, the left corner.
Valid values are `Smart`, `Center`, `TopLeft`, `Top`, `TopRight`, `Left`, `Right`, `BottomLeft`, `Bottom`, `BottomRight`.
Default value is `Smart`, which uses [Smartcrop](https://github.com/muesli/smartcrop) to determine the best crop.
```go
{{ $image.Fill "300x200 BottomLeft" }}
```
### Resample Filter
Filter used in resizing. Default is `Box`, a simple and fast resampling filter appropriate for downscaling.
Filter used in resizing. Default is `Box`, a simple and fast resampling filter appropriate for downscaling.
Examples are: `Box`, `NearestNeighbor`, `Linear`, `Gaussian`.
See https://github.com/disintegration/imaging for more. If you want to trade quality for faster processing, this may be a option to test.
See https://github.com/disintegration/imaging for more. If you want to trade quality for faster processing, this may be a option to test.
```go
{{ $image.Resize "600x400 Gaussian" }}
@@ -194,7 +215,6 @@ Valid values are `jpg`, `png`, `tif`, `bmp`, and `gif`.
_The photo of the sunset used in the examples below is Copyright [Bjørn Erik Pedersen](https://commons.wikimedia.org/wiki/User:Bep) (Creative Commons Attribution-Share Alike 4.0 International license)_
{{< imgproc sunset Resize "300x" />}}
{{< imgproc sunset Fill "90x120 left" />}}
@@ -205,12 +225,10 @@ _The photo of the sunset used in the examples below is Copyright [Bjørn Erik Pe
{{< imgproc sunset Resize "300x q10" />}}
This is the shortcode used in the examples above:
{{< code file="layouts/shortcodes/imgproc.html" >}}
{{< readfile file="layouts/shortcodes/imgproc.html" >}}
{{< readfile file="layouts/shortcodes/imgproc.html" >}}
{{< /code >}}
And it is used like this:
@@ -219,7 +237,6 @@ And it is used like this:
{{</* imgproc sunset Resize "300x" /*/>}}
```
{{% note %}}
**Tip:** Note the self-closing shortcode syntax above. The `imgproc` shortcode can be called both with and without **inner content**.
{{% /note %}}
@@ -244,7 +261,7 @@ quality = 75
# Valid values are Smart, Center, TopLeft, Top, TopRight, Left, Right, BottomLeft, Bottom, BottomRight
anchor = "smart"
# Default background color.
# Default background color.
# Hugo will preserve transparency for target formats that supports it,
# but will fall back to this color for JPEG.
# Expects a standard HEX color string with 3 or 6 digits.
@@ -281,15 +298,13 @@ By default, Hugo will use the [Smartcrop](https://github.com/muesli/smartcrop),
An example using the sunset image from above:
{{< imgproc sunset Fill "200x200 smart" />}}
## Image Processing Performance Consideration
Processed images are stored below `<project-dir>/resources` (can be set with `resourceDir` config setting). This folder is deliberately placed in the project, as it is recommended to check these into source control as part of the project. These images are not "Hugo fast" to generate, but once generated they can be reused.
If you change your image settings (e.g. size), remove or rename images etc., you will end up with unused images taking up space and cluttering your project.
If you change your image settings (e.g. size), remove or rename images etc., you will end up with unused images taking up space and cluttering your project.
To clean up, run:
@@ -297,10 +312,6 @@ To clean up, run:
hugo --gc
```
{{% note %}}
**GC** is short for **Garbage Collection**.
{{% /note %}}
@@ -63,7 +63,7 @@ When working with front matter `Params` in [single page templates][singles], omi
`defaultContentLanguage` sets the project's default language. If not set, the default language will be `en`.
If the default language needs to be rendererd below its own language code (`/en`) like the others, set `defaultContentLanguageInSubdir: true`.
If the default language needs to be rendered below its own language code (`/en`) like the others, set `defaultContentLanguageInSubdir: true`.
Only the obvious non-global options can be overridden per language. Examples of global options are `baseURL`, `buildDrafts`, etc.
@@ -125,7 +125,7 @@ public
**All URLs (i.e `.Permalink` etc.) will be generated from that root. So the English home page above will have its `.Permalink` set to `https://example.com/`.**
When you run `hugo server` we will start multiple HTTP servers. You will typlically see something like this in the console:
When you run `hugo server` we will start multiple HTTP servers. You will typically see something like this in the console:
```bash
Web Server is available at 127.0.0.1:1313 (bind address 127.0.0.1)
@@ -204,7 +204,7 @@ languages:
The value of `contentDir` can be any valid path -- even absolute path references. The only restriction is that the content directories cannot overlap.
Considering the following example in conjunction with the configuration above:
Considering the following example in conjunction with the configuration above:
1. `/content/english/about.md`
2. `/content/french/about.md`
@@ -23,9 +23,9 @@ Hugo `0.32` announced page-relative images and other resources packaged into `Pa
These terms are connected, and you also need to read about [Page Resources]({{< relref "/content-management/page-resources" >}}) and [Image Processing]({{< relref "/content-management/image-processing" >}}) to get the full picture.
{{% imgproc 1-featured Resize "300x" %}}
{{< imgproc 1-featured Resize "300x" >}}
The illustration shows 3 bundles. Note that the home page bundle cannot contain other content pages, but other files (images etc.) are fine.
{{% /imgproc %}}
{{< /imgproc >}}
{{% note %}}
@@ -112,7 +112,7 @@ Single content files in each of your sections are going to be rendered as [singl
content/posts/my-first-hugo-post.md
```
At the time Hugo builds your site, the content will be output to the following destination:
When Hugo builds your site, the content will be outputted to the following destination:
```
@@ -73,6 +73,14 @@ my-post
: This leaf bundle has the `index.md`, two other content
Markdown files and two image files.
image1
: This image is a page resource of `my-post`
and only available in `my-post/index.md` resources.
image2
: This image is a page resource of `my-post`
and only available in `my-post/index.md` resources.
my-other-post
: This leaf bundle has only the `index.md`.
@@ -14,6 +14,10 @@ menu:
weight: 31
---
Page resources are available for [page bundles]({{< relref "/content-management/page-bundles" >}}) only,
i.e. a directory with either a `index.md`, or `_index.md` file at its root. Resources are only attached to
the lowest page they are bundled with, and simple which names does not contain `index.md` are not attached any resource.
## Properties
ResourceType
@@ -78,7 +82,7 @@ GetMatch
## Page Resources Metadata
The page resources' metadata is managed from the corresponding page's front matter with an array/table parameter named `resources`. You can batch assign values using [wildcards](http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm).
The page resources' metadata is managed from the corresponding page's front matter with an array/table parameter named `resources`. You can batch assign values using [wildcards](https://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm).
{{% note %}}
Resources of type `page` get `Title` etc. from their own front matter.
@@ -21,7 +21,7 @@ toc: true
## What a Shortcode is
Hugo loves Markdown because of its simple content format, but there are times when Markdown falls short. Often, content authors are forced to add raw HTML (e.g., video `<iframes>`) to Markdown content. We think this contradicts the beautiful simplicity of Markdown's syntax.
Hugo loves Markdown because of its simple content format, but there are times when Markdown falls short. Often, content authors are forced to add raw HTML (e.g., video `<iframe>`'s) to Markdown content. We think this contradicts the beautiful simplicity of Markdown's syntax.
Hugo created **shortcodes** to circumvent these limitations.
@@ -418,12 +418,12 @@ To learn more about creating custom shortcodes, see the [shortcode template docu
[`figure` shortcode]: #figure
[contentmanagementsection]: /content-management/formats/
[examplegist]: https://gist.github.com/spf13/7896402
[figureelement]: http://html5doctor.com/the-figure-figcaption-elements/ "An article from HTML5 doctor discussing the fig and figcaption elements."
[figureelement]: https://html5doctor.com/the-figure-figcaption-elements/ "An article from HTML5 doctor discussing the fig and figcaption elements."
[Hugo and the GDPR]: /about/hugo-and-gdpr/
[Instagram]: https://www.instagram.com/
[pagevariables]: /variables/page/
[partials]: /templates/partials/
[Pygments]: http://pygments.org/
[Pygments]: https://pygments.org/
[quickstart]: /getting-started/quick-start/
[sctemps]: /templates/shortcode-templates/
[scvars]: /variables/shortcodes/
@@ -43,10 +43,9 @@ Highlighting is carried out via the [built-in shortcode](/content-management/sho
Options:
* `linenos`: Valid values are `true`, `false`, `table`, `inline`. `table` will give copy-and-paste friendly code blocks) turns on line numbers.
* Setting `linenos` to `false` will turn off linenumbers if it's configured to be on in site config.{{< new-in "0.60.0" >}}
* `hl_lines` lists a set of line numbers or line number ranges to be highlighted.
* `linenostart=199` starts the line number count from 199.
* `linenos`: configure line numbers. Valid values are `true`, `false`, `table`, or `inline`. `false` will turn off line numbers if it's configured to be on in site config. {{< new-in "0.60.0" >}} `table` will give copy-and-paste friendly code blocks.
* `hl_lines`: lists a set of line numbers or line number ranges to be highlighted.
* `linenostart=199`: starts the line number count from 199.
### Example: Highlight Shortcode
@@ -1,10 +1,9 @@
---
title: Taxonomies
linktitle:
description: Hugo includes support for user-defined taxonomies to help you demonstrate logical relationships between content for the end users of your website.
description: Hugo includes support for user-defined taxonomies..
date: 2017-02-01
publishdate: 2017-02-01
lastmod: 2017-02-01
keywords: [taxonomies,metadata,front matter,terms]
categories: [content management]
menu:
@@ -32,7 +31,6 @@ Term
Value
: a piece of content assigned to a term
{{< youtube pCPCQgqC8RA >}}
## Example Taxonomy: Movie Website
@@ -97,9 +95,13 @@ Without adding a single line to your [site config][config] file, Hugo will autom
If you do not want Hugo to create any taxonomies, set `disableKinds` in your [site config][config] to the following:
{{< code-toggle copy="false" >}}
disableKinds = ["taxonomy","taxonomyTerm"]
disableKinds = ["taxonomy","term"]
{{</ code-toggle >}}
{{< new-in "0.73.0" >}} We have fixed the before confusing page kinds used for taxonomies (see the listing below) to be in line with the terms used when we talk about taxonomies. We have been careful to avoid site breakage, and you should get an ERROR in the console if you need to adjust your `disableKinds` section.
{{< page-kinds >}}
### Default Destinations
When taxonomies are used---and [taxonomy templates][] are provided---Hugo will automatically create both a page listing all the taxonomy's terms and individual pages with lists of content associated with each term. For example, a `categories` taxonomy declared in your configuration and used in your content front matter will create the following pages:
@@ -190,7 +192,7 @@ By using taxonomic weight, the same piece of content can appear in different pos
Currently taxonomies only support the [default `weight => date` ordering of list content](/templates/lists/#default-weight-date). For more information, see the documentation on [taxonomy templates](/templates/taxonomy-templates/).
{{% /note %}}
## Add custom metadata to a Taxonomy Term
## Add custom metadata a Taxonomy or Term
If you need to add custom metadata to your taxonomy terms, you will need to create a page for that term at `/content/<TAXONOMY>/<TERM>/_index.md` and add your metadata in it's front matter. Continuing with our 'Actors' example, let's say you want to add a wikipedia page link to each actor. Your terms pages would be something like this:
@@ -201,7 +203,6 @@ If you need to add custom metadata to your taxonomy terms, you will need to crea
---
{{< /code >}}
You can later use your custom metadata as shown in the [Taxonomy Terms Templates documentation](/templates/taxonomy-templates/#displaying-custom-metadata-in-taxonomy-terms-templates).
[`urlize` template function]: /functions/urlize/
[content section]: /content-management/sections/
+8 -1
View File
@@ -38,6 +38,13 @@ permalinks:
Only the content under `posts/` will have the new URL structure. For example, the file `content/posts/sample-entry.md` with `date: 2017-02-27T19:20:00-05:00` in its front matter will render to `public/2017/02/sample-entry/index.html` at build time and therefore be reachable at `https://example.com/2017/02/sample-entry/`.
To configure the `permalinks` option for pages in the "root" section, use **/** as the key:
{{< code-toggle file="config" copy="false" >}}
permalinks:
/: /:year/:month/:filename/
{{< /code-toggle >}}
If the standard date-based permalink configuration does not meet your needs, you can also format URL segments using [Go time formatting directives](https://golang.org/pkg/time/#Time.Format). For example, a URL structure with two digit years and month and day digits without zero padding can be accomplished with:
{{< code-toggle file="config" copy="false" >}}
@@ -202,7 +209,7 @@ content/posts/post-1.md
## Ugly URLs
If you would like to have what are often referred to as "ugly URLs" (e.g., example.com/urls.html), set `uglyurls = true` or `uglyurls: true` in your site's `config.toml` or `config.yaml`, respectively. You can also use the `--uglyURLs=true` [flag from the command line][usage] with `hugo` or `hugo server`.
If you would like to have what are often referred to as "ugly URLs" (e.g., example.com/urls.html), set `uglyurls = true` or `uglyurls: true` in your site's `config.toml` or `config.yaml`, respectively. You can also set the `HUGO_UGLYURLS` environment variable to `true` when running `hugo` or `hugo server`.
If you want a specific piece of content to have an exact URL, you can specify this in the [front matter][] under the `url` key. The following are examples of the same content directory and what the eventual URL structure will be when Hugo runs with its default behavior.
+1 -1
View File
@@ -107,7 +107,7 @@ On a Mac, you can install [Hub](https://github.com/github/hub) using [Homebrew](
brew install hub
```
Now we'll create an [alias in Bash](http://tldp.org/LDP/abs/html/aliases.html) so that typing `git` actually runs `Hub`:
Now we'll create an [alias in Bash](https://tldp.org/LDP/abs/html/aliases.html) so that typing `git` actually runs `Hub`:
```
echo "alias git='hub'" >> ~/.bash_profile
+2 -2
View File
@@ -229,7 +229,7 @@ Which will render as follows in the Hugo docs:
> Without the threat of punishment, there is no joy in flight. - [Kobo Abe][abe]
{{% note "Blockquotes `!=` Admonitions" %}}
Previous versions of Hugo documentation used blockquotes to draw attention to text. This is *not* the [intended semantic use of `<blockquote>`](http://html5doctor.com/cite-and-blockquote-reloaded/). Use blockquotes when quoting. To note or warn your user of specific information, use the admonition shortcodes that follow.
Previous versions of Hugo documentation used blockquotes to draw attention to text. This is *not* the [intended semantic use of `<blockquote>`](https://html5doctor.com/cite-and-blockquote-reloaded/). Use blockquotes when quoting. To note or warn your user of specific information, use the admonition shortcodes that follow.
{{% /note %}}
## Admonitions
@@ -330,5 +330,5 @@ Similar to [contributing to Hugo development](/contribute/development/), the Hug
[ghforking]: https://help.github.com/articles/fork-a-repo/
[hugodev]: /contribute/development/
[shortcodeparams]: content-management/shortcodes/#shortcodes-without-markdown
[sourceforge]: http://docutils.sourceforge.net/docs/ref/rst/directives.html#admonitions
[sourceforge]: https://docutils.sourceforge.io/docs/ref/rst/directives.html#admonitions
[templating function]: /functions/
+2 -1
View File
@@ -15,6 +15,7 @@ aliases: []
toc: false
layout: documentation-home
---
Hugo is the **world's fastest static website engine.** It's written in Go (aka Golang) and developed by [bep](https://github.com/bep), [spf13](https://github.com/spf13) and [friends](https://github.com/gohugoio/hugo/graphs/contributors).
Hugo is the **world's fastest static website engine.** It's written in Go (aka Golang) and developed by [bep](https://github.com/bep), [spf13](https://github.com/spf13) and [friends](https://github.com/gohugoio/hugo/graphs/contributors).
Below you will find some of the most common and helpful pages from our documentation.
+1 -3
View File
@@ -18,8 +18,7 @@ deprecated: false
aliases: []
---
By default all matches will be included. The number of matches can be limitted with an optional third parameter.
By default all matches will be included. The number of matches can be limited with an optional third parameter.
The example below returns a list of all second level headers (`<h2>`) in the content:
@@ -40,7 +39,6 @@ Hugo uses Go's [Regular Expression package](https://golang.org/pkg/regexp/), whi
If you are just learning RegEx, or at least Go's flavor, you can practice pattern matching in the browser at <https://regex101.com/>.
{{% /note %}}
[partials]: /templates/partials/
[`plainify`]: /functions/plainify/
[toc]: /content-management/toc/
+1 -1
View File
@@ -20,7 +20,7 @@ aliases: []
Takes a string containing the name of the variable as input. Returns
an empty string if the variable is not set, otherwise returns the
value of the variable.
value of the variable.
```
{{ getenv "HOME" }}
+34
View File
@@ -0,0 +1,34 @@
---
title: hmac
linktitle: hmac
description: Compute the cryptographic checksum of a message.
godocref:
date: 2020-05-29
publishdate: 2020-05-29
lastmod: 2020-05-29
categories: [functions]
menu:
docs:
parent: "functions"
keywords: [hmac,checksum]
signature: ["hmac HASH_TYPE KEY MESSAGE"]
workson: []
hugoversion:
relatedfuncs: [hmac]
deprecated: false
aliases: [hmac]
---
`hmac` returns a cryptographic hash that uses a key to sign a message.
```
{{ hmac "sha256" "Secret key" "Hello world, gophers!"}},
<!-- returns the string "b6d11b6c53830b9d87036272ca9fe9d19306b8f9d8aa07b15da27d89e6e34f40"
```
Supported hash functions:
* md5
* sha1
* sha256
* sha512
+1 -1
View File
@@ -22,5 +22,5 @@ aliases: []
In the result `&` becomes `&amp;` and so on. It escapes only: `<`, `>`, `&`, `'` and `"`.
```
{{ htmlEscape "Hugo & Caddy > Wordpress & Apache" }} → "Hugo &amp; Caddy &gt; Wordpress &amp; Apache"
{{ htmlEscape "Hugo & Caddy > WordPress & Apache" }} → "Hugo &amp; Caddy &gt; WordPress &amp; Apache"
```
+2 -2
View File
@@ -19,10 +19,10 @@ deprecated: false
aliases: []
---
`htmlUnescape` returns the given string with HTML escape codes un-escaped.
`htmlUnescape` returns the given string with HTML escape codes un-escaped.
Remember to pass the output of this to `safeHTML` if fully un-escaped characters are desired. Otherwise, the output will be escaped again as normal.
```
{{ htmlUnescape "Hugo &amp; Caddy &gt; Wordpress &amp; Apache" }} → "Hugo & Caddy > Wordpress & Apache"
{{ htmlUnescape "Hugo &amp; Caddy &gt; WordPress &amp; Apache" }} → "Hugo & Caddy > WordPress & Apache"
```
+2 -2
View File
@@ -20,7 +20,7 @@ deprecated: false
draft: false
aliases: []
---
`hugo` returns an instance that contains the following functions:
hugo.Generator
@@ -29,7 +29,7 @@ hugo.Generator
hugo.Version
: the current version of the Hugo binary you are using e.g. `0.63.2`
`hugo` returns an instance that contains the following functions:
hugo.Environment
@@ -38,8 +38,6 @@ The function takes multiple indices as arguments, and this can be used to get ne
{{ index $map "c" "e" }} => 20
```
## Example: Load Data from a Path Based on Front Matter Params
Assume you want to add a `location = ""` field to your front matter for every article written in `content/vacations/`. You want to use this field to populate information about the location at the bottom of the article in your `single.html` template. You also have a directory in `data/locations/` that looks like the following:
@@ -93,4 +91,3 @@ Now the call will return the specific file according to the location specified i
{{ (index .Site.Data.locations .Params.location).pop_city }}
=> 658390
```
+12 -2
View File
@@ -5,13 +5,13 @@ description: Encodes a given object to JSON.
godocref:
date: 2017-02-01
publishdate: 2017-02-01
lastmod: 2017-02-01
lastmod: 2020-04-13
categories: [functions]
menu:
docs:
parent: "functions"
keywords: [strings,json]
signature: ["jsonify INPUT"]
signature: ["jsonify INPUT", "jsonify OPTIONS INPUT"]
workson: []
hugoversion:
relatedfuncs: [plainify]
@@ -19,8 +19,18 @@ deprecated: false
aliases: []
---
Jsonify encodes a given object to JSON.
To customize the printing of the JSON, pass a dictionary of options as the first
argument. Supported options are "prefix" and "indent". Each JSON element in
the output will begin on a new line beginning with *prefix* followed by one or
more copies of *indent* according to the indentation nesting.
```
{{ dict "title" .Title "content" .Plain | jsonify }}
{{ dict "title" .Title "content" .Plain | jsonify (dict "indent" " ") }}
{{ dict "title" .Title "content" .Plain | jsonify (dict "prefix" " " "indent" " ") }}
```
See also the `.PlainWords`, `.Plain`, and `.RawContent` [page variables][pagevars].
-1
View File
@@ -21,7 +21,6 @@ draft: false
aliases: []
---
```
{{ range last 10 .Pages }}
{{ .Render "summary" }}
+3
View File
@@ -7,6 +7,9 @@ date: 2017-02-01
publishdate: 2017-02-01
lastmod: 2017-04-18
categories: [functions]
menu:
docs:
parent: "functions"
keywords: []
signature: ["len INPUT"]
workson: [lists,taxonomies,terms]
+1 -1
View File
@@ -38,4 +38,4 @@ aliases: []
| `math.Round` | Returns the nearest integer, rounding half away from zero. | `{{math.Round 1.5}}` &rarr; `2` |
| `math.Log` | Returns the natural logarithm of the given number. | `{{math.Log 42}}` &rarr; `3.737` |
| `math.Sqrt` | Returns the square root of the given number. | `{{math.Sqrt 81}}` &rarr; `9` |
| `math.Pow` | Returns the first number raised to the power of the second number. | `{{math.Pow 2 3}}` &rarr; `8` |
-2
View File
@@ -19,8 +19,6 @@ deprecated: false
aliases: []
---
```
{{ md5 "Hello world, gophers!" }}
<!-- returns the string "b3029f756f98f79e7f1b7f1d1f0dd53b" -->
+1 -4
View File
@@ -14,7 +14,7 @@ keywords: [strings]
signature: ["plainify INPUT"]
workson: []
hugoversion:
relatedfuncs: [jsonify,]
relatedfuncs: [jsonify]
deprecated: false
aliases: []
---
@@ -25,7 +25,4 @@ aliases: []
See also the `.PlainWords`, `.Plain`, and `.RawContent` [page variables][pagevars].
[pagevars]: /variables/page/
+1 -1
View File
@@ -20,6 +20,6 @@ draft: false
aliases: []
---
Just like in the Go programming language, Go and Hugo templates make heavy use of `range` to iterate over a map, array or slice.
Just like in the Go programming language, Go and Hugo templates make heavy use of `range` to iterate over a map, array or slice. Other templating languages use a foreach for the equivalent functionality.
`range` is fundamental to templating in Hugo. (See the [Introduction to Hugo Templates](/templates/introduction/) for more examples.)
+1 -1
View File
@@ -1,6 +1,6 @@
---
title: relURL
description: Given a string, prepends the relative URL according to a page's position in the project directory structure.
description: Creates a baseURL-relative URL.
godocref:
date: 2017-02-01
publishdate: 2017-02-01
+1 -1
View File
@@ -69,4 +69,4 @@ With the `.URL` page variable piped through `safeURL`, we get the desired output
[configuration]: /getting-started/configuration/
[menus]: /content-management/menus/
[RFC 3986]: http://tools.ietf.org/html/rfc3986
[RFC 3986]: https://tools.ietf.org/html/rfc3986
+5
View File
@@ -113,6 +113,11 @@ Removes the given key
{{ .Scratch.Delete "greetings" }}
```
#### .Values
`Values` returns the raw backing map. Note that you should just use this method on the locally scoped `Scratch` instances you obtain via `newScratch`, not
`.Page.Scratch` etc., as that will lead to concurrency issues.
## Scope
The scope of the backing data is global for the given `Page` or `Shortcode`, and spans partial and shortcode includes.
+1 -1
View File
@@ -48,4 +48,4 @@ $indexStartingAt1 := (add $index 1)
```
[GNU's seq]: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html#seq-invocation
[GNU's seq]: https://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html#seq-invocation
@@ -22,7 +22,7 @@ toc: false
deprecated: false
---
A template file is any file living below the `layouts` directories of either the project or any of its theme components incudling partials and shortcodes.
A template file is any file living below the `layouts` directories of either the project or any of its theme components including partials and shortcodes.
The function is particularly handy with dynamic path. The following example ensures the build will not break on a `.Type` missing its dedicated `header` partial.
+1 -1
View File
@@ -29,7 +29,7 @@ aliases: []
## Example: Using `time` to get Month Index
The following example takes a UNIX timestamp---set as `utimestamp: "1489276800"` in a content's front matter---converts the timestamp (string) to an integer using the [`int` function][int], and then uses [`printf`][] to convert the `Month` property of `time` into an index.
The following example takes a UNIX timestamp---set as `utimestamp: "1489276800"` in a content's front matter---converts the timestamp (string) to an integer using the [`int` function][int], and then uses [`printf`][] to convert the `Month` property of `time` into an index.
The following example may be useful when setting up [multilingual sites][multilingual]:
-2
View File
@@ -33,6 +33,4 @@ Since both values are integers, they can be subtracted and then divided by the n
Hugo's output is *static*. For the example above to be realistic, the site needs to be built every day.
{{% /note %}}
[partial template]: /templates/partials/
+1 -1
View File
@@ -21,7 +21,7 @@ aliases: []
```
{{ $url := urls.Parse "http://www.gohugo.io" }}
{{ $url := urls.Parse "http://www.gohugo.io" }}
```
and returns a [URL](https://godoc.org/net/url#URL) structure. The struct fields are accessed via the `.` notation:
+2 -2
View File
@@ -114,7 +114,7 @@ You can also put the returned value of the `where` clauses into a variable:
## Use `where` with `first`
Using `first` and [`where`][wherefunction] together can be very
Using `first` and `where` together can be very
powerful. Below snippet gets a list of posts only from [**main
sections**](#mainsections), sorts it using the [default
ordering](/templates/lists/) for lists (i.e., `weight => date`), and
@@ -138,7 +138,7 @@ You can also nest `where` clauses to drill down on lists of content by more than
Filtering only works for set fields. To check whether a field is set or exists, you can use the operand `nil`.
This can be useful to filter a small amount of pages from a large pool. Instead of set field on all pages, you can set field on required pages only.
This can be useful to filter a small amount of pages from a large pool. Instead of setting a field on all pages, you can set that field on required pages only.
Only the following operators are available for `nil`
@@ -85,9 +85,15 @@ ordered
Note that this is only supported with the [Goldmark](#goldmark) renderer.
These Render Hooks allow custom templates to render links and images from markdown.
Render Hooks allow custom templates to override markdown rendering functionality. You can do this by creating templates with base names `render-{feature}` in `layouts/_default/_markup`.
You can do this by creating templates with base names `render-link` and/or `render-image` inside `layouts/_default/_markup`.
You can also create type/section specific hooks in `layouts/[type/section]/_markup`, e.g.: `layouts/blog/_markup`.{{< new-in "0.71.0" >}}
The features currently supported are:
* `image`
* `link`
* `heading` {{< new-in "0.71.0" >}}
You can define [Output-Format-](/templates/output-formats) and [language-](/content-management/multilingual/)specific templates if needed.[^hooktemplate] Your `layouts` folder may look like this:
@@ -105,10 +111,11 @@ Some use cases for the above:
* Resolve link references using `.GetPage`. This would make links portable as you could translate `./my-post.md` (and similar constructs that would work on GitHub) into `/blog/2019/01/01/my-post/` etc.
* Add `target=_blank` to external links.
* Resolve and [process](/content-management/image-processing/) images.
* Add [header links](https://remysharp.com/2014/08/08/automatic-permalinks-for-blog-posts).
### Render Hook Templates
Both `render-link` and `render-image` templates will receive this context:
The `render-link` and `render-image` templates will receive this context:
Page
: The [Page](/variables/page/) being rendered.
@@ -125,7 +132,24 @@ Text
PlainText
: The plain variant of the above.
#### Link with title Markdown example :
The `render-heading` template will receive this context:
Page
: The [Page](/variables/page/) being rendered.
Level
: The header level (1--6)
Anchor
: An auto-generated html id unique to the header within the page
Text
: The rendered (HTML) text.
PlainText
: The plain variant of the above.
#### Link with title Markdown example:
```md
[Text](https://www.gohugo.io "Title")
@@ -134,7 +158,7 @@ PlainText
Here is a code example for how the render-link.html template could look:
{{< code file="layouts/_default/_markup/render-link.html" >}}
<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank"{{ end }}>{{ .Text | safeHTML }}</a>
<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}{{ if strings.HasPrefix .Destination "http" }} target="_blank" rel="noopener"{{ end }}>{{ .Text | safeHTML }}</a>
{{< /code >}}
#### Image Markdown example:
@@ -151,5 +175,24 @@ Here is a code example for how the render-image.html template could look:
</p>
{{< /code >}}
[^hooktemplate]: It's currently only possible to have one set of render hook templates, e.g. not per `Type` or `Section`. We may consider that in a future version.
#### Heading link example
Given this template file
{{< code file="layouts/_default/_markup/render-heading.html" >}}
<h{{ .Level }} id="{{ .Anchor | safeURL }}">{{ .Text | safeHTML }} <a href="#{{ .Anchor | safeURL }}">¶</a></h{{ .Level }}>
{{< /code >}}
And this markdown
```md
### Section A
```
The rendered html will be
```html
<h3 id="section-a">Section A <a href="#section-a">¶</a></h3>
```
[^hooktemplate]: It's currently only possible to have one set of render hook templates, e.g. not per `Type` or `Section`. We may consider that in a future version.
@@ -124,7 +124,7 @@ disableHugoGeneratorInject (false)
: Hugo will, by default, inject a generator meta tag in the HTML head on the _home page only_. You can turn it off, but we would really appreciate if you don't, as this is a good way to watch Hugo's popularity on the rise.
disableKinds ([])
: Enable disabling of all pages of the specified *Kinds*. Allowed values in this list: `"page"`, `"home"`, `"section"`, `"taxonomy"`, `"taxonomyTerm"`, `"RSS"`, `"sitemap"`, `"robotsTXT"`, `"404"`.
: Enable disabling of all pages of the specified *Kinds*. Allowed values in this list: `"page"`, `"home"`, `"section"`, `"taxonomy"`, `"term"`, `"RSS"`, `"sitemap"`, `"robotsTXT"`, `"404"`.
disableLiveReload (false)
: Disable automatic live reloading of browser window.
@@ -298,22 +298,26 @@ enableemoji: true
{{< new-in "0.66.0" >}}
The `build` configuration section contains global build-realated configuration options.
The `build` configuration section contains global build-related configuration options.
{{< code-toggle file="config">}}
[build]
useResourceCacheWhen="fallback"
writeStats = false
{{< /code-toggle >}}
useResourceCacheWhen
: When to use the cached resources in `/resources/_gen` for PostCSS and ToCSS. Valid values are `never`, `always` and `fallback`. The last value means that the cache will be tried if PostCSS/extended version is not available.
writeStats {{< new-in "0.69.0" >}}
: When enabled, a file named `hugo_stats.json` will be written to your project root with some aggregated data about the build, e.g. list of HTML entities published to be used to do [CSS pruning](/hugo-pipes/postprocess/#css-purging-with-postcss). If you're only using this for the production build, you should consider placing it below [config/production](/getting-started/configuration/#configuration-directory). It's also worth mentioning that, due to the nature of the partial server builds, new HTML entities will be added when you add or change them while the server is running, but the old values will not be removed until you restart the server or run a regular `hugo` build.
## Configure Server
{{< new-in "0.67.0" >}}
This is only relevant when running `hugo server`, and it allows to set HTTP headers during development, wihch allows you to test out your Content Security Policy and similar. The configuration format matches [Netlify's](https://docs.netlify.com/routing/headers/#syntax-for-the-netlify-configuration-file) with slighly more powerful [Glob matching](https://github.com/gobwas/glob):
This is only relevant when running `hugo server`, and it allows to set HTTP headers during development, which allows you to test out your Content Security Policy and similar. The configuration format matches [Netlify's](https://docs.netlify.com/routing/headers/#syntax-for-the-netlify-configuration-file) with slighly more powerful [Glob matching](https://github.com/gobwas/glob):
{{< code-toggle file="config">}}
@@ -329,7 +333,7 @@ Referrer-Policy = "strict-origin-when-cross-origin"
Content-Security-Policy = "script-src localhost:1313"
{{< /code-toggle >}}
Since this is is "devlopment only", it may make sense to put it below the `development` environment:
Since this is is "development only", it may make sense to put it below the `development` environment:
{{< code-toggle file="config/development/server">}}
@@ -345,6 +349,20 @@ Content-Security-Policy = "script-src localhost:1313"
{{< /code-toggle >}}
{{< new-in "0.72.0" >}}
You can also specify simple redirects rules for the server. The syntax is again similar to Netlify's.
Note that a `status` code of 200 will trigger a [URL rewrite](https://docs.netlify.com/routing/redirects/rewrites-proxies/), which is what you want in SPA situations, e.g:
{{< code-toggle file="config/development/server">}}
[[redirects]]
from = "/myspa/**"
to = "/myspa/"
status = 200
{{< /code-toggle >}}
## Configure Title Case
@@ -515,7 +533,7 @@ dir = ":cacheDir/modules"
maxAge = -1
```
You can override any of these cache setting in your own `config.toml`.
You can override any of these cache settings in your own `config.toml`.
### The keywords explained
@@ -71,6 +71,9 @@ used by Hugo when generating your website. You can write these files in YAML, JS
From **Hugo 0.31** you can have multiple static directories.
{{% /note %}}
resources
: Caches some files to speed up generation. Can be also used by template authors to distribute built SASS files, so you don't have to have the preprocessor installed. Note: resources directory is not created by default.
[archetypes]: /content-management/archetypes/
[configuration directives]: /getting-started/configuration/#all-variables-yaml
@@ -5,7 +5,7 @@ description: A list of tutorials and books on Hugo.
date: 2019-10-20
publishdate: 2019-10-20
lastmod: 2019-10-20
keywords: [books,tutorials,learning,usage]
keywords: [books, tutorials, learning, usage]
menu:
docs:
parent: "getting-started"
@@ -17,7 +17,9 @@ toc: false
---
## Books
### Hugo In Action
[![Hugo In Action](hia.jpg)](https://www.manning.com/books/hugo-in-action)
Hugo in Action is a step-by-step guide to using Hugo to create static websites. Working with a complete example website and source code samples, youll learn how to build and host a low-maintenance, high-performance site that will wow your users and stay stable without relying on a third-party server.
@@ -25,5 +27,7 @@ Hugo in Action is a step-by-step guide to using Hugo to create static websites.
[Hugo In Action Home Page](https://www.manning.com/books/hugo-in-action)
## Video tutorials
### Video Playlist by Mike Dane
Mike Dane expains the various features of via dedicated tutorials on [Youtube](https://www.youtube.com/watch?list=PLLAZ4kZ9dFpOnyRlyS-liKL5ReHDcj4G3&v=qtIqKaDlqXo).
Mike Dane explains the various features of Hugo via dedicated tutorials on [YouTube](https://www.youtube.com/watch?list=PLLAZ4kZ9dFpOnyRlyS-liKL5ReHDcj4G3&v=qtIqKaDlqXo).
+12 -2
View File
@@ -44,6 +44,10 @@ Download the appropriate version for your platform from [Hugo Releases][releases
Ideally, you should install it somewhere in your `PATH` for easy use. `/usr/local/bin` is the most probable location.
### Docker
We currently do not official Hugo images for Docker, but we do recommend these up to date distributions: https://hub.docker.com/r/klakegg/hugo/
### Homebrew (macOS)
If you are on macOS and using [Homebrew][brew], you can install Hugo with the following one-liner:
@@ -86,6 +90,12 @@ If you are on a Windows machine and use [Scoop][] for package management, you ca
scoop install hugo
```
Or install the extended version with:
```bash
scoop install hugo-extended
```
### Source
#### Prerequisite Tools
@@ -438,7 +448,7 @@ Directory of C:\hugo\sites\example.com
### Snap Package
In any of the [Linux distributions that support snaps][snaps], you may install install the "extended" Sass/SCSS version with this command:
In any of the [Linux distributions that support snaps][snaps], you may install the "extended" Sass/SCSS version with this command:
snap install hugo --channel=extended
@@ -517,7 +527,7 @@ Now that you've installed Hugo, read the [Quick Start guide][quickstart] and exp
[installgo]: https://golang.org/dl/
[linuxbrew]: https://docs.brew.sh/Homebrew-on-Linux
[Path Editor]: https://patheditor2.codeplex.com/
[pygments]: http://pygments.org
[pygments]: https://pygments.org
[quickstart]: /getting-started/quick-start/
[redhatforum]: https://discourse.gohugo.io/t/solved-fedora-copr-repository-out-of-service/2491
[releases]: https://github.com/gohugoio/hugo/releases
@@ -58,7 +58,7 @@ The above will create a new Hugo site in a folder named `quickstart`.
See [themes.gohugo.io](https://themes.gohugo.io/) for a list of themes to consider. This quickstart uses the beautiful [Ananke theme](https://themes.gohugo.io/gohugo-theme-ananke/).
First, download the theme from Github and add it to your site's `theme` directory:
First, download the theme from GitHub and add it to your site's `theme` directory:
```bash
cd quickstart
@@ -83,7 +83,7 @@ echo 'theme = "ananke"' >> config.toml
## Step 4: Add Some Content
You can manually create content files (for example as `content/<CATEGORY>/<FILE>.<FORMAT>`) and provide metadata in them, however you can use the `new` command to do few things for you (like add title and date):
You can manually create content files (for example as `content/<CATEGORY>/<FILE>.<FORMAT>`) and provide metadata in them, however you can use the `new` command to do a few things for you (like add title and date):
```
hugo new posts/my-first-post.md
@@ -58,7 +58,7 @@ Next, execute this command to generate a new keypair called `rsa_id`:
You'll be prompted for a passphrase, which is an extra layer of protection. Enter the passphrase you'd like to use, and then enter it again when prompted, or leave it blank if you don't want to have a passphrase. Not using a passphrase will let you transfer files non-interactively, as you won't be prompted for a password when you log in, but it is slightly less secure.
To make logging in easier, add a definition for your web host to the file `~/.ssh/config` with the following command, replacing `HOST` with the IP address or hostname of your web host, and `USER` with the username you use to log in to your web host when transfering files:
To make logging in easier, add a definition for your web host to the file `~/.ssh/config` with the following command, replacing `HOST` with the IP address or hostname of your web host, and `USER` with the username you use to log in to your web host when transferring files:
```
~/.ssh/$ cat >> config <<EOF
@@ -1,7 +1,7 @@
---
title: Host on AWS Amplify
linktitle: Host on AWS Amplify
description: Develop and deploy a cloud-powered web app with AWS Amplify.
description: Develop and deploy a cloud-powered web app with AWS Amplify.
date: 2018-01-31
publishdate: 2018-01-31
lastmod: 2018-01-31
@@ -44,29 +44,14 @@ AWS Amplify is a combination of client library, CLI toolchain, and a Console for
## Using a Newer Version of Hugo
If you need to use a different, perhaps newer, version of Hugo than the version currently supported by AWS Amplify, you can modify your build commands to include the downloading of Hugo itself. Here's an example of a build definition that includes the downloading of Hugo. Note that in ths example the "extended" version of Hugo is being used which includes support for SASS/SCSS.
If you need to use a different, perhaps newer, version of Hugo than the version currently supported by AWS Amplify:
1. Visit the [AWS Amplify Console](https://console.aws.amazon.com/amplify/home), and click the app you would like to modify
1. In the side navigation bar, Under App Settings, click **Build settings**
1. On the Build settings page, near the bottom, there is a section called **Build image settings**. Click **Edit**
1. Under **Live package updates**, click **Add package version override**
1. From the selection, click **Hugo** and ensure the version field says `latest`
1. Click **Save** to save the changes.
```
version: 0.1
frontend:
phases:
# IMPORTANT - Please verify your build commands
build:
commands:
- wget https://github.com/gohugoio/hugo/releases/download/v0.62.2/hugo_extended_0.62.2_Linux-64bit.tar.gz
- tar -xf hugo_extended_0.62.2_Linux-64bit.tar.gz
- mv hugo /usr/bin/hugo
- rm -rf hugo_extended_0.62.2_Linux-64bit.tar.gz
- hugo version
- hugo
artifacts:
# IMPORTANT - Please verify your build output directory
baseDirectory: public
files:
- '**/*'
cache:
paths: []
```
[Quick Start]: /getting-started/quick-start/
@@ -42,7 +42,7 @@ To create a Project Pages site, choose a method from the *Project Pages* section
## GitHub User or Organization Pages
As mentioned [the GitHub Pages documentation][ghorgs], you can host a user/organization page in addition to project pages. Here are the key differences in GitHub Pages websites for Users and Organizations:
As mentioned in the [GitHub Pages documentation][ghorgs], you can host a user/organization page in addition to project pages. Here are the key differences in GitHub Pages websites for Users and Organizations:
1. You must use a `<USERNAME>.github.io` to host your **generated** content
2. Content from the `master` branch will be used to publish your GitHub Pages site
@@ -54,10 +54,10 @@ This is a much simpler setup as your Hugo files and generated content are publis
1. Create a `<YOUR-PROJECT>` (e.g. `blog`) repository on GitHub. This repository will contain Hugo's content and other source files.
2. Create a `<USERNAME>.github.io` GitHub repository. This is the repository that will contain the fully rendered version of your Hugo website.
3. `git clone <YOUR-PROJECT-URL> && cd <YOUR-PROJECT>`
4. Paste your existing Hugo project into a new local `<YOUR-PROJECT>` repository. Make sure your website works locally (`hugo server` or `hugo server -t <YOURTHEME>`) and open your browser to <http://localhost:1313>.
4. Paste your existing Hugo project into the new local `<YOUR-PROJECT>` repository. Make sure your website works locally (`hugo server` or `hugo server -t <YOURTHEME>`) and open your browser to <http://localhost:1313>.
5. Once you are happy with the results:
* Press <kbd>Ctrl</kbd>+<kbd>C</kbd> to kill the server
* Before proceeding run `rm -rf public` to completely remove the `public` directory
* Before proceeding run `rm -rf public` to completely remove the `public` directory
6. `git submodule add -b master https://github.com/<USERNAME>/<USERNAME>.github.io.git public`. This creates a git [submodule][]. Now when you run the `hugo` command to build your site to `public`, the created `public` directory will have a different remote origin (i.e. hosted GitHub repository).
### Put it Into a Script
@@ -24,13 +24,13 @@ draft: false
## Create a KeyCDN Pull Zone
The first step will be to login to your KeyCDN account and create a new zone. Name this whatever you like and select the [Pull Zone](https://www.keycdn.com/support/create-a-pull-zone/) option. As for the origin URL, your site will be running on [GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/getting_started_part_one.html) with a URL of `https://youruser.gitlab.io/reponame/`. Use this as the Origin URL.
The first step will be to login to your KeyCDN account and create a new zone. Name this whatever you like and select the [Pull Zone](https://www.keycdn.com/support/create-a-pull-zone/) option. As for the origin URL, your site will be running on [GitLab Pages](https://docs.gitlab.com/ee/user/project/pages/getting_started_part_one.html) with a URL of `https://youruser.gitlab.io/reponame/`. Use this as the Origin URL.
![Screenshot of KeyCDN's pull zone creation page](/images/hosting-and-deployment/hosting-on-keycdn/keycdn-pull-zone.png)
![Screenshot of KeyCDN's pull zone creation page](/images/hosting-and-deployment/hosting-on-keycdn/keycdn-pull-zone.png)
While the origin location doesnt exist yet, you will need to use your new Zone URL address (or [Zonealias](https://www.keycdn.com/support/create-a-zonealias/)) in the `.gitlab-ci.yml` file that will be uploaded to your GitLab project.
While the origin location doesnt exist yet, you will need to use your new Zone URL address (or [Zone Alias](https://www.keycdn.com/support/create-a-zone-alias/)) in the `.gitlab-ci.yml` file that will be uploaded to your GitLab project.
Ensure that you use your Zone URL or Zonealias as the `BASEURL` variable in the example below. This will be the user-visible website address.
Ensure that you use your Zone URL or Zone alias as the `BASEURL` variable in the example below. This will be the user-visible website address.
## Configure Your .gitlab-ci.yml File
@@ -19,7 +19,7 @@ aliases: []
toc: true
---
You can use the "hugo deploy" command to upload your site directly to a Google Cloud Storage (GCS) bucket, an AWS S3 bucket, and/or an Azure Storage bucket.
You can use the "hugo deploy" command to upload your site directly to a Google Cloud Storage (GCS) bucket, an AWS S3 bucket, and/or an Azure Storage container.
## Assumptions
@@ -46,7 +46,7 @@ Follow the [AWS instructions for how to create a bucket](https://docs.aws.amazon
### Azure Storage
Follow the [Azure instructions for how to create a bucket](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-portal).
Follow the [Azure instructions for how to create a storage container](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-portal).
## Configure the deployment
@@ -58,7 +58,7 @@ Any of the above can be omitted.
min
: The minimum Hugo version supported, e.g. `0.55.0`
max
max
: The maximum Hugo version supported, e.g. `0.55.0`
extended
@@ -73,7 +73,7 @@ extended
ignoreConfig = false
disable = false
[[module.imports]]
path = "my-shortcodes"
path = "my-shortcodes"
{{< /code-toggle >}}
path

Some files were not shown because too many files have changed in this diff Show More