package chroma
type remappingLexer struct {
lexer Lexer
mapper func (Token ) []Token
}
func RemappingLexer (lexer Lexer , mapper func (Token ) []Token ) Lexer {
return &remappingLexer {lexer , mapper }
}
func (r *remappingLexer ) AnalyseText (text string ) float32 {
return r .lexer .AnalyseText (text )
}
func (r *remappingLexer ) SetAnalyser (analyser func (text string ) float32 ) Lexer {
r .lexer .SetAnalyser (analyser )
return r
}
func (r *remappingLexer ) SetRegistry (registry *LexerRegistry ) Lexer {
r .lexer .SetRegistry (registry )
return r
}
func (r *remappingLexer ) Config () *Config {
return r .lexer .Config ()
}
func (r *remappingLexer ) Tokenise (options *TokeniseOptions , text string ) (Iterator , error ) {
it , err := r .lexer .Tokenise (options , text )
if err != nil {
return nil , err
}
var buffer []Token
return func () Token {
for {
if len (buffer ) > 0 {
t := buffer [0 ]
buffer = buffer [1 :]
return t
}
t := it ()
if t == EOF {
return t
}
buffer = r .mapper (t )
}
}, nil
}
type TypeMapping []struct {
From, To TokenType
Words []string
}
func TypeRemappingLexer (lexer Lexer , mapping TypeMapping ) Lexer {
lut := map [TokenType ]map [string ]TokenType {}
for _ , rt := range mapping {
km , ok := lut [rt .From ]
if !ok {
km = map [string ]TokenType {}
lut [rt .From ] = km
}
if len (rt .Words ) == 0 {
km ["" ] = rt .To
} else {
for _ , k := range rt .Words {
km [k ] = rt .To
}
}
}
return RemappingLexer (lexer , func (t Token ) []Token {
if k , ok := lut [t .Type ]; ok {
if tt , ok := k [t .Value ]; ok {
t .Type = tt
} else if tt , ok := k ["" ]; ok {
t .Type = tt
}
}
return []Token {t }
})
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .