github.com/linchen2chris/hugo@v0.0.0-20230307053224-cec209389705/markup/highlight/chromalexers/chromalexers.go (about) 1 // Copyright 2022 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package chromalexers 15 16 import ( 17 "sync" 18 19 "github.com/alecthomas/chroma/v2" 20 "github.com/alecthomas/chroma/v2/lexers" 21 ) 22 23 type lexersMap struct { 24 lexers map[string]chroma.Lexer 25 mu sync.RWMutex 26 } 27 28 var lexerCache = &lexersMap{lexers: make(map[string]chroma.Lexer)} 29 30 // Get returns a lexer for the given language name, nil if not found. 31 // This is just a wrapper around chromalexers.Get that caches the result. 32 // Reasoning for this is that chromalexers.Get is slow in the case where the lexer is not found, 33 // which is a common case in Hugo. 34 func Get(name string) chroma.Lexer { 35 lexerCache.mu.RLock() 36 lexer, found := lexerCache.lexers[name] 37 lexerCache.mu.RUnlock() 38 39 if found { 40 return lexer 41 } 42 43 lexer = lexers.Get(name) 44 45 lexerCache.mu.Lock() 46 lexerCache.lexers[name] = lexer 47 lexerCache.mu.Unlock() 48 49 return lexer 50 }