rouge 4.0.1 → 4.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -66,7 +66,7 @@ module Rouge
66
66
 
67
67
  id = /[\p{L}_][\p{L}\p{N}_]*/
68
68
  ns = /(?:#{id}\\)+/
69
- id_with_ns = /(?:#{ns})?#{id}/
69
+ id_with_ns = /\\?(?:#{ns})?#{id}/
70
70
 
71
71
  start do
72
72
  case @start_inline
@@ -211,7 +211,7 @@ module Rouge
211
211
 
212
212
  state :whitespace do
213
213
  rule %r/\s+/, Text
214
- rule %r/#.*?$/, Comment::Single
214
+ rule %r/#[^\[].*?$/, Comment::Single
215
215
  rule %r(//.*?$), Comment::Single
216
216
  rule %r(/\*\*(?!/).*?\*/)m, Comment::Doc
217
217
  rule %r(/\*.*?\*/)m, Comment::Multiline
@@ -235,6 +235,8 @@ module Rouge
235
235
  groups Keyword::Namespace, Text, Name::Namespace
236
236
  end
237
237
 
238
+ rule %r/#\[.*\]$/, Name::Attribute
239
+
238
240
  rule %r/(class|interface|trait|extends|implements)
239
241
  (\s+)
240
242
  (#{id_with_ns})/ix do |m|
@@ -271,7 +273,7 @@ module Rouge
271
273
  state :in_catch do
272
274
  rule %r/\(/, Punctuation
273
275
  rule %r/\|/, Operator
274
- rule id, Name::Class
276
+ rule id_with_ns, Name::Class
275
277
  mixin :escape
276
278
  mixin :whitespace
277
279
  mixin :return
@@ -40,7 +40,7 @@ module Rouge
40
40
  end
41
41
 
42
42
  def self.builtins_pseudo
43
- @builtins_pseudo ||= %w(self None Ellipsis NotImplemented False True)
43
+ @builtins_pseudo ||= %w(None Ellipsis NotImplemented False True)
44
44
  end
45
45
 
46
46
  def self.exceptions
@@ -80,12 +80,18 @@ module Rouge
80
80
  groups Punctuation, Text, Str::Doc
81
81
  end
82
82
 
83
+ rule %r/\.\.\.\B$/, Name::Builtin::Pseudo
84
+
83
85
  rule %r/[^\S\n]+/, Text
84
86
  rule %r(#(.*)?\n?), Comment::Single
85
87
  rule %r/[\[\]{}:(),;.]/, Punctuation
86
88
  rule %r/\\\n/, Text
87
89
  rule %r/\\/, Text
88
90
 
91
+ rule %r/@#{dotted_identifier}/i, Name::Decorator
92
+
93
+ rule %r/(>>>|\.\.\.)\B/, Generic::Prompt
94
+
89
95
  rule %r/(in|is|and|or|not)\b/, Operator::Word
90
96
  rule %r/(<<|>>|\/\/|\*\*)=?/, Operator
91
97
  rule %r/[-~+\/*%=<>&^|@]=?|!=/, Operator
@@ -93,13 +99,13 @@ module Rouge
93
99
  rule %r/(from)((?:\\\s|\s)+)(#{dotted_identifier})((?:\\\s|\s)+)(import)/ do
94
100
  groups Keyword::Namespace,
95
101
  Text,
96
- Name::Namespace,
102
+ Name,
97
103
  Text,
98
104
  Keyword::Namespace
99
105
  end
100
106
 
101
107
  rule %r/(import)(\s+)(#{dotted_identifier})/ do
102
- groups Keyword::Namespace, Text, Name::Namespace
108
+ groups Keyword::Namespace, Text, Name
103
109
  end
104
110
 
105
111
  rule %r/(def)((?:\s|\\\s)+)/ do
@@ -112,16 +118,17 @@ module Rouge
112
118
  push :classname
113
119
  end
114
120
 
121
+ rule %r/([a-z_]\w*)[ \t]*(?=(\(.*\)))/m, Name::Function
122
+ rule %r/([A-Z_]\w*)[ \t]*(?=(\(.*\)))/m, Name::Class
123
+
115
124
  # TODO: not in python 3
116
125
  rule %r/`.*?`/, Str::Backtick
117
126
  rule %r/([rfbu]{0,2})('''|"""|['"])/i do |m|
118
- groups Str::Affix, Str
127
+ groups Str::Affix, Str::Heredoc
119
128
  current_string.register type: m[1].downcase, delim: m[2]
120
129
  push :generic_string
121
130
  end
122
131
 
123
- rule %r/@#{dotted_identifier}/i, Name::Decorator
124
-
125
132
  # using negative lookbehind so we don't match property names
126
133
  rule %r/(?<!\.)#{identifier}/ do |m|
127
134
  if self.class.keywords.include? m[0]
@@ -175,11 +182,12 @@ module Rouge
175
182
  end
176
183
 
177
184
  state :generic_string do
178
- rule %r/[^'"\\{]+/, Str
185
+ rule %r/>>>|\.\.\./, Generic::Prompt, :doctest
186
+ rule %r/[^'"\\{]+?/, Str
179
187
  rule %r/{{/, Str
180
188
 
181
189
  rule %r/'''|"""|['"]/ do |m|
182
- token Str
190
+ token Str::Heredoc
183
191
  if current_string.delim? m[0]
184
192
  current_string.remove
185
193
  pop!
@@ -217,6 +225,17 @@ module Rouge
217
225
  rule %r/\\./, Str, :pop!
218
226
  end
219
227
 
228
+ state :doctest do
229
+ rule %r/\n\n/, Text, :pop!
230
+
231
+ rule %r/'''|"""/ do
232
+ token Str::Heredoc
233
+ pop!(2) if in_state?(:generic_string) # pop :doctest and :generic_string
234
+ end
235
+
236
+ mixin :root
237
+ end
238
+
220
239
  state :generic_interpol do
221
240
  rule %r/[^{}!:]+/ do |m|
222
241
  recurse m[0]
@@ -42,7 +42,7 @@ module Rouge
42
42
  rule %r/%([rqswQWxiI])?([^\w\s])/ do |m|
43
43
  open = Regexp.escape(m[2])
44
44
  close = Regexp.escape(delimiter_map[m[2]] || m[2])
45
- interp = /[rQWxI]/ === m[1]
45
+ interp = /[rQWxI]/ === m[1] || !m[1]
46
46
  toktype = Str::Other
47
47
 
48
48
  puts " open: #{open.inspect}" if @debug
@@ -188,6 +188,7 @@ module Rouge
188
188
 
189
189
  rule %r/(?:#{keywords.join('|')})(?=\W|$)/, Keyword, :expr_start
190
190
  rule %r/(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
191
+ rule %r/(not|and|or)\b/, Operator::Word, :expr_start
191
192
 
192
193
  rule %r(
193
194
  (module)
@@ -35,17 +35,18 @@ module Rouge
35
35
  def self.builtins
36
36
  @builtins ||= Set.new %w(
37
37
  Add BitAnd BitOr BitXor bool c_char c_double c_float char
38
- c_int clock_t c_long c_longlong Cons Const Copy c_schar c_short
38
+ c_int clock_t c_long c_longlong Copy c_schar c_short
39
39
  c_uchar c_uint c_ulong c_ulonglong c_ushort c_void dev_t DIR
40
- dirent Div Either Eq Err f32 f64 Failure FILE float fpos_t
41
- i16 i32 i64 i8 isize Index ino_t int intptr_t Left mode_t Modulo Mul
42
- Neg Nil None Num off_t Ok Option Ord Owned pid_t Ptr ptrdiff_t
43
- Right Send Shl Shr size_t Some ssize_t str Sub Success time_t
40
+ dirent Div Eq Err f32 f64 FILE float fpos_t
41
+ i16 i32 i64 i8 isize Index ino_t int intptr_t mode_t Mul
42
+ Neg None off_t Ok Option Ord Owned pid_t ptrdiff_t
43
+ Send Shl Shr size_t Some ssize_t str Sub time_t
44
44
  u16 u32 u64 u8 usize uint uintptr_t
45
- Box Vec String Gc Rc Arc
45
+ Box Vec String Rc Arc
46
46
  u128 i128 Result Sync Pin Unpin Sized Drop drop Fn FnMut FnOnce
47
47
  Clone PartialEq PartialOrd AsMut AsRef From Into Default
48
48
  DoubleEndedIterator ExactSizeIterator Extend IntoIterator Iterator
49
+ FromIterator ToOwned ToString TryFrom TryInto
49
50
  )
50
51
  end
51
52
 
@@ -9,8 +9,11 @@ module Rouge
9
9
 
10
10
  tag 'shell'
11
11
  aliases 'bash', 'zsh', 'ksh', 'sh'
12
- filenames '*.sh', '*.bash', '*.zsh', '*.ksh', '.bashrc', '.zshrc',
13
- '.kshrc', '.profile', 'APKBUILD', 'PKGBUILD', '*.ebuild',
12
+ filenames '*.sh', '*.bash', '*.zsh', '*.ksh', '.bashrc',
13
+ '.kshrc', '.profile',
14
+ '.zshenv', '.zprofile', '.zshrc', '.zlogin', '.zlogout',
15
+ 'zshenv', 'zprofile', 'zshrc', 'zlogin', 'zlogout',
16
+ 'APKBUILD', 'PKGBUILD', '*.ebuild',
14
17
  '*.eclass', '*.exheres-0', '*.exlib'
15
18
 
16
19
  mimetypes 'application/x-sh', 'application/x-shellscript', 'text/x-sh',
@@ -18,6 +21,7 @@ module Rouge
18
21
 
19
22
  def self.detect?(text)
20
23
  return true if text.shebang?(/(ba|z|k)?sh/)
24
+ return true if text.start_with?('#compdef', '#autoload')
21
25
  end
22
26
 
23
27
  KEYWORDS = %w(
@@ -16,24 +16,24 @@ module Rouge
16
16
  mimetypes 'application/x-twig', 'text/html+twig'
17
17
 
18
18
  def self.keywords
19
- @@keywords ||= %w(as do extends flush from import include use else starts
20
- ends with without autoescape endautoescape block
21
- endblock embed endembed filter endfilter for endfor
22
- if endif macro endmacro sandbox endsandbox set endset
23
- spaceless endspaceless)
19
+ @keywords ||= %w(as do extends flush from import include use else starts
20
+ ends with without autoescape endautoescape block
21
+ endblock embed endembed filter endfilter for endfor
22
+ if endif macro endmacro sandbox endsandbox set endset
23
+ spaceless endspaceless)
24
24
  end
25
25
 
26
26
  def self.tests
27
- @@tests ||= %w(constant defined divisibleby empty even iterable null odd
28
- sameas)
27
+ @tests ||= %w(constant defined divisibleby empty even iterable null odd
28
+ sameas)
29
29
  end
30
30
 
31
31
  def self.pseudo_keywords
32
- @@pseudo_keywords ||= %w(true false none)
32
+ @pseudo_keywords ||= %w(true false none)
33
33
  end
34
34
 
35
35
  def self.word_operators
36
- @@word_operators ||= %w(b-and b-or b-xor is in and or not)
36
+ @word_operators ||= %w(b-and b-or b-xor is in and or not)
37
37
  end
38
38
  end
39
39
  end
@@ -18,8 +18,6 @@ module Rouge
18
18
  return true if text =~ /\A\s*%YAML/m
19
19
  end
20
20
 
21
- SPECIAL_VALUES = Regexp.union(%w(true false null))
22
-
23
21
  # NB: Tabs are forbidden in YAML, which is why you see things
24
22
  # like /[ ]+/.
25
23
 
@@ -340,7 +338,7 @@ module Rouge
340
338
  end
341
339
 
342
340
  rule %r/[ ]+/, Str
343
- rule SPECIAL_VALUES, Name::Constant
341
+ rule %r((true|false|null)\b), Keyword::Constant
344
342
  rule %r/\d+(?:\.\d+)?(?=(\r?\n)| +#)/, Literal::Number, :pop!
345
343
 
346
344
  # regular non-whitespace characters
@@ -6,68 +6,143 @@ module Rouge
6
6
  class Github < CSSTheme
7
7
  name 'github'
8
8
 
9
- style Comment::Multiline, :fg => '#999988', :italic => true
10
- style Comment::Preproc, :fg => '#999999', :bold => true
11
- style Comment::Single, :fg => '#999988', :italic => true
12
- style Comment::Special, :fg => '#999999', :italic => true, :bold => true
13
- style Comment, :fg => '#999988', :italic => true
14
- style Error, :fg => '#a61717', :bg => '#e3d2d2'
15
- style Generic::Deleted, :fg => '#000000', :bg => '#ffdddd'
16
- style Generic::Emph, :fg => '#000000', :italic => true
17
- style Generic::Error, :fg => '#aa0000'
18
- style Generic::Heading, :fg => '#999999'
19
- style Generic::Inserted, :fg => '#000000', :bg => '#ddffdd'
20
- style Generic::Output, :fg => '#888888'
21
- style Generic::Prompt, :fg => '#555555'
22
- style Generic::Strong, :bold => true
23
- style Generic::Subheading, :fg => '#aaaaaa'
24
- style Generic::Traceback, :fg => '#aa0000'
25
- style Keyword::Constant, :fg => '#000000', :bold => true
26
- style Keyword::Declaration, :fg => '#000000', :bold => true
27
- style Keyword::Namespace, :fg => '#000000', :bold => true
28
- style Keyword::Pseudo, :fg => '#000000', :bold => true
29
- style Keyword::Reserved, :fg => '#000000', :bold => true
30
- style Keyword::Type, :fg => '#445588', :bold => true
31
- style Keyword, :fg => '#000000', :bold => true
32
- style Literal::Number::Float, :fg => '#009999'
33
- style Literal::Number::Hex, :fg => '#009999'
34
- style Literal::Number::Integer::Long, :fg => '#009999'
35
- style Literal::Number::Integer, :fg => '#009999'
36
- style Literal::Number::Oct, :fg => '#009999'
37
- style Literal::Number, :fg => '#009999'
38
- style Literal::String::Affix, :fg => '#000000', :bold => true
39
- style Literal::String::Backtick, :fg => '#d14'
40
- style Literal::String::Char, :fg => '#d14'
41
- style Literal::String::Doc, :fg => '#d14'
42
- style Literal::String::Double, :fg => '#d14'
43
- style Literal::String::Escape, :fg => '#d14'
44
- style Literal::String::Heredoc, :fg => '#d14'
45
- style Literal::String::Interpol, :fg => '#d14'
46
- style Literal::String::Other, :fg => '#d14'
47
- style Literal::String::Regex, :fg => '#009926'
48
- style Literal::String::Single, :fg => '#d14'
49
- style Literal::String::Symbol, :fg => '#990073'
50
- style Literal::String, :fg => '#d14'
51
- style Name::Attribute, :fg => '#008080'
52
- style Name::Builtin::Pseudo, :fg => '#999999'
53
- style Name::Builtin, :fg => '#0086B3'
54
- style Name::Class, :fg => '#445588', :bold => true
55
- style Name::Constant, :fg => '#008080'
56
- style Name::Decorator, :fg => '#3c5d5d', :bold => true
57
- style Name::Entity, :fg => '#800080'
58
- style Name::Exception, :fg => '#990000', :bold => true
59
- style Name::Function, :fg => '#990000', :bold => true
60
- style Name::Label, :fg => '#990000', :bold => true
61
- style Name::Namespace, :fg => '#555555'
62
- style Name::Tag, :fg => '#000080'
63
- style Name::Variable::Class, :fg => '#008080'
64
- style Name::Variable::Global, :fg => '#008080'
65
- style Name::Variable::Instance, :fg => '#008080'
66
- style Name::Variable, :fg => '#008080'
67
- style Operator::Word, :fg => '#000000', :bold => true
68
- style Operator, :fg => '#000000', :bold => true
69
- style Text::Whitespace, :fg => '#bbbbbb'
70
- style Text, :bg => '#f8f8f8'
9
+ # Primer primitives
10
+ # https://github.com/primer/primitives/tree/main/src/tokens
11
+ P_RED_0 = {:light => '#ffebe9', :dark => '#ffdcd7'}
12
+ P_RED_3 = {:dark => '#ff7b72'}
13
+ P_RED_5 = {:light => '#cf222e'}
14
+ P_RED_7 = {:light => '#82071e', :dark => '#8e1519'}
15
+ P_RED_8 = {:dark => '#67060c'}
16
+ P_ORANGE_2 = {:dark => '#ffa657'}
17
+ P_ORANGE_6 = {:light => '#953800'}
18
+ P_GREEN_0 = {:light => '#dafbe1', :dark => '#aff5b4'}
19
+ P_GREEN_1 = {:dark => '#7ee787'}
20
+ P_GREEN_6 = {:light => '#116329'}
21
+ P_GREEN_8 = {:dark => '#033a16'}
22
+ P_BLUE_1 = {:dark => '#a5d6ff'}
23
+ P_BLUE_2 = {:dark => '#79c0ff'}
24
+ P_BLUE_5 = {:dark => '#1f6feb'}
25
+ P_BLUE_6 = {:light => '#0550ae'}
26
+ P_BLUE_8 = {:light => '#0a3069'}
27
+ P_PURPLE_2 = {:dark => '#d2a8ff'}
28
+ P_PURPLE_5 = {:light => '#8250df'}
29
+ P_GRAY_0 = {:light => '#f6f8fa', :dark => '#f0f6fc'}
30
+ P_GRAY_1 = {:dark => '#c9d1d9'}
31
+ P_GRAY_3 = {:dark => '#8b949e'}
32
+ P_GRAY_5 = {:light => '#6e7781'}
33
+ P_GRAY_8 = {:dark => '#161b22'}
34
+ P_GRAY_9 = {:light => '#24292f'}
35
+
36
+ extend HasModes
37
+
38
+ def self.light!
39
+ mode :dark # indicate that there is a dark variant
40
+ mode! :light
41
+ end
42
+
43
+ def self.dark!
44
+ mode :light # indicate that there is a light variant
45
+ mode! :dark
46
+ end
47
+
48
+ def self.make_dark!
49
+ palette :comment => P_GRAY_3[@mode]
50
+ palette :constant => P_BLUE_2[@mode]
51
+ palette :entity => P_PURPLE_2[@mode]
52
+ palette :heading => P_BLUE_5[@mode]
53
+ palette :keyword => P_RED_3[@mode]
54
+ palette :string => P_BLUE_1[@mode]
55
+ palette :tag => P_GREEN_1[@mode]
56
+ palette :variable => P_ORANGE_2[@mode]
57
+
58
+ palette :fgDefault => P_GRAY_1[@mode]
59
+ palette :bgDefault => P_GRAY_8[@mode]
60
+
61
+ palette :fgInserted => P_GREEN_0[@mode]
62
+ palette :bgInserted => P_GREEN_8[@mode]
63
+
64
+ palette :fgDeleted => P_RED_0[@mode]
65
+ palette :bgDeleted => P_RED_8[@mode]
66
+
67
+ palette :fgError => P_GRAY_0[@mode]
68
+ palette :bgError => P_RED_7[@mode]
69
+ end
70
+
71
+ def self.make_light!
72
+ palette :comment => P_GRAY_5[@mode]
73
+ palette :constant => P_BLUE_6[@mode]
74
+ palette :entity => P_PURPLE_5[@mode]
75
+ palette :heading => P_BLUE_6[@mode]
76
+ palette :keyword => P_RED_5[@mode]
77
+ palette :string => P_BLUE_8[@mode]
78
+ palette :tag => P_GREEN_6[@mode]
79
+ palette :variable => P_ORANGE_6[@mode]
80
+
81
+ palette :fgDefault => P_GRAY_9[@mode]
82
+ palette :bgDefault => P_GRAY_0[@mode]
83
+
84
+ palette :fgInserted => P_GREEN_6[@mode]
85
+ palette :bgInserted => P_GREEN_0[@mode]
86
+
87
+ palette :fgDeleted => P_RED_7[@mode]
88
+ palette :bgDeleted => P_RED_0[@mode]
89
+
90
+ palette :fgError => P_GRAY_0[@mode]
91
+ palette :bgError => P_RED_7[@mode]
92
+ end
93
+
94
+ light!
95
+
96
+ style Text, :fg => :fgDefault, :bg => :bgDefault
97
+
98
+ style Keyword, :fg => :keyword
99
+
100
+ style Generic::Error, :fg => :fgError
101
+
102
+ style Generic::Deleted, :fg => :fgDeleted, :bg => :bgDeleted
103
+
104
+ style Name::Builtin,
105
+ Name::Class,
106
+ Name::Constant,
107
+ Name::Namespace, :fg => :variable
108
+
109
+ style Literal::String::Regex,
110
+ Name::Attribute,
111
+ Name::Tag, :fg => :tag
112
+
113
+ style Generic::Inserted, :fg => :fgInserted, :bg => :bgInserted
114
+
115
+ style Keyword::Constant,
116
+ Literal,
117
+ Literal::String::Backtick,
118
+ Name::Builtin::Pseudo,
119
+ Name::Exception,
120
+ Name::Label,
121
+ Name::Property,
122
+ Name::Variable,
123
+ Operator, :fg => :constant
124
+
125
+ style Generic::Heading,
126
+ Generic::Subheading, :fg => :heading, :bold => true
127
+
128
+ style Literal::String, :fg => :string
129
+
130
+ style Name::Decorator,
131
+ Name::Function, :fg => :entity
132
+
133
+ style Error, :fg => :fgError, :bg => :bgError
134
+
135
+ style Comment,
136
+ Generic::Lineno,
137
+ Generic::Traceback, :fg => :comment
138
+
139
+ style Name::Entity,
140
+ Literal::String::Interpol, :fg => :fgDefault
141
+
142
+ style Generic::Emph, :fg => :fgDefault, :italic => true
143
+
144
+ style Generic::Strong, :fg => :fgDefault, :bold => true
145
+
71
146
  end
72
147
  end
73
148
  end
data/lib/rouge/version.rb CHANGED
@@ -3,6 +3,6 @@
3
3
 
4
4
  module Rouge
5
5
  def self.version
6
- "4.0.1"
6
+ "4.1.1"
7
7
  end
8
8
  end
data/lib/rouge.rb CHANGED
@@ -47,11 +47,9 @@ module Rouge
47
47
  #
48
48
  # @api private
49
49
  def load_lexers
50
- # The trailing slash is necessary to avoid lexers being loaded multiple
51
- # times by `Lexers.load_lexer`
52
- lexer_dir = File.join(LIB_DIR, "rouge/lexers/")
53
- Dir.glob(File.join(lexer_dir, '*.rb')).each do |f|
54
- Lexers.load_lexer(f.sub(lexer_dir, ''))
50
+ lexer_dir = Pathname.new(LIB_DIR) / "rouge/lexers"
51
+ Pathname.glob(lexer_dir / '*.rb').each do |f|
52
+ Lexers.load_lexer(f.relative_path_from(lexer_dir))
55
53
  end
56
54
  end
57
55
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rouge
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.1
4
+ version: 4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeanine Adkisson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-17 00:00:00.000000000 Z
11
+ date: 2023-05-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Rouge aims to a be a simple, easy-to-extend drop-in replacement for pygments.
14
14
  email:
@@ -44,6 +44,7 @@ files:
44
44
  - lib/rouge/demos/c
45
45
  - lib/rouge/demos/ceylon
46
46
  - lib/rouge/demos/cfscript
47
+ - lib/rouge/demos/cisco_ios
47
48
  - lib/rouge/demos/clean
48
49
  - lib/rouge/demos/clojure
49
50
  - lib/rouge/demos/cmake
@@ -284,6 +285,7 @@ files:
284
285
  - lib/rouge/lexers/c.rb
285
286
  - lib/rouge/lexers/ceylon.rb
286
287
  - lib/rouge/lexers/cfscript.rb
288
+ - lib/rouge/lexers/cisco_ios.rb
287
289
  - lib/rouge/lexers/clean.rb
288
290
  - lib/rouge/lexers/clojure.rb
289
291
  - lib/rouge/lexers/cmake.rb
@@ -541,7 +543,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
541
543
  - !ruby/object:Gem::Version
542
544
  version: '0'
543
545
  requirements: []
544
- rubygems_version: 3.1.6
546
+ rubygems_version: 3.4.12
545
547
  signing_key:
546
548
  specification_version: 4
547
549
  summary: A pure-ruby colorizer based on pygments