mirror of
https://github.com/gohugoio/hugo.git
synced 2024-12-28 13:51:30 +00:00
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) ```
This commit is contained in:
parent
199816fddd
commit
71ae9b4533
2 changed files with 12 additions and 5 deletions
|
@ -18,6 +18,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
"github.com/bep/gitmap"
|
"github.com/bep/gitmap"
|
||||||
|
|
||||||
|
@ -488,17 +489,23 @@ var (
|
||||||
// whether the contentis truncated or not.
|
// whether the contentis truncated or not.
|
||||||
// Note: The content slice will be modified if needed.
|
// Note: The content slice will be modified if needed.
|
||||||
func replaceDivider(content, from, to []byte) ([]byte, bool) {
|
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
|
// If the raw content has nothing but whitespace after the summary
|
||||||
// marker then the page shouldn't be marked as truncated. This check
|
// marker then the page shouldn't be marked as truncated. This check
|
||||||
// is simplest against the raw content because different markup engines
|
// is simplest against the raw content because different markup engines
|
||||||
// (rst and asciidoc in particular) add div and p elements after the
|
// (rst and asciidoc in particular) add div and p elements after the
|
||||||
// summary marker.
|
// summary marker.
|
||||||
truncated := (len(sections) == 2 &&
|
truncated := bytes.IndexFunc(afterSummary, func(r rune) bool { return !unicode.IsSpace(r) }) != -1
|
||||||
len(bytes.Trim(sections[1], " \n\r")) > 0)
|
|
||||||
|
|
||||||
return bytes.Join(sections, to), truncated
|
content = append(content[:dividerIdx], append(to, afterSummary...)...)
|
||||||
|
|
||||||
|
return content, truncated
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1107,7 +1107,7 @@ func TestReplaceDivider(t *testing.T) {
|
||||||
expectedTruncated bool
|
expectedTruncated bool
|
||||||
}{
|
}{
|
||||||
{"none", "a", "b", "none", false},
|
{"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", "divider", "HUGO", "summary\n\nHUGO", false},
|
||||||
{"summary\n\ndivider\n\r", "divider", "HUGO", "summary\n\nHUGO\n\r", false},
|
{"summary\n\ndivider\n\r", "divider", "HUGO", "summary\n\nHUGO\n\r", false},
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue