annotate vendor/github.com/alecthomas/chroma/v2/lexer.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package chroma
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "fmt"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 defaultOptions = &TokeniseOptions{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 State: "root",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 EnsureLF: true,
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 // Config for a lexer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 type Config struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 // Name of the lexer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 Name string `xml:"name,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 // Shortcuts for the lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21 Aliases []string `xml:"alias,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 // File name globs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 Filenames []string `xml:"filename,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 // Secondary file name globs
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 AliasFilenames []string `xml:"alias_filename,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 // MIME types
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 MimeTypes []string `xml:"mime_type,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 // Regex matching is case-insensitive.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 CaseInsensitive bool `xml:"case_insensitive,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 // Regex matches all characters.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36 DotAll bool `xml:"dot_all,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 // Regex does not match across lines ($ matches EOL).
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 // Defaults to multiline.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 NotMultiline bool `xml:"not_multiline,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 // Don't strip leading and trailing newlines from the input.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 // DontStripNL bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 // Strip all leading and trailing whitespace from the input
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 // StripAll bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 // Make sure that the input ends with a newline. This
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50 // is required for some lexers that consume input linewise.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 EnsureNL bool `xml:"ensure_nl,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 // If given and greater than 0, expand tabs in the input.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 // TabSize int
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 // Priority of lexer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 // If this is 0 it will be treated as a default of 1.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 Priority float32 `xml:"priority,omitempty"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 // Token output to formatter.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 type Token struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 Type TokenType `json:"type"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65 Value string `json:"value"`
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 func (t *Token) String() string { return t.Value }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 func (t *Token) GoString() string { return fmt.Sprintf("&Token{%s, %q}", t.Type, t.Value) }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 // Clone returns a clone of the Token.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 func (t *Token) Clone() Token {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 return *t
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 // EOF is returned by lexers at the end of input.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 var EOF Token
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 // TokeniseOptions contains options for tokenisers.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 type TokeniseOptions struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81 // State to start tokenisation in. Defaults to "root".
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 State string
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 // Nested tokenisation.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 Nested bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 // If true, all EOLs are converted into LF
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 // by replacing CRLF and CR
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 EnsureLF bool
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 // A Lexer for tokenising source code.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 type Lexer interface {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 // Config describing the features of the Lexer.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 Config() *Config
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 // Tokenise returns an Iterator over tokens in text.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 Tokenise(options *TokeniseOptions, text string) (Iterator, error)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 // SetRegistry sets the registry this Lexer is associated with.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 // The registry should be used by the Lexer if it needs to look up other
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 // lexers.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 SetRegistry(registry *LexerRegistry) Lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 // SetAnalyser sets a function the Lexer should use for scoring how
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 // likely a fragment of text is to match this lexer, between 0.0 and 1.0.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 // A value of 1 indicates high confidence.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 //
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 // Lexers may ignore this if they implement their own analysers.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 SetAnalyser(analyser func(text string) float32) Lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 // AnalyseText scores how likely a fragment of text is to match
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 // this lexer, between 0.0 and 1.0. A value of 1 indicates high confidence.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 AnalyseText(text string) float32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 // Lexers is a slice of lexers sortable by name.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 type Lexers []Lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 func (l Lexers) Len() int { return len(l) }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 func (l Lexers) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 func (l Lexers) Less(i, j int) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 return strings.ToLower(l[i].Config().Name) < strings.ToLower(l[j].Config().Name)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 // PrioritisedLexers is a slice of lexers sortable by priority.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 type PrioritisedLexers []Lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 func (l PrioritisedLexers) Len() int { return len(l) }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 func (l PrioritisedLexers) Swap(i, j int) { l[i], l[j] = l[j], l[i] }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 func (l PrioritisedLexers) Less(i, j int) bool {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 ip := l[i].Config().Priority
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 if ip == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 ip = 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 jp := l[j].Config().Priority
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 if jp == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 jp = 1
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 return ip > jp
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 // Analyser determines how appropriate this lexer is for the given text.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 type Analyser interface {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 AnalyseText(text string) float32
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 }