mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
transform/urlreplacers: Cache the next position of urlreplacer.prefix
Improved performance due to `bytes.Index` repeated calls Fixes #5942
This commit is contained in:
parent
02397e76ce
commit
a843ca53b5
1 changed files with 27 additions and 12 deletions
|
@ -41,6 +41,28 @@ type prefix struct {
|
|||
disabled bool
|
||||
b []byte
|
||||
f func(l *absurllexer)
|
||||
|
||||
nextPos int
|
||||
}
|
||||
|
||||
func (p *prefix) find(bs []byte, start int) bool {
|
||||
if p.disabled {
|
||||
return false
|
||||
}
|
||||
|
||||
if p.nextPos == -1 {
|
||||
idx := bytes.Index(bs[start:], p.b)
|
||||
|
||||
if idx == -1 {
|
||||
p.disabled = true
|
||||
// Find the closest match
|
||||
return false
|
||||
}
|
||||
|
||||
p.nextPos = start + idx + len(p.b)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func newPrefixState() []*prefix {
|
||||
|
@ -179,35 +201,28 @@ func (l *absurllexer) replace() {
|
|||
break
|
||||
}
|
||||
|
||||
nextPos := -1
|
||||
|
||||
var match *prefix
|
||||
|
||||
for _, p := range prefixes {
|
||||
if p.disabled {
|
||||
if !p.find(l.content, l.pos) {
|
||||
continue
|
||||
}
|
||||
idx := bytes.Index(l.content[l.pos:], p.b)
|
||||
|
||||
if idx == -1 {
|
||||
p.disabled = true
|
||||
// Find the closest match
|
||||
} else if nextPos == -1 || idx < nextPos {
|
||||
nextPos = idx
|
||||
if match == nil || p.nextPos < match.nextPos {
|
||||
match = p
|
||||
}
|
||||
}
|
||||
|
||||
if nextPos == -1 {
|
||||
if match == nil {
|
||||
// Done!
|
||||
l.pos = contentLength
|
||||
break
|
||||
} else {
|
||||
l.pos += nextPos + len(match.b)
|
||||
l.pos = match.nextPos
|
||||
match.nextPos = -1
|
||||
match.f(l)
|
||||
}
|
||||
}
|
||||
|
||||
// Done!
|
||||
if l.pos > l.start {
|
||||
l.emit()
|
||||
|
|
Loading…
Reference in a new issue