mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-17 21:01:26 +02:00
Add support for URLs relative to context root
Setting `RelativeURLs` to `true` will make all relative URLs in the site *really* relative. And will do so with speed. So: In `/post/myblogpost.html`: `/mycss.css` becomes `../mycss.css` The same in `/index.html` will become: `./mycss.css` etc. Note that absolute URLs will not be touched (either external resources, or URLs constructed with `BaseURL`). The speediness is about the same as before: ``` benchmark old ns/op new ns/op delta BenchmarkAbsURL 17462 18164 +4.02% BenchmarkAbsURLSrcset 18842 19632 +4.19% BenchmarkXMLAbsURLSrcset 18643 19313 +3.59% BenchmarkXMLAbsURL 9283 9656 +4.02% benchmark old allocs new allocs delta BenchmarkAbsURL 24 28 +16.67% BenchmarkAbsURLSrcset 29 32 +10.34% BenchmarkXMLAbsURLSrcset 27 30 +11.11% BenchmarkXMLAbsURL 12 14 +16.67% benchmark old bytes new bytes delta BenchmarkAbsURL 3154 3404 +7.93% BenchmarkAbsURLSrcset 2376 2573 +8.29% BenchmarkXMLAbsURLSrcset 2569 2763 +7.55% BenchmarkXMLAbsURL 1888 1998 +5.83% ``` Fixes #1104 Fixes #622 Fixes #937 Fixes #157
This commit is contained in:
@@ -1397,16 +1397,21 @@ func (s *Site) renderAndWriteXML(name string, dest string, d interface{}, layout
|
||||
|
||||
err := s.render(name, d, renderBuffer, layouts...)
|
||||
|
||||
absURLInXML, err := transform.AbsURLInXML()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
outBuffer := bp.GetBuffer()
|
||||
defer bp.PutBuffer(outBuffer)
|
||||
|
||||
transformer := transform.NewChain(absURLInXML...)
|
||||
transformer.Apply(outBuffer, renderBuffer)
|
||||
var path []byte
|
||||
if viper.GetBool("RelativeURLs") {
|
||||
path = []byte(helpers.GetDottedRelativePath(dest))
|
||||
} else {
|
||||
s := viper.GetString("BaseURL")
|
||||
if !strings.HasSuffix(s, "/") {
|
||||
s += "/"
|
||||
}
|
||||
path = []byte(s)
|
||||
}
|
||||
transformer := transform.NewChain(transform.AbsURLInXML)
|
||||
transformer.Apply(outBuffer, renderBuffer, path)
|
||||
|
||||
if err == nil {
|
||||
err = s.WriteDestFile(dest, outBuffer)
|
||||
@@ -1426,20 +1431,32 @@ func (s *Site) renderAndWritePage(name string, dest string, d interface{}, layou
|
||||
|
||||
transformLinks := transform.NewEmptyTransforms()
|
||||
|
||||
if viper.GetBool("CanonifyURLs") {
|
||||
absURL, err := transform.AbsURL()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
transformLinks = append(transformLinks, absURL...)
|
||||
if viper.GetBool("RelativeURLs") || viper.GetBool("CanonifyURLs") {
|
||||
transformLinks = append(transformLinks, transform.AbsURL)
|
||||
}
|
||||
|
||||
if viper.GetBool("watch") && !viper.GetBool("DisableLiveReload") {
|
||||
transformLinks = append(transformLinks, transform.LiveReloadInject)
|
||||
}
|
||||
|
||||
var path []byte
|
||||
|
||||
if viper.GetBool("RelativeURLs") {
|
||||
translated, err := s.PageTarget().(target.OptionalTranslator).TranslateRelative(dest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
path = []byte(helpers.GetDottedRelativePath(translated))
|
||||
} else if viper.GetBool("CanonifyURLs") {
|
||||
s := viper.GetString("BaseURL")
|
||||
if !strings.HasSuffix(s, "/") {
|
||||
s += "/"
|
||||
}
|
||||
path = []byte(s)
|
||||
}
|
||||
|
||||
transformer := transform.NewChain(transformLinks...)
|
||||
transformer.Apply(outBuffer, renderBuffer)
|
||||
transformer.Apply(outBuffer, renderBuffer, path)
|
||||
|
||||
if err == nil {
|
||||
if err = s.WriteDestPage(dest, outBuffer); err != nil {
|
||||
|
Reference in New Issue
Block a user