transform: Explicitly bind LiveReload to server port

If hugo server is run on port 80 or 443, LiveReload does not
correctly bind to the same port, instead using port 35729.
This commit adds functionality to inform LiveReload of the
correct port to bind to.

See https://github.com/livereload/livereload-js/issues/16

Partially contributed by Jeff Minard (@chuyskywalker).

Fixes #2205
This commit is contained in:
Dragos Plesca authored and Anthony Fok committed 2016-06-30 16:47:56 -06:00
1 parent 0ce6438268
commit 7e08d23eeb
2 files changed
+10 -4

No files matched your search

+6 -3
View File
@@ -16,18 +16,21 @@ package transform
import ( import (
"bytes" "bytes"
"fmt" "fmt"
"github.com/spf13/viper"
) )
func LiveReloadInject(ct contentTransformer) { func LiveReloadInject(ct contentTransformer) {
endBodyTag := "</body>" endBodyTag := "</body>"
match := []byte(endBodyTag) match := []byte(endBodyTag)
replaceTemplate := `<script data-no-instant>document.write('<script src="/livereload.js?mindelay=10"></' + 'script>')</script>%s` port := viper.Get("port")
replace := []byte(fmt.Sprintf(replaceTemplate, 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(ct.Content(), match, replace, 1) newcontent := bytes.Replace(ct.Content(), match, replace, 1)
if len(newcontent) == len(ct.Content()) { if len(newcontent) == len(ct.Content()) {
endBodyTag = "</BODY>" endBodyTag = "</BODY>"
replace := []byte(fmt.Sprintf(replaceTemplate, endBodyTag)) replace := []byte(fmt.Sprintf(replaceTemplate, port, endBodyTag))
match := []byte(endBodyTag) match := []byte(endBodyTag)
newcontent = bytes.Replace(ct.Content(), match, replace, 1) newcontent = bytes.Replace(ct.Content(), match, replace, 1)
} }
+4 -1
View File
@@ -18,6 +18,8 @@ import (
"fmt" "fmt"
"strings" "strings"
"testing" "testing"
"github.com/spf13/viper"
) )
func TestLiveReloadInject(t *testing.T) { func TestLiveReloadInject(t *testing.T) {
@@ -26,13 +28,14 @@ func TestLiveReloadInject(t *testing.T) {
} }
func doTestLiveReloadInject(t *testing.T, bodyEndTag string) { func doTestLiveReloadInject(t *testing.T, bodyEndTag string) {
viper.Set("port", 1313)
out := new(bytes.Buffer) out := new(bytes.Buffer)
in := strings.NewReader(bodyEndTag) in := strings.NewReader(bodyEndTag)
tr := NewChain(LiveReloadInject) tr := NewChain(LiveReloadInject)
tr.Apply(out, in, []byte("path")) tr.Apply(out, in, []byte("path"))
expected := fmt.Sprintf(`<script data-no-instant>document.write('<script src="/livereload.js?mindelay=10"></' + 'script>')</script>%s`, bodyEndTag) 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 { if string(out.Bytes()) != expected {
t.Errorf("Expected %s got %s", expected, string(out.Bytes())) t.Errorf("Expected %s got %s", expected, string(out.Bytes()))
} }