fastpastebin/vendor/github.com/alecthomas/chroma/remap.go
Stanislav N. aka pztrn 48d43ca097 Pagination, readable error messages to user, syntax highlighting started.
Pagination now works. Temporary hardcoded 10 pastes per page, will be put
in configuration later. Maybe.

From now user will receive readable error message if error occured.

Started to work on syntax highlighting, tried to make lexers detection
work but apparently to no avail.
2018-05-01 02:37:51 +05:00

75 lines
1.6 KiB
Go

package chroma
type remappingLexer struct {
lexer Lexer
mapper func(*Token) []*Token
}
// RemappingLexer remaps a token to a set of, potentially empty, tokens.
func RemappingLexer(lexer Lexer, mapper func(*Token) []*Token) Lexer {
return &remappingLexer{lexer, mapper}
}
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
}
buffer := []*Token{}
return func() *Token {
for {
if len(buffer) > 0 {
t := buffer[0]
buffer = buffer[1:]
return t
}
t := it()
if t == nil {
return t
}
buffer = r.mapper(t)
}
}, nil
}
type TypeMapping []struct {
From, To TokenType
Words []string
}
// TypeRemappingLexer remaps types of tokens coming from a parent Lexer.
//
// eg. Map "defvaralias" tokens of type NameVariable to NameFunction:
//
// mapping := TypeMapping{
// {NameVariable, NameFunction, []string{"defvaralias"},
// }
// lexer = TypeRemappingLexer(lexer, mapping)
func TypeRemappingLexer(lexer Lexer, mapping TypeMapping) Lexer {
// Lookup table for fast remapping.
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
}
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
}
}
return []*Token{t}
})
}