rouge 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9229545bdc0804f0a7f0fea6a4fd1b94dbe8d022d0d29c1ffa254c09f42003d1
4
- data.tar.gz: cf12e8de0f2d03d37ed6f1380a5deb04ad385d8628b4f2ed7c1921b16161636f
3
+ metadata.gz: 555fb3207f31723860f17a269418bbaea9dff23c0ae97dc5f27fabd797fc4ad5
4
+ data.tar.gz: ad0c9a8de4f66de72f487f8310abda1e763c92816ef2de031a7aea89bcd155c0
5
5
  SHA512:
6
- metadata.gz: 31f64a3f386d01829f9a2d2e9711ad40c3c48fbf122dc66b0e9519d4c02676cf530879c388e280efd996d6a57ec3497f5faa54423d081af02450348037c58712
7
- data.tar.gz: fad76c2d5d770fb172e09a2614e37ff78d362b81dfb73d50ce5c25de04f07c93aabae357e4a1a5b6b47be3792edf146e1299c1ec78204d55e998dd54c169f307
6
+ metadata.gz: fcdb09306c5640839523e4ade20a7a272d835f0cd7eec7d2a3b43ae4598d5f0ef50ce2c64e24de31d98e10501f5a8ea53b0e064b51a0e3166756a0669e76b3e9
7
+ data.tar.gz: 8c2deba5fc1d897f655642ed01f1817743d249fe1a8dabcc9de873b5203378b63315c5f5fd18c25a479d97aed5e726c9efffb43b1f0c83fbcc6aaf75ce1cf23d
data/Gemfile CHANGED
@@ -8,7 +8,7 @@ gem 'rake'
8
8
 
9
9
  gem 'minitest', '>= 5.0'
10
10
  gem 'minitest-power_assert'
11
- gem 'power_assert', '~> 1.2'
11
+ gem 'power_assert', '~> 2.0'
12
12
 
13
13
  gem 'rubocop', '~> 1.0', '<= 1.11'
14
14
  gem 'rubocop-performance'
@@ -0,0 +1,19 @@
1
+ interface FastEthernet0.20
2
+ encapsulation dot1Q 20
3
+ no ip route-cache
4
+ bridge-group 1
5
+ no bridge-group 1 source-learning
6
+ bridge-group 1 spanning-disabled
7
+
8
+ ! Supports shortened versions of config words, too
9
+ inter gi0.10
10
+ encap dot1q 10 native
11
+ inter gi0
12
+
13
+ banner login # Authenticate yourself! #
14
+
15
+ ! Supports #, $ and % to delimit banners, and multiline
16
+ banner motd $
17
+ Attention!
18
+ We will be having scheduled system maintenance on this device.
19
+ $
data/lib/rouge/demos/coq CHANGED
@@ -10,4 +10,7 @@ Section with_T.
10
10
  end.
11
11
  End with_T.
12
12
 
13
- Definition a_string := "hello \" world".
13
+ Definition a_string := "hello
14
+ world".
15
+ Definition escape_string := "0123".
16
+ Definition zero_string := "0".
@@ -5,6 +5,14 @@ module Rouge
5
5
  module Formatters
6
6
  # Transforms a token stream into HTML output.
7
7
  class HTML < Formatter
8
+ TABLE_FOR_ESCAPE_HTML = {
9
+ '&' => '&amp;',
10
+ '<' => '&lt;',
11
+ '>' => '&gt;',
12
+ }.freeze
13
+
14
+ ESCAPE_REGEX = /[&<>]/.freeze
15
+
8
16
  tag 'html'
9
17
 
10
18
  # @yield the html output.
@@ -22,20 +30,14 @@ module Rouge
22
30
  if tok == Token::Tokens::Text
23
31
  safe_val
24
32
  else
25
- shortname = tok.shortname \
26
- or raise "unknown token: #{tok.inspect} for #{safe_val.inspect}"
33
+ shortname = tok.shortname or raise "unknown token: #{tok.inspect} for #{safe_val.inspect}"
27
34
 
28
35
  "<span class=\"#{shortname}\">#{safe_val}</span>"
29
36
  end
30
37
  end
31
38
 
32
- TABLE_FOR_ESCAPE_HTML = {
33
- '&' => '&amp;',
34
- '<' => '&lt;',
35
- '>' => '&gt;',
36
- }
39
+ private
37
40
 
38
- private
39
41
  # A performance-oriented helper method to escape `&`, `<` and `>` for the rendered
40
42
  # HTML from this formatter.
41
43
  #
@@ -46,10 +48,9 @@ module Rouge
46
48
  # Returns either the given `value` argument string as is or a new string with the
47
49
  # special characters replaced with their escaped counterparts.
48
50
  def escape_special_html_chars(value)
49
- escape_regex = /[&<>]/
50
- return value unless value =~ escape_regex
51
+ return value unless value =~ ESCAPE_REGEX
51
52
 
52
- value.gsub(escape_regex, TABLE_FOR_ESCAPE_HTML)
53
+ value.gsub(ESCAPE_REGEX, TABLE_FOR_ESCAPE_HTML)
53
54
  end
54
55
  end
55
56
  end
@@ -133,7 +133,8 @@ module Rouge
133
133
  end
134
134
 
135
135
  disambiguate '*.pp' do
136
- next Pascal if matches?(/\b(function|begin|var)\b/)
136
+ next Puppet if matches?(/(::)?([a-z]\w*::)/)
137
+ next Pascal if matches?(/^(function|begin|var)\b/)
137
138
  next Pascal if matches?(/\b(end(;|\.))/)
138
139
 
139
140
  Puppet
@@ -0,0 +1,83 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ # Based on/regexes mostly from Brandon Bennett's pygments-routerlexers:
5
+ # https://github.com/nemith/pygments-routerlexers
6
+
7
+ module Rouge
8
+ module Lexers
9
+ class CiscoIos < RegexLexer
10
+ title 'Cisco IOS'
11
+ desc 'Cisco IOS configuration lexer'
12
+ tag 'cisco_ios'
13
+ filenames '*.cfg'
14
+ mimetypes 'text/x-cisco-conf'
15
+
16
+ state :root do
17
+ rule %r/^!.*/, Comment::Single
18
+
19
+ rule %r/^(version\s+)(.*)$/ do
20
+ groups Keyword, Num::Float
21
+ end
22
+
23
+ rule %r/(desc*r*i*p*t*i*o*n*)(.*?)$/ do
24
+ groups Keyword, Comment::Single
25
+ end
26
+
27
+ rule %r/^(inte*r*f*a*c*e*|controller|router \S+|voice translation-\S+|voice-port|line)(.*)$/ do
28
+ groups Keyword::Type, Name::Function
29
+ end
30
+
31
+ rule %r/(password|secret)(\s+[57]\s+)(\S+)/ do
32
+ groups Keyword, Num, String::Double
33
+ end
34
+
35
+ rule %r/(permit|deny)/, Operator::Word
36
+
37
+ rule %r/^(banner\s+)(motd\s+|login\s+)([#$%])/ do
38
+ groups Keyword, Name::Function, Str::Delimiter
39
+ push :cisco_ios_text
40
+ end
41
+
42
+ rule %r/^(dial-peer\s+\S+\s+)(\S+)(.*?)$/ do
43
+ groups Keyword, Name::Attribute, Keyword
44
+ end
45
+
46
+ rule %r/^(vlan\s+)(\d+)$/ do
47
+ groups Keyword, Name::Attribute
48
+ end
49
+
50
+ # IPv4 Address/Prefix
51
+ rule %r/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(\/\d{1,2})?/, Num
52
+
53
+ # NSAP
54
+ rule %r/49\.\d{4}\.\d{4}\.\d{4}\.\d{4}\.\d{2}/, Num
55
+
56
+ # MAC Address
57
+ rule %r/[a-f0-9]{4}\.[a-f0-9]{4}\.[a-f0-9]{4}/, Num::Hex
58
+
59
+ rule %r/^(\s*no\s+)(\S+)/ do
60
+ groups Keyword::Constant, Keyword
61
+ end
62
+
63
+ rule %r/^[^\n\r]\s*\S+/, Keyword
64
+
65
+ # Obfuscated Passwords
66
+ rule %r/\*+/, Name::Entity
67
+
68
+ rule %r/(?<= )\d+(?= )/, Num
69
+
70
+ # Newline catcher, avoid errors on empty lines
71
+ rule %r/\n+/m, Text
72
+
73
+ # This one goes last, a text catch-all
74
+ rule %r/./, Text
75
+ end
76
+
77
+ state :cisco_ios_text do
78
+ rule %r/[^#$%]/, Text
79
+ rule %r/[#$%]/, Str::Delimiter, :pop!
80
+ end
81
+ end
82
+ end
83
+ end
@@ -25,7 +25,7 @@ module Rouge
25
25
  Variables Class Instance Global Local Include
26
26
  Printing Notation Infix Arguments Hint Rewrite Immediate
27
27
  Qed Defined Opaque Transparent Existing
28
- Compute Eval Print SearchAbout Search About Check
28
+ Compute Eval Print SearchAbout Search About Check Admitted
29
29
  )
30
30
  end
31
31
 
@@ -56,16 +56,6 @@ module Rouge
56
56
  )
57
57
  end
58
58
 
59
- def self.keyopts
60
- @keyopts ||= Set.new %w(
61
- := => -> /\\ \\/ _ ; :> : ⇒ → ↔ ⇔ ≔ ≡ ∀ ∃ ∧ ∨ ¬ ⊤ ⊥ ⊢ ⊨ ∈
62
- )
63
- end
64
-
65
- def self.end_sentence
66
- @end_sentence ||= Punctuation::Indicator
67
- end
68
-
69
59
  def self.classify(x)
70
60
  if self.coq.include? x
71
61
  return Keyword
@@ -82,58 +72,133 @@ module Rouge
82
72
  end
83
73
  end
84
74
 
85
- operator = %r([\[\];,{}_()!$%&*+./:<=>?@^|~#-]+)
86
- id = /(?:[a-z][\w']*)|(?:[_a-z][\w']+)/i
87
- dot_id = /\.((?:[a-z][\w']*)|(?:[_a-z][\w']+))/i
75
+ # https://github.com/coq/coq/blob/110921a449fcb830ec2a1cd07e3acc32319feae6/clib/unicode.ml#L67
76
+ # https://coq.inria.fr/refman/language/core/basic.html#grammar-token-ident
77
+ id_first = /\p{L}/
78
+ id_first_underscore = /(?:\p{L}|_)/
79
+ id_subsequent = /(?:\p{L}|\p{N}|_|')/ # a few missing? some mathematical ' primes and subscripts
80
+ id = /(?:#{id_first}#{id_subsequent}*)|(?:#{id_first_underscore}#{id_subsequent}+)/i
81
+ dot_id = /\.(#{id})/i
88
82
  dot_space = /\.(\s+)/
89
- module_type = /Module(\s+)Type(\s+)/
90
- set_options = /(Set|Unset)(\s+)(Universe|Printing|Implicit|Strict)(\s+)(Polymorphism|All|Notations|Arguments|Universes|Implicit)(\s*)\./m
91
83
 
92
84
  state :root do
93
- rule %r/[(][*](?![)])/, Comment, :comment
85
+ mixin :begin_proof
86
+ mixin :sentence
87
+ end
88
+
89
+ state :sentence do
90
+ mixin :comment_whitespace
91
+ mixin :module_setopts
92
+ # After parsing the id, end up in sentence_postid
93
+ rule id do |m|
94
+ @name = m[0]
95
+ @id_dotted = false
96
+ push :sentence_postid
97
+ push :continue_id
98
+ end
99
+ end
100
+
101
+ state :begin_proof do
102
+ rule %r/(Proof)(\s*)(\.)(\s+)/i do
103
+ groups Keyword, Text::Whitespace, Punctuation::Indicator, Text::Whitespace
104
+ push :proof_mode
105
+ end
106
+ end
107
+
108
+ state :proof_mode do
109
+ mixin :comment_whitespace
110
+ mixin :module_setopts
111
+ mixin :begin_proof
112
+
113
+ rule %r/(Qed|Defined|Save|Admitted)(\s*)(\.)(\s+)/i do
114
+ groups Keyword, Text::Whitespace, Punctuation::Indicator, Text::Whitespace
115
+ pop!
116
+ end
117
+ # the whole point of parsing Proof/Qed, normally some of these will be operators
118
+ rule %r/(?:\-+|\++|\*+)/, Punctuation
119
+ rule %r/[{}]/, Punctuation
120
+ # toplevel_selector
121
+ rule %r/(!|all|par)(:)/ do
122
+ groups Keyword::Pseudo, Punctuation
123
+ end
124
+ # numbered goals 1: {} 1,2: {}
125
+ rule %r/\d+/, Num::Integer, :numeric_labels
126
+ # [named_goal]: { ... }
127
+ rule %r/(\[)(\s*)(#{id})(\s*)(\])(\s*)(:)/ do
128
+ groups Punctuation, Text::Whitespace, Name::Constant, Text::Whitespace, Punctuation, Text::Whitespace, Punctuation
129
+ end
130
+ # After parsing the id, end up in sentence_postid
131
+ rule id do |m|
132
+ @name = m[0]
133
+ @id_dotted = false
134
+ push :sentence_postid
135
+ push :continue_id
136
+ end
137
+ end
138
+
139
+ state :numeric_labels do
140
+ mixin :whitespace
141
+ rule %r/(,)(\s*)(\d+)/ do
142
+ groups Punctuation, Text::Whitespace, Num::Integer
143
+ end
144
+
145
+ rule %r(:), Punctuation, :pop!
146
+ end
147
+
148
+ state :whitespace do
94
149
  rule %r/\s+/m, Text::Whitespace
95
- rule module_type do |m|
96
- token Keyword , 'Module'
97
- token Text::Whitespace , m[1]
98
- token Keyword , 'Type'
99
- token Text::Whitespace , m[2]
150
+ end
151
+
152
+ state :comment_whitespace do
153
+ rule %r/[(][*](?![)])/, Comment, :comment
154
+ mixin :whitespace
155
+ end
156
+
157
+ state :module_setopts do
158
+ rule %r/(Module)(\s+)(Type)(\s+)/ do
159
+ groups Keyword, Text::Whitespace, Keyword, Text::Whitespace
100
160
  end
101
- rule set_options do |m|
102
- token Keyword , m[1]
103
- i = 2
104
- while m[i] != ''
105
- token Text::Whitespace , m[i]
106
- token Keyword , m[i+1]
107
- i += 2
108
- end
109
- token self.class.end_sentence , '.'
161
+
162
+ rule %r(
163
+ (Set|Unset)(\s+)
164
+ (Universe|Printing|Implicit|Strict)(\s+)
165
+ (Polymorphism|All|Notations|Arguments|Universes|Implicit)?(\s*)(\.)
166
+ )x do
167
+ groups Keyword, Text::Whitespace, Keyword, Text::Whitespace, Keyword, Text::Whitespace, Punctuation::Indicator
110
168
  end
169
+ end
170
+
171
+ state :sentence_postid do
172
+ mixin :comment_whitespace
173
+ mixin :module_setopts
174
+
175
+ # up here to beat the id rule for lambda
176
+ rule %r(:=|=>|;|:>|:|::|_), Punctuation
177
+ rule %r(->|/\\|\\/|;|:>|[⇒→↔⇔≔≡∀∃∧∨¬⊤⊥⊢⊨∈λ]), Operator
178
+
111
179
  rule id do |m|
112
180
  @name = m[0]
113
- @continue = false
181
+ @id_dotted = false
114
182
  push :continue_id
115
183
  end
116
- rule %r(/\\), Operator
117
- rule %r/\\\//, Operator
184
+
185
+ # must be followed by whitespace, so that we don't match notations like sym.(a + b)
186
+ rule %r/\.(?=\s)/, Punctuation::Indicator, :pop! # :sentence_postid
118
187
 
119
188
  rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float
120
- rule %r/\d[\d_]*/, Num::Integer
189
+ rule %r/-?\d[\d_]*/, Num::Integer
121
190
 
122
191
  rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char
123
192
  rule %r/'/, Keyword
124
193
  rule %r/"/, Str::Double, :string
125
194
  rule %r/[~?]#{id}/, Name::Variable
126
195
 
127
- rule %r/./ do |m|
128
- match = m[0]
129
- if self.class.keyopts.include? match
130
- token Punctuation
131
- elsif match =~ operator
132
- token Operator
133
- else
134
- token Error
135
- end
136
- end
196
+ rule %r(`{|[{}\[\]()?|;,.]), Punctuation
197
+ rule %r([!@^|~#.%/]+), Operator
198
+ # any other combo of S (symbol), P (punctuation) and some extras just to be sure
199
+ rule %r((?:\p{S}|\p{Pc}|[./\:\<=>\-+*])+), Operator
200
+
201
+ rule %r/./, Error
137
202
  end
138
203
 
139
204
  state :comment do
@@ -144,48 +209,47 @@ module Rouge
144
209
  end
145
210
 
146
211
  state :string do
147
- rule %r/(?:\\")+|[^"]/, Str::Double
148
- mixin :escape_sequence
149
- rule %r/\\\n/, Str::Double
212
+ rule %r/[^"]+/, Str::Double
213
+ rule %r/""/, Str::Double
150
214
  rule %r/"/, Str::Double, :pop!
151
215
  end
152
216
 
153
- state :escape_sequence do
154
- rule %r/\\[\\"'ntbr]/, Str::Escape
155
- end
156
-
157
217
  state :continue_id do
158
218
  # the stream starts with an id (stored in @name) and continues here
159
219
  rule dot_id do |m|
160
- token Name::Namespace , @name
161
- token Punctuation , '.'
162
- @continue = true
220
+ token Name::Namespace, @name
221
+ token Punctuation, '.'
222
+ @id_dotted = true
163
223
  @name = m[1]
164
224
  end
225
+
165
226
  rule dot_space do |m|
166
- if @continue
167
- token Name::Constant , @name
227
+ if @id_dotted
228
+ token Name::Constant, @name
168
229
  else
169
- token self.class.classify(@name) , @name
230
+ token self.class.classify(@name), @name
170
231
  end
171
- token self.class.end_sentence , '.'
172
- token Text::Whitespace , m[1]
232
+
233
+ token Punctuation::Indicator, '.'
234
+ token Text::Whitespace, m[1]
173
235
  @name = false
174
- @continue = false
175
- pop!
236
+ @id_dotted = false
237
+ pop! # :continue_id
238
+ pop! # :sentence_postid
176
239
  end
240
+
177
241
  rule %r// do
178
- if @continue
179
- token Name::Constant , @name
242
+ if @id_dotted
243
+ token Name::Constant, @name
180
244
  else
181
- token self.class.classify(@name) , @name
245
+ token self.class.classify(@name), @name
182
246
  end
183
247
  @name = false
184
- @continue = false
185
- pop!
248
+ @id_dotted = false
249
+ # we finished parsing an id, drop back into the sentence_postid that was pushed first.
250
+ pop! # :continue_id
186
251
  end
187
252
  end
188
-
189
253
  end
190
254
  end
191
255
  end
@@ -71,7 +71,11 @@ module Rouge
71
71
  rule %r/\bnullptr\b/, Name::Builtin
72
72
  rule %r/(?:u8|u|U|L)?R"([a-zA-Z0-9_{}\[\]#<>%:;.?*\+\-\/\^&|~!=,"']{,16})\(.*?\)\1"/m, Str
73
73
  rule %r/(::|<=>)/, Operator
74
- rule %r/[{}]/, Punctuation
74
+ rule %r/[{]/, Punctuation
75
+ rule %r/}/ do
76
+ token Punctuation
77
+ pop! if in_state?(:function) # pop :function
78
+ end
75
79
  end
76
80
 
77
81
  state :classname do
@@ -27,19 +27,19 @@ module Rouge
27
27
  static switch this throw true try typeof unchecked unsafe
28
28
  virtual void volatile while
29
29
  add alias async await get global partial remove set value where
30
- yield nameof
31
- ascending by descending equals from group in into join let on
32
- orderby select
30
+ yield nameof notnull
31
+ ascending by descending equals from group in init into join let
32
+ on orderby select unmanaged when and not or with
33
33
  )
34
34
 
35
35
  keywords_type = %w(
36
- bool byte char decimal double dynamic float int long object
37
- sbyte short string uint ulong ushort var
36
+ bool byte char decimal double dynamic float int long nint nuint
37
+ object sbyte short string uint ulong ushort var
38
38
  )
39
39
 
40
40
  cpp_keywords = %w(
41
41
  if endif else elif define undef line error warning region
42
- endregion pragma
42
+ endregion pragma nullable
43
43
  )
44
44
 
45
45
  state :whitespace do
@@ -81,14 +81,15 @@ module Rouge
81
81
  rule %r/@"(""|[^"])*"/m, Str
82
82
  rule %r/"(\\.|.)*?["\n]/, Str
83
83
  rule %r/'(\\.|.)'/, Str::Char
84
- rule %r/0x[0-9a-f]+[lu]?/i, Num
84
+ rule %r/0b[_01]+[lu]?/i, Num
85
+ rule %r/0x[_0-9a-f]+[lu]?/i, Num
85
86
  rule %r(
86
- [0-9]
87
- ([.][0-9]*)? # decimal
88
- (e[+-][0-9]+)? # exponent
89
- [fldu]? # type
87
+ [0-9](?:[_0-9]*[0-9])?
88
+ ([.][0-9](?:[_0-9]*[0-9])?)? # decimal
89
+ (e[+-]?[0-9](?:[_0-9]*[0-9])?)? # exponent
90
+ [fldum]? # type
90
91
  )ix, Num
91
- rule %r/\b(?:class|struct|interface)\b/, Keyword, :class
92
+ rule %r/\b(?:class|record|struct|interface)\b/, Keyword, :class
92
93
  rule %r/\b(?:namespace|using)\b/, Keyword, :namespace
93
94
  rule %r/^#[ \t]*(#{cpp_keywords.join('|')})\b.*?\n/,
94
95
  Comment::Preproc
@@ -22,7 +22,7 @@ module Rouge
22
22
  ws = %r(\s|//.*?\n|/[*](?:[^*]|(?:[*][^/]))*[*]+/)mx
23
23
 
24
24
  # Make sure that this is not a preprocessor macro, e.g. `#if` or `#define`.
25
- id = %r((?!#[a-zA-Z])[\w#\$%_']+)
25
+ id = %r((?!\#[a-zA-Z])[\w#\$%_']+)
26
26
 
27
27
  complex_id = %r(
28
28
  (?:[\w#$%_']|\(\)|\(,\)|\[\]|[0-9])*