diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-08-05 11:13:49 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-08-06 19:58:41 +0200 |
commit | 789ef8c639e4621abd36da530bcb5942ac9297da (patch) | |
tree | f225fc3663affc49805f1d309b77b096d40fc8f6 /transform/livereloadinject | |
parent | 71931b30b1813b146aaa60f5cdab16c0f9ebebdb (diff) |
Add support for minification of final output
Hugo Pipes added minification support for resources fetched via ´resources.Get` and similar.
This also adds support for minification of the final output for supported output formats: HTML, XML, SVG, CSS, JavaScript, JSON.
To enable, run Hugo with the `--minify` flag:
```bash
hugo --minify
```
This commit is also a major spring cleaning of the `transform` package to allow the new minification step fit into that processing chain.
Fixes #1251
Diffstat (limited to 'transform/livereloadinject')
-rw-r--r-- | transform/livereloadinject/livereloadinject.go | 47 | ||||
-rw-r--r-- | transform/livereloadinject/livereloadinject_test.go | 41 |
2 files changed, 88 insertions, 0 deletions
diff --git a/transform/livereloadinject/livereloadinject.go b/transform/livereloadinject/livereloadinject.go new file mode 100644 index 000000000..e04b977f7 --- /dev/null +++ b/transform/livereloadinject/livereloadinject.go @@ -0,0 +1,47 @@ +// Copyright 2018 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 livereloadinject + +import ( + "bytes" + "fmt" + + "github.com/gohugoio/hugo/helpers" + "github.com/gohugoio/hugo/transform" +) + +// New creates a function that can be used +// to inject a script tag for the livereload JavaScript in a HTML document. +func New(port int) transform.Transformer { + return func(ft transform.FromTo) error { + b := ft.From().Bytes() + endBodyTag := "</body>" + match := []byte(endBodyTag) + replaceTemplate := `<script data-no-instant>document.write('<script src="/livereload.js?port=%d&mindelay=10"></' + 'script>')</script>%s` + replace := []byte(fmt.Sprintf(replaceTemplate, port, endBodyTag)) + + newcontent := bytes.Replace(b, match, replace, 1) + if len(newcontent) == len(b) { + endBodyTag = "</BODY>" + replace := []byte(fmt.Sprintf(replaceTemplate, port, endBodyTag)) + match := []byte(endBodyTag) + newcontent = bytes.Replace(b, match, replace, 1) + } + + if _, err := ft.To().Write(newcontent); err != nil { + helpers.DistinctWarnLog.Println("Failed to inject LiveReload script:", err) + } + return nil + } +} diff --git a/transform/livereloadinject/livereloadinject_test.go b/transform/livereloadinject/livereloadinject_test.go new file mode 100644 index 000000000..0e0f708d3 --- /dev/null +++ b/transform/livereloadinject/livereloadinject_test.go @@ -0,0 +1,41 @@ +// Copyright 2018 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 livereloadinject + +import ( + "bytes" + "fmt" + "strings" + "testing" + + "github.com/gohugoio/hugo/transform" +) + +func TestLiveReloadInject(t *testing.T) { + doTestLiveReloadInject(t, "</body>") + doTestLiveReloadInject(t, "</BODY>") +} + +func doTestLiveReloadInject(t *testing.T, bodyEndTag string) { + out := new(bytes.Buffer) + in := strings.NewReader(bodyEndTag) + + tr := transform.New(New(1313)) + tr.Apply(out, in) + + expected := fmt.Sprintf(`<script data-no-instant>document.write('<script src="/livereload.js?port=1313&mindelay=10"></' + 'script>')</script>%s`, bodyEndTag) + if string(out.Bytes()) != expected { + t.Errorf("Expected %s got %s", expected, string(out.Bytes())) + } +} |