@@ -11,55 +11,60 @@ class TOML < RegexLexer
1111 filenames '*.toml' , 'Pipfile' , 'poetry.lock'
1212 mimetypes 'text/x-toml'
1313
14- # bare keys and quoted keys
15- identifier = %r/(?: \S +|"[^"]+"|'[^']+')/
14+ state :root do
15+ mixin :whitespace
1616
17- state :basic do
18- rule %r/\s +/ , Text
19- rule %r/#.*?$/ , Comment
20- rule %r/(true|false)/ , Keyword ::Constant
17+ mixin :key
2118
22- rule %r/(#{ identifier } )( \s *)( =)(\s *)( \{ )/ do
23- groups Name :: Property , Text , Operator , Text , Punctuation
24- push :inline
19+ rule %r/(=)(\s *)/ do
20+ groups Operator , Text :: Whitespace
21+ push :value
2522 end
23+
24+ rule %r/\[ \[ ?/ , Keyword , :table_key
2625 end
2726
28- state :root do
29- mixin :basic
27+ state :key do
28+ rule %r/[A-Za-z0-9_-]+/ , Name
3029
31- rule %r/(?<!=)\s *\[ .*?\] +/ , Name ::Namespace
30+ rule %r/"/ , Str , :dq
31+ rule %r/'/ , Str , :sq
32+ rule %r/\. / , Punctuation
33+ end
3234
33- rule %r/(#{ identifier } )(\s *)(=)/ do
34- groups Name ::Property , Text , Punctuation
35- push :value
36- end
35+ state :table_key do
36+ rule %r/[A-Za-z0-9_-]+/ , Name
37+
38+ rule %r/"/ , Str , :dq
39+ rule %r/'/ , Str , :sq
40+ rule %r/\. / , Keyword
41+ rule %r/\] \] ?/ , Keyword , :pop!
42+ rule %r/[ \t ]+/ , Text ::Whitespace
3743 end
3844
3945 state :value do
40- rule %r/\n / , Text , :pop!
41- mixin :content
46+ rule %r/\d {4}-\d {2}-\d {2}T\d {2}:\d {2}:\d {2}Z/ , Literal ::Date , :pop!
47+ rule %r/[+-]?\d +(?:_\d +)*\. \d +(?:_\d +)*(?:[eE][+-]?\d +(?:_\d +)*)?/ , Num ::Float , :pop!
48+ rule %r/[+-]?\d +(?:_\d +)*[eE][+-]?\d +(?:_\d +)*/ , Num ::Float , :pop!
49+ rule %r/[+-]?(?:nan|inf)/ , Num ::Float , :pop!
50+ rule %r/0x\h +(?:_\h +)*/ , Num ::Hex , :pop!
51+ rule %r/0o[0-7]+(?:_[0-7]+)*/ , Num ::Oct , :pop!
52+ rule %r/0b[01]+(?:_[01]+)*/ , Num ::Bin , :pop!
53+ rule %r/[+-]?\d +(?:_\d +)*/ , Num ::Integer , :pop!
54+
55+ rule %r/"""/ , Str , [ :pop! , :mdq ]
56+ rule %r/"/ , Str , [ :pop! , :dq ]
57+ rule %r/'''/ , Str , [ :pop! , :msq ]
58+ rule %r/'/ , Str , [ :pop! , :sq ]
59+
60+ rule %r/(true|false)/ , Keyword ::Constant , :pop!
61+ rule %r/\[ / , Punctuation , [ :pop! , :array ]
62+ rule %r/\{ / , Punctuation , [ :pop! , :inline ]
4263 end
4364
4465 state :content do
4566 mixin :basic
4667
47- rule %r/(#{ identifier } )(\s *)(=)/ do
48- groups Name ::Property , Text , Punctuation
49- end
50-
51- rule %r/\d {4}-\d {2}-\d {2}(?:[Tt ]\d {2}:\d {2}:\d {2}(?:[Zz]|[+-]\d {2}:\d {2})?)?/ , Literal ::Date
52- rule %r/\d {2}:\d {2}:\d {2}/ , Literal ::Date
53-
54- rule %r/[+-]?\d +(?:_\d +)*\. \d +(?:_\d +)*(?:[eE][+-]?\d +(?:_\d +)*)?/ , Num ::Float
55- rule %r/[+-]?\d +(?:_\d +)*[eE][+-]?\d +(?:_\d +)*/ , Num ::Float
56- rule %r/[+-]?(?:nan|inf)/ , Num ::Float
57-
58- rule %r/0x\h +(?:_\h +)*/ , Num ::Hex
59- rule %r/0o[0-7]+(?:_[0-7]+)*/ , Num ::Oct
60- rule %r/0b[01]+(?:_[01]+)*/ , Num ::Bin
61- rule %r/[+-]?\d +(?:_\d +)*/ , Num ::Integer
62-
6368 rule %r/"""/ , Str , :mdq
6469 rule %r/"/ , Str , :dq
6570 rule %r/'''/ , Str , :msq
@@ -101,15 +106,31 @@ class TOML < RegexLexer
101106 end
102107
103108 state :array do
104- mixin :content
109+ mixin :whitespace
110+ rule %r/,/ , Punctuation
111+
105112 rule %r/\] / , Punctuation , :pop!
113+
114+ rule %r// , Token , :value
106115 end
107116
108117 state :inline do
109- mixin :content
118+ rule %r/[ \t ]+/ , Text :: Whitespace
110119
120+ mixin :key
121+ rule %r/(=)(\s *)/ do
122+ groups Punctuation , Text ::Whitespace
123+ push :value
124+ end
125+
126+ rule %r/,/ , Punctuation
111127 rule %r/\} / , Punctuation , :pop!
112128 end
129+
130+ state :whitespace do
131+ rule %r/\s +/ , Text
132+ rule %r/#.*?$/ , Comment
133+ end
113134 end
114135 end
115136end
0 commit comments