shithub: hugo

Download patch

ref: a7f51703c4b3acdea7539bde6caed450183db18d
parent: 80ebe0578a1b5cbdcb837be4afc5c58aedb8a20a
author: Bjørn Erik Pedersen <[email protected]>
date: Sat Jun 4 09:45:56 EDT 2016

Add Hugo generator tag to home page if not present

Fixes #2182

--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -1960,6 +1960,13 @@
 		transformLinks = append(transformLinks, transform.LiveReloadInject)
 	}
 
+	// For performance reasons we only inject the Hugo generator tag on the home page.
+	if n, ok := d.(*Node); ok && n.IsHome {
+		if !viper.GetBool("DisableHugoGeneratorInject") {
+			transformLinks = append(transformLinks, transform.HugoGeneratorInject)
+		}
+	}
+
 	var path []byte
 
 	if viper.GetBool("RelativeURLs") {
--- /dev/null
+++ b/transform/hugogeneratorinject.go
@@ -1,0 +1,44 @@
+// Copyright 2016 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 transform
+
+import (
+	"bytes"
+	"fmt"
+	"regexp"
+
+	"github.com/spf13/hugo/helpers"
+)
+
+var metaTagsCheck = regexp.MustCompile(`(?i)<meta\s+name=['|"]?generator['|"]?`)
+var hugoGeneratorTag = fmt.Sprintf(`<meta name="generator" content="Hugo %s" />`, helpers.HugoVersion())
+
+func HugoGeneratorInject(ct contentTransformer) {
+	if metaTagsCheck.Match(ct.Content()) {
+		ct.Write(ct.Content())
+		return
+	}
+
+	head := "<head>"
+	replace := []byte(fmt.Sprintf("%s\n\t%s", head, hugoGeneratorTag))
+	newcontent := bytes.Replace(ct.Content(), []byte(head), replace, 1)
+
+	if len(newcontent) == len(ct.Content()) {
+		head := "<HEAD>"
+		replace := []byte(fmt.Sprintf("%s\n\t%s", head, hugoGeneratorTag))
+		newcontent = bytes.Replace(ct.Content(), []byte(head), replace, 1)
+	}
+
+	ct.Write(newcontent)
+}
--- /dev/null
+++ b/transform/hugogeneratorinject_test.go
@@ -1,0 +1,60 @@
+// Copyright 2016 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 transform
+
+import (
+	"bytes"
+	"testing"
+
+	"github.com/spf13/hugo/helpers"
+)
+
+func TestHugoGeneratorInject(t *testing.T) {
+	hugoGeneratorTag = "META"
+	for i, this := range []struct {
+		in     string
+		expect string
+	}{
+		{`<head>
+	<foo />
+</head>`, `<head>
+	META
+	<foo />
+</head>`},
+		{`<HEAD>
+	<foo />
+</HEAD>`, `<HEAD>
+	META
+	<foo />
+</HEAD>`},
+		{`<head><meta name="generator" content="Jekyll" /></head>`, `<head><meta name="generator" content="Jekyll" /></head>`},
+		{`<head><meta name='generator' content='Jekyll' /></head>`, `<head><meta name='generator' content='Jekyll' /></head>`},
+		{`<head><meta name=generator content=Jekyll /></head>`, `<head><meta name=generator content=Jekyll /></head>`},
+		{`<head><META     NAME="GENERATOR" content="Jekyll" /></head>`, `<head><META     NAME="GENERATOR" content="Jekyll" /></head>`},
+		{"", ""},
+		{"</head>", "</head>"},
+		{"<head>", "<head>\n\tMETA"},
+	} {
+		in := helpers.StringToReader(this.in)
+		out := new(bytes.Buffer)
+
+		tr := NewChain(HugoGeneratorInject)
+		tr.Apply(out, in, []byte(""))
+
+		if out.String() != this.expect {
+			t.Errorf("[%d] Expected \n%q got \n%q", i, this.expect, out.String())
+		}
+	}
+
+}