diff options
author | bep <bjorn.erik.pedersen@gmail.com> | 2015-05-16 00:11:39 +0200 |
---|---|---|
committer | bep <bjorn.erik.pedersen@gmail.com> | 2015-05-16 00:11:44 +0200 |
commit | beaa8b1bcabd4be25ac26bea39ab9f7290147e67 (patch) | |
tree | 76095c2b6ec9ddf22477c188c87f47e4c6cee8d6 /transform/absurlreplacer.go | |
parent | e522e5f4154cb6a5d960aeb8920fa3e433641cf6 (diff) |
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
Diffstat (limited to 'transform/absurlreplacer.go')
-rw-r--r-- | transform/absurlreplacer.go | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/transform/absurlreplacer.go b/transform/absurlreplacer.go index e1ba9e54c..35f02ade3 100644 --- a/transform/absurlreplacer.go +++ b/transform/absurlreplacer.go @@ -3,8 +3,6 @@ package transform import ( "bytes" "io" - "net/url" - "strings" "unicode/utf8" ) @@ -23,6 +21,9 @@ type absurllexer struct { // the target for the new absurlified content w io.Writer + // path may be set to a "." relative path + path []byte + pos int // input position start int // item start position width int // width of last element @@ -54,9 +55,8 @@ var prefixes = []*prefix{ } type absURLMatcher struct { - match []byte - quote []byte - replacementURL []byte + match []byte + quote []byte } // match check rune inside word. Will be != ' '. @@ -147,7 +147,7 @@ func checkCandidateBase(l *absurllexer) { } l.pos += len(m.match) l.w.Write(m.quote) - l.w.Write(m.replacementURL) + l.w.Write(l.path) l.start = l.pos } } @@ -188,7 +188,7 @@ func checkCandidateSrcset(l *absurllexer) { l.w.Write([]byte(m.quote)) for i, f := range fields { if f[0] == '/' { - l.w.Write(m.replacementURL) + l.w.Write(l.path) l.w.Write(f[1:]) } else { @@ -252,9 +252,11 @@ func (l *absurllexer) replace() { } func doReplace(ct contentTransformer, matchers []absURLMatcher) { + lexer := &absurllexer{ content: ct.Content(), w: ct, + path: ct.Path(), matchers: matchers} lexer.replace() @@ -265,9 +267,7 @@ type absURLReplacer struct { xmlMatchers []absURLMatcher } -func newAbsURLReplacer(baseURL string) *absURLReplacer { - u, _ := url.Parse(baseURL) - base := []byte(strings.TrimRight(u.String(), "/") + "/") +func newAbsURLReplacer() *absURLReplacer { // HTML dqHTMLMatch := []byte("\"/") @@ -285,14 +285,13 @@ func newAbsURLReplacer(baseURL string) *absURLReplacer { return &absURLReplacer{ htmlMatchers: []absURLMatcher{ - {dqHTMLMatch, dqHTML, base}, - {sqHTMLMatch, sqHTML, base}, + {dqHTMLMatch, dqHTML}, + {sqHTMLMatch, sqHTML}, }, xmlMatchers: []absURLMatcher{ - {dqXMLMatch, dqXML, base}, - {sqXMLMatch, sqXML, base}, + {dqXMLMatch, dqXML}, + {sqXMLMatch, sqXML}, }} - } func (au *absURLReplacer) replaceInHTML(ct contentTransformer) { |