summaryrefslogtreecommitdiffstats
path: root/markup/highlight
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-11-24 12:13:19 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-11-24 13:18:33 +0100
commit7855b47f07aed926a7992bf1ad03a8740f747457 (patch)
treed599a13d45c2b1b5913f707383cef5abc2eed230 /markup/highlight
parent34d1150d927adfba97399f70fb046fbfc5c8cd7a (diff)
Add a cache for lexers.Get
``` name old time/op new time/op delta Codeblocks/Default-10 152ms ±11% 12ms ± 1% -92.44% (p=0.029 n=4+4) Codeblocks/Hook_no_higlight-10 142ms ± 0% 7ms ± 0% -95.36% (p=0.029 n=4+4) name old alloc/op new alloc/op delta Codeblocks/Default-10 11.9MB ± 0% 11.7MB ± 0% -1.59% (p=0.029 n=4+4) Codeblocks/Hook_no_higlight-10 4.62MB ± 1% 4.43MB ± 0% -4.08% (p=0.029 n=4+4) name old allocs/op new allocs/op delta Codeblocks/Default-10 209k ± 0% 209k ± 0% -0.03% (p=0.029 n=4+4) Codeblocks/Hook_no_higlight-10 68.4k ± 0% 68.3k ± 0% -0.06% (p=0.029 n=4+4) ```
Diffstat (limited to 'markup/highlight')
-rw-r--r--markup/highlight/chromalexers/chromalexers.go50
-rw-r--r--markup/highlight/highlight.go3
2 files changed, 52 insertions, 1 deletions
diff --git a/markup/highlight/chromalexers/chromalexers.go b/markup/highlight/chromalexers/chromalexers.go
new file mode 100644
index 000000000..41fd76261
--- /dev/null
+++ b/markup/highlight/chromalexers/chromalexers.go
@@ -0,0 +1,50 @@
+// Copyright 2022 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 chromalexers
+
+import (
+ "sync"
+
+ "github.com/alecthomas/chroma/v2"
+ "github.com/alecthomas/chroma/v2/lexers"
+)
+
+type lexersMap struct {
+ lexers map[string]chroma.Lexer
+ mu sync.RWMutex
+}
+
+var lexerCache = &lexersMap{lexers: make(map[string]chroma.Lexer)}
+
+// Get returns a lexer for the given language name, nil if not found.
+// This is just a wrapper around chromalexers.Get that caches the result.
+// Reasoning for this is that chromalexers.Get is slow in the case where the lexer is not found,
+// which is a common case in Hugo.
+func Get(name string) chroma.Lexer {
+ lexerCache.mu.RLock()
+ lexer, found := lexerCache.lexers[name]
+ lexerCache.mu.RUnlock()
+
+ if found {
+ return lexer
+ }
+
+ lexer = lexers.Get(name)
+
+ lexerCache.mu.Lock()
+ lexerCache.lexers[name] = lexer
+ lexerCache.mu.Unlock()
+
+ return lexer
+}
diff --git a/markup/highlight/highlight.go b/markup/highlight/highlight.go
index 5b19d6e8e..010c941f7 100644
--- a/markup/highlight/highlight.go
+++ b/markup/highlight/highlight.go
@@ -28,6 +28,7 @@ import (
"github.com/gohugoio/hugo/common/text"
"github.com/gohugoio/hugo/identity"
"github.com/gohugoio/hugo/markup/converter/hooks"
+ "github.com/gohugoio/hugo/markup/highlight/chromalexers"
"github.com/gohugoio/hugo/markup/internal/attributes"
)
@@ -167,7 +168,7 @@ func (h HightlightResult) Inner() template.HTML {
func highlight(fw hugio.FlexiWriter, code, lang string, attributes []attributes.Attribute, cfg Config) (int, int, error) {
var lexer chroma.Lexer
if lang != "" {
- lexer = lexers.Get(lang)
+ lexer = chromalexers.Get(lang)
}
if lexer == nil && (cfg.GuessSyntax && !cfg.NoHl) {