shithub: hugo

Download patch

ref: 71ae9b4533083be185c5314c9c5b273cc3bd07bd
parent: 199816fddd6f16b4a3e9a737530c7738f0da1b24
author: Bjørn Erik Pedersen <[email protected]>
date: Mon Aug 14 05:24:38 EDT 2017

hugolib: Rewrite replaceDivider to reduce memory allocation

```bash
name              old time/op    new time/op    delta
ReplaceDivider-4   9.76µs ±105%    7.96µs ±24%     ~     (p=0.690 n=5+5)

name              old alloc/op   new alloc/op   delta
ReplaceDivider-4    3.46kB ± 0%    1.54kB ± 0%  -55.56%  (p=0.008 n=5+5)

name              old allocs/op  new allocs/op  delta
ReplaceDivider-4      6.00 ± 0%      1.00 ± 0%  -83.33%  (p=0.008 n=5+5)
```

--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -18,6 +18,7 @@
 	"errors"
 	"fmt"
 	"reflect"
+	"unicode"
 
 	"github.com/bep/gitmap"
 
@@ -488,17 +489,23 @@
 // whether the contentis truncated or not.
 // Note: The content slice will be modified if needed.
 func replaceDivider(content, from, to []byte) ([]byte, bool) {
-	sections := bytes.Split(content, from)
+	dividerIdx := bytes.Index(content, from)
+	if dividerIdx == -1 {
+		return content, false
+	}
 
+	afterSummary := content[dividerIdx+len(from):]
+
 	// If the raw content has nothing but whitespace after the summary
 	// marker then the page shouldn't be marked as truncated.  This check
 	// is simplest against the raw content because different markup engines
 	// (rst and asciidoc in particular) add div and p elements after the
 	// summary marker.
-	truncated := (len(sections) == 2 &&
-		len(bytes.Trim(sections[1], " \n\r")) > 0)
+	truncated := bytes.IndexFunc(afterSummary, func(r rune) bool { return !unicode.IsSpace(r) }) != -1
 
-	return bytes.Join(sections, to), truncated
+	content = append(content[:dividerIdx], append(to, afterSummary...)...)
+
+	return content, truncated
 
 }
 
--- a/hugolib/page_test.go
+++ b/hugolib/page_test.go
@@ -1107,7 +1107,7 @@
 		expectedTruncated bool
 	}{
 		{"none", "a", "b", "none", false},
-		{"summary divider content", "divider", "HUGO", "summary HUGO content", true},
+		{"summary <!--more--> content", "<!--more-->", "HUGO", "summary HUGO content", true},
 		{"summary\n\ndivider", "divider", "HUGO", "summary\n\nHUGO", false},
 		{"summary\n\ndivider\n\r", "divider", "HUGO", "summary\n\nHUGO\n\r", false},
 	}