rouge 4.7.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +11 -4
  3. data/bin/rougify +3 -4
  4. data/lib/rouge/cli.rb +7 -10
  5. data/lib/rouge/demos/abap +30 -4
  6. data/lib/rouge/demos/addmusick +12 -0
  7. data/lib/rouge/demos/dylan +8 -0
  8. data/lib/rouge/demos/java +3 -0
  9. data/lib/rouge/demos/kick_assembler +14 -0
  10. data/lib/rouge/demos/pdf +29 -0
  11. data/lib/rouge/demos/thrift +15 -0
  12. data/lib/rouge/demos/veryl +24 -0
  13. data/lib/rouge/eager.rb +3 -0
  14. data/lib/rouge/formatters/html.rb +8 -1
  15. data/lib/rouge/formatters/html_debug.rb +16 -0
  16. data/lib/rouge/formatters/html_legacy.rb +15 -1
  17. data/lib/rouge/formatters/html_legacy_table.rb +57 -0
  18. data/lib/rouge/formatters/html_line_highlighter.rb +11 -4
  19. data/lib/rouge/formatters/html_line_table.rb +8 -3
  20. data/lib/rouge/formatters/html_linewise.rb +11 -2
  21. data/lib/rouge/formatters/html_pygments.rb +6 -1
  22. data/lib/rouge/formatters/html_table.rb +47 -21
  23. data/lib/rouge/formatters/terminal256.rb +3 -3
  24. data/lib/rouge/formatters/tex.rb +1 -1
  25. data/lib/rouge/guesser.rb +1 -1
  26. data/lib/rouge/guessers/disambiguation.rb +2 -2
  27. data/lib/rouge/guessers/glob_mapping.rb +2 -2
  28. data/lib/rouge/guessers/modeline.rb +2 -2
  29. data/lib/rouge/lexer.rb +75 -21
  30. data/lib/rouge/lexers/abap/builtins.rb +187 -0
  31. data/lib/rouge/lexers/abap.rb +70 -178
  32. data/lib/rouge/lexers/ada.rb +1 -1
  33. data/lib/rouge/lexers/addmusick.rb +251 -0
  34. data/lib/rouge/lexers/apache/keywords.rb +3 -11
  35. data/lib/rouge/lexers/apache.rb +25 -24
  36. data/lib/rouge/lexers/apex.rb +2 -2
  37. data/lib/rouge/lexers/apiblueprint.rb +3 -3
  38. data/lib/rouge/lexers/apple_script.rb +2 -2
  39. data/lib/rouge/lexers/bicep.rb +2 -2
  40. data/lib/rouge/lexers/biml.rb +36 -9
  41. data/lib/rouge/lexers/brightscript.rb +3 -4
  42. data/lib/rouge/lexers/c.rb +9 -5
  43. data/lib/rouge/lexers/console.rb +11 -5
  44. data/lib/rouge/lexers/cpp.rb +10 -12
  45. data/lib/rouge/lexers/crystal.rb +1 -1
  46. data/lib/rouge/lexers/css.rb +21 -2
  47. data/lib/rouge/lexers/cuda.rb +4 -4
  48. data/lib/rouge/lexers/cypher.rb +0 -1
  49. data/lib/rouge/lexers/cython.rb +26 -50
  50. data/lib/rouge/lexers/dafny.rb +1 -1
  51. data/lib/rouge/lexers/dart.rb +2 -0
  52. data/lib/rouge/lexers/datastudio.rb +1 -1
  53. data/lib/rouge/lexers/digdag.rb +2 -3
  54. data/lib/rouge/lexers/dylan.rb +109 -0
  55. data/lib/rouge/lexers/ecl.rb +3 -3
  56. data/lib/rouge/lexers/elixir.rb +15 -10
  57. data/lib/rouge/lexers/escape.rb +1 -1
  58. data/lib/rouge/lexers/factor.rb +1 -1
  59. data/lib/rouge/lexers/freefem.rb +2 -2
  60. data/lib/rouge/lexers/gdscript.rb +1 -1
  61. data/lib/rouge/lexers/ghc_cmm.rb +1 -1
  62. data/lib/rouge/lexers/ghc_core.rb +1 -1
  63. data/lib/rouge/lexers/gherkin/keywords.rb +10 -6
  64. data/lib/rouge/lexers/gherkin.rb +28 -26
  65. data/lib/rouge/lexers/gjs.rb +2 -2
  66. data/lib/rouge/lexers/glsl/builtins.rb +17 -0
  67. data/lib/rouge/lexers/glsl.rb +50 -113
  68. data/lib/rouge/lexers/go.rb +2 -2
  69. data/lib/rouge/lexers/gradle.rb +2 -2
  70. data/lib/rouge/lexers/groovy.rb +6 -0
  71. data/lib/rouge/lexers/gts.rb +2 -2
  72. data/lib/rouge/lexers/hack.rb +5 -7
  73. data/lib/rouge/lexers/haxe.rb +3 -3
  74. data/lib/rouge/lexers/hlsl.rb +6 -6
  75. data/lib/rouge/lexers/hocon.rb +2 -2
  76. data/lib/rouge/lexers/hql.rb +15 -19
  77. data/lib/rouge/lexers/idris.rb +1 -1
  78. data/lib/rouge/lexers/igorpro/builtins.rb +1530 -0
  79. data/lib/rouge/lexers/igorpro.rb +49 -520
  80. data/lib/rouge/lexers/irb.rb +3 -3
  81. data/lib/rouge/lexers/isbl.rb +7 -43
  82. data/lib/rouge/lexers/j.rb +1 -1
  83. data/lib/rouge/lexers/java.rb +7 -4
  84. data/lib/rouge/lexers/json5.rb +2 -2
  85. data/lib/rouge/lexers/json_doc.rb +2 -2
  86. data/lib/rouge/lexers/jsp.rb +119 -119
  87. data/lib/rouge/lexers/jsx.rb +3 -3
  88. data/lib/rouge/lexers/kick_assembler.rb +100 -0
  89. data/lib/rouge/lexers/kotlin.rb +5 -0
  90. data/lib/rouge/lexers/lasso/keywords.rb +6 -6
  91. data/lib/rouge/lexers/lasso.rb +9 -11
  92. data/lib/rouge/lexers/lean.rb +0 -1
  93. data/lib/rouge/lexers/liquid.rb +5 -6
  94. data/lib/rouge/lexers/llvm/keywords.rb +3 -12
  95. data/lib/rouge/lexers/llvm.rb +5 -16
  96. data/lib/rouge/lexers/lua/keywords.rb +11 -13
  97. data/lib/rouge/lexers/lua.rb +8 -7
  98. data/lib/rouge/lexers/lutin.rb +5 -4
  99. data/lib/rouge/lexers/m68k.rb +3 -3
  100. data/lib/rouge/lexers/make.rb +2 -0
  101. data/lib/rouge/lexers/markdown.rb +7 -6
  102. data/lib/rouge/lexers/mason.rb +110 -110
  103. data/lib/rouge/lexers/mathematica/keywords.rb +1 -3
  104. data/lib/rouge/lexers/mathematica.rb +6 -7
  105. data/lib/rouge/lexers/matlab/keywords.rb +2 -2
  106. data/lib/rouge/lexers/matlab.rb +5 -5
  107. data/lib/rouge/lexers/meson.rb +1 -1
  108. data/lib/rouge/lexers/mojo.rb +6 -3
  109. data/lib/rouge/lexers/moonscript.rb +19 -17
  110. data/lib/rouge/lexers/nesasm.rb +6 -6
  111. data/lib/rouge/lexers/nial.rb +7 -8
  112. data/lib/rouge/lexers/nim.rb +3 -3
  113. data/lib/rouge/lexers/nix.rb +10 -8
  114. data/lib/rouge/lexers/objective_c.rb +3 -3
  115. data/lib/rouge/lexers/objective_cpp.rb +3 -2
  116. data/lib/rouge/lexers/ocaml.rb +2 -2
  117. data/lib/rouge/lexers/openedge.rb +9 -9
  118. data/lib/rouge/lexers/pdf.rb +109 -0
  119. data/lib/rouge/lexers/perl.rb +140 -43
  120. data/lib/rouge/lexers/php/keywords.rb +136 -138
  121. data/lib/rouge/lexers/php.rb +59 -10
  122. data/lib/rouge/lexers/plist.rb +0 -1
  123. data/lib/rouge/lexers/plsql.rb +8 -9
  124. data/lib/rouge/lexers/postscript.rb +2 -2
  125. data/lib/rouge/lexers/powershell.rb +1 -1
  126. data/lib/rouge/lexers/prolog.rb +0 -1
  127. data/lib/rouge/lexers/prometheus.rb +0 -1
  128. data/lib/rouge/lexers/properties.rb +2 -2
  129. data/lib/rouge/lexers/python.rb +110 -65
  130. data/lib/rouge/lexers/qml.rb +2 -3
  131. data/lib/rouge/lexers/r.rb +1 -1
  132. data/lib/rouge/lexers/reasonml.rb +2 -2
  133. data/lib/rouge/lexers/rego.rb +53 -53
  134. data/lib/rouge/lexers/rescript.rb +2 -2
  135. data/lib/rouge/lexers/robot_framework.rb +12 -12
  136. data/lib/rouge/lexers/{coq.rb → rocq.rb} +15 -6
  137. data/lib/rouge/lexers/ruby.rb +33 -7
  138. data/lib/rouge/lexers/rust.rb +1 -0
  139. data/lib/rouge/lexers/sas.rb +164 -165
  140. data/lib/rouge/lexers/sass/common.rb +1 -1
  141. data/lib/rouge/lexers/sass.rb +2 -2
  142. data/lib/rouge/lexers/scala.rb +0 -1
  143. data/lib/rouge/lexers/scss.rb +2 -2
  144. data/lib/rouge/lexers/sed.rb +1 -1
  145. data/lib/rouge/lexers/shell.rb +23 -7
  146. data/lib/rouge/lexers/slice.rb +2 -2
  147. data/lib/rouge/lexers/smarty.rb +0 -1
  148. data/lib/rouge/lexers/sparql.rb +1 -1
  149. data/lib/rouge/lexers/sqf/keywords.rb +5 -3
  150. data/lib/rouge/lexers/sqf.rb +3 -4
  151. data/lib/rouge/lexers/stan.rb +9 -15
  152. data/lib/rouge/lexers/svelte.rb +2 -2
  153. data/lib/rouge/lexers/swift.rb +2 -2
  154. data/lib/rouge/lexers/tap.rb +0 -1
  155. data/lib/rouge/lexers/tcl.rb +1 -1
  156. data/lib/rouge/lexers/terraform.rb +2 -2
  157. data/lib/rouge/lexers/thrift.rb +120 -0
  158. data/lib/rouge/lexers/tsx.rb +3 -3
  159. data/lib/rouge/lexers/ttcn3.rb +1 -1
  160. data/lib/rouge/lexers/tulip.rb +0 -1
  161. data/lib/rouge/lexers/twig.rb +2 -2
  162. data/lib/rouge/lexers/typescript.rb +3 -3
  163. data/lib/rouge/lexers/varnish.rb +8 -8
  164. data/lib/rouge/lexers/veryl.rb +109 -0
  165. data/lib/rouge/lexers/vhdl.rb +3 -1
  166. data/lib/rouge/lexers/viml/keywords.rb +5 -7
  167. data/lib/rouge/lexers/viml.rb +8 -10
  168. data/lib/rouge/lexers/vue.rb +20 -4
  169. data/lib/rouge/lexers/xquery.rb +2 -1
  170. data/lib/rouge/lexers/yaml.rb +13 -1
  171. data/lib/rouge/lexers/yang.rb +42 -74
  172. data/lib/rouge/lexers/zig.rb +10 -10
  173. data/lib/rouge/plugins/redcarpet.rb +3 -2
  174. data/lib/rouge/regex_lexer.rb +37 -14
  175. data/lib/rouge/themes/gruvbox.rb +3 -0
  176. data/lib/rouge/themes/thankful_eyes.rb +2 -1
  177. data/lib/rouge/token.rb +1 -1
  178. data/lib/rouge/util.rb +1 -1
  179. data/lib/rouge/version.rb +1 -1
  180. data/lib/rouge.rb +70 -59
  181. data/lib/rubocop/cop/rouge/no_building_alternation_pattern_in_regexp.rb +71 -0
  182. data/lib/rubocop/cop/rouge/no_huge_collections.rb +37 -0
  183. data/rouge.gemspec +8 -5
  184. metadata +43 -10
  185. data/lib/rouge/lexers/isbl/builtins.rb +0 -17
  186. data/lib/rouge/lexers/matlab/builtins.rb +0 -11
  187. /data/lib/rouge/demos/{applescript → apple_script} +0 -0
  188. /data/lib/rouge/demos/{coq → rocq} +0 -0
@@ -17,13 +17,13 @@ module Rouge
17
17
  return true if text.shebang? 'perl'
18
18
  end
19
19
 
20
- keywords = %w(
20
+ KEYWORDS = Set.new %w(
21
21
  case continue do else elsif for foreach if last my next our
22
22
  redo reset then unless until while use print new BEGIN CHECK
23
23
  INIT END return
24
24
  )
25
25
 
26
- builtins = %w(
26
+ BUILTINS = Set.new %w(
27
27
  abs accept alarm atan2 bind binmode bless caller chdir chmod
28
28
  chomp chop chown chr chroot close closedir connect continue cos
29
29
  crypt dbmclose dbmopen defined delete die dump each endgrent
@@ -49,25 +49,108 @@ module Rouge
49
49
  utime values vec wait waitpid wantarray warn write
50
50
  )
51
51
 
52
+ OPERATOR_WORDS = Set.new %w(eq lt gt le ge ne not and or cmp)
53
+
52
54
  re_tok = Str::Regex
53
55
 
54
56
  state :balanced_regex do
55
- rule %r(/(\\[\\/]|[^/])*/[egimosx]*)m, re_tok, :pop!
56
- rule %r(!(\\[\\!]|[^!])*![egimosx]*)m, re_tok, :pop!
57
- rule %r(\\(\\\\|[^\\])*\\[egimosx]*)m, re_tok, :pop!
58
- rule %r({(\\[\\}]|[^}])*}[egimosx]*), re_tok, :pop!
59
- rule %r(<(\\[\\>]|[^>])*>[egimosx]*), re_tok, :pop!
60
- rule %r(\[(\\[\\\]]|[^\]])*\][egimosx]*), re_tok, :pop!
61
- rule %r[\((\\[\\\)]|[^\)])*\)[egimosx]*], re_tok, :pop!
62
- rule %r(@(\\[\\@]|[^@])*@[egimosx]*), re_tok, :pop!
63
- rule %r(%(\\[\\%]|[^%])*%[egimosx]*), re_tok, :pop!
64
- rule %r(\$(\\[\\\$]|[^\$])*\$[egimosx]*), re_tok, :pop!
57
+ rule %r/\s+/, Text
58
+ rule %r/./ do |m|
59
+ pop!
60
+ open_regex!(m[0])
61
+ token Str::Delimiter
62
+ end
65
63
  end
66
64
 
67
- state :root do
65
+ state :continued_regex do
66
+ mixin :regex
67
+ end
68
+
69
+ state :regex_flags do
70
+ rule %r/[msixpodualngcr]+/, Str::Affix
71
+ rule(//) { pop! }
72
+ end
73
+
74
+ state :regex_escapes do
75
+ rule %r/\\[0-7][0-7][0-7]/, Str::Escape
76
+ rule %r/\\x\h\h/, Str::Escape
77
+ rule %r/\\.(?:[{]\w+[}])?/, Str::Escape
78
+ end
79
+
80
+ state :regex do
81
+ rule %r/./ do |m|
82
+ if m[0] == @regex_end
83
+ token Str::Delimiter
84
+ goto :regex_flags
85
+ else
86
+ fallthrough!
87
+ end
88
+ end
89
+
90
+ mixin :regex_escapes
91
+ rule %r/[{]\d+(?:,\d+)?[}]/, Operator
92
+ rule %r/\[\^?/, Punctuation, :regex_char_class
93
+ rule %r/[?]|[.]|[|]|[*+][?]?/, Operator
94
+ rule %r/[(](?:[?][=!<:]?)?/, Punctuation
95
+ rule %r/[(][?]<!/, Punctuation
96
+ rule %r/[{})]/, Punctuation
97
+ rule %r/./, Str::Regex
98
+ end
99
+
100
+ state :regex_char_class do
101
+ rule(/\^/) { token Punctuation; goto :regex_char_class_inner }
102
+ rule(/-/) { token Str::Regex; goto :regex_char_class_inner }
103
+ rule(//) { goto :regex_char_class_inner }
104
+ end
105
+
106
+ state :regex_char_class_inner do
107
+ mixin :regex_escapes
108
+ rule %r/-(?!\])/, Punctuation
109
+ rule %r/\\./, Str::Escape
110
+ rule %r/[^-\]\\]+/, Str::Regex
111
+ rule %r/\]/, Punctuation, :pop!
112
+ end
113
+
114
+ BALANCED_DELIMITERS = {
115
+ '{' => '}',
116
+ '(' => ')',
117
+ '[' => ']',
118
+ '<' => '>',
119
+ }
120
+
121
+ def open_regex!(delimiter)
122
+ @regex_end = BALANCED_DELIMITERS.fetch(delimiter, delimiter)
123
+ push :regex
124
+ end
125
+
126
+ def open_regex_operator!(delimiter)
127
+ if BALANCED_DELIMITERS.key?(delimiter)
128
+ push :balanced_regex
129
+ else
130
+ push :continued_regex
131
+ end
132
+
133
+ open_regex!(delimiter)
134
+ end
135
+
136
+ state :expr_start do
137
+ mixin :whitespace
138
+ rule %r(/) do
139
+ open_regex!('/')
140
+ token Str::Delimiter
141
+ end
142
+
143
+ rule(//) { pop! }
144
+ end
145
+
146
+ state :whitespace do
68
147
  rule %r/#.*/, Comment::Single
148
+ rule %r/\s+/, Text
69
149
  rule %r/^=[a-zA-Z0-9]+\s+.*?\n=cut/m, Comment::Multiline
70
- rule %r/(?:#{keywords.join('|')})\b/, Keyword
150
+ end
151
+
152
+ state :root do
153
+ mixin :whitespace
71
154
 
72
155
  rule %r/(format)(\s+)([a-zA-Z0-9_]+)(\s*)(=)(\s*\n)/ do
73
156
  groups Keyword, Text, Name, Text, Punctuation, Text
@@ -75,34 +158,37 @@ module Rouge
75
158
  push :format
76
159
  end
77
160
 
78
- rule %r/(?:eq|lt|gt|le|ge|ne|not|and|or|cmp)\b/, Operator::Word
79
-
80
- # substitution/transliteration: balanced delimiters
81
- rule %r((?:s|tr|y){(\\\\|\\}|[^}])*}\s*), re_tok, :balanced_regex
82
- rule %r((?:s|tr|y)<(\\\\|\\>|[^>])*>\s*), re_tok, :balanced_regex
83
- rule %r((?:s|tr|y)\[(\\\\|\\\]|[^\]])*\]\s*), re_tok, :balanced_regex
84
- rule %r[(?:s|tr|y)\((\\\\|\\\)|[^\)])*\)\s*], re_tok, :balanced_regex
85
-
86
- # substitution/transliteration: arbitrary non-whitespace delimiters
87
- rule %r((?:s|tr|y)\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok
88
- rule %r((?:s|tr|y)\s+(\w)((\\\\|\\\1)|[^\1])*?\1((\\\\|\\\1)|[^\1])*?\1[msixpodualngcr]*)m, re_tok
89
-
90
- # matches: common case, m-optional
91
- rule %r(m?/(\\\\|\\/|[^/\n])*/[msixpodualngc]*), re_tok
92
- rule %r(m(?=[/!\\{<\[\(@%\$])), re_tok, :balanced_regex
161
+ rule %r/\w+/ do |m|
162
+ w = m[0]
163
+ if KEYWORDS.include?(w)
164
+ token Keyword
165
+ elsif OPERATOR_WORDS.include?(w)
166
+ token Operator::Word
167
+ else
168
+ fallthrough!
169
+ end
170
+ end
93
171
 
94
- # arbitrary non-whitespace delimiters
95
- rule %r(m\s*([^\w\s])((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
96
- rule %r(m\s+(\w)((\\\\|\\\1)|[^\1])*?\1[msixpodualngc]*)m, re_tok
172
+ rule %r{(?=[a-z_]\w*(\s*#.*\n)*\s*=>)}i do
173
+ push :fat_comma
174
+ end
97
175
 
98
- rule %r(((?<==~)|(?<=\())\s*/(\\\\|\\/|[^/])*/[msixpodualngc]*),
99
- re_tok, :balanced_regex
176
+ # non-whitespace delimiters that match \w are allowed only
177
+ # if there is whitespace between the operator and the delimiter.
178
+ # here we use a \b to detect that case in a way that shouldn't
179
+ # cause backtracking explosion.
180
+ regex_delim = /[^\w\s]|\b\w/
100
181
 
101
- rule %r/\s+/, Text
182
+ rule %r/(s|tr|y)(\s*)(#{regex_delim})/ do |m|
183
+ open_regex_operator!(m[3])
184
+ groups Str::Affix, Text, Str::Delimiter
185
+ end
102
186
 
103
- rule(/(?=[a-z_]\w*(\s*#.*\n)*\s*=>)/i) { push :fat_comma }
187
+ rule %r/(m)(\s*)(#{regex_delim})/ do |m|
188
+ open_regex!(m[3])
189
+ groups Str::Affix, Text, Str::Delimiter
190
+ end
104
191
 
105
- rule %r/(?:#{builtins.join('|')})\b/, Name::Builtin
106
192
  rule %r/((__(DIE|WARN)__)|(DATA|STD(IN|OUT|ERR)))\b/,
107
193
  Name::Builtin::Pseudo
108
194
 
@@ -113,7 +199,9 @@ module Rouge
113
199
  rule %r/\$[\\"'\[\]&`+*.,;=%~?@$!<>(^\|\/_-](?!\w)/, Name::Variable::Global
114
200
  rule %r/[$@%&*][$@%&*#_]*(?=[a-z{\[;])/i, Name::Variable, :varname
115
201
 
116
- rule %r/[-+\/*%=<>&^\|!\\~]=?/, Operator
202
+ rule %r/\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/,
203
+ Operator, :expr_start
204
+ rule %r/[-+\/*%=<>&^\|!\\~]=?/, Operator, :expr_start
117
205
 
118
206
  rule %r/0_?[0-7]+(_[0-7]+)*/, Num::Oct
119
207
  rule %r/0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*/, Num::Hex
@@ -133,11 +221,20 @@ module Rouge
133
221
  rule %r/(q|qq|qw|qr|qx)</, Str::Other, :lt_string
134
222
  rule %r/(q|qq|qw|qr|qx)(\W)(.|\n)*?\2/, Str::Other
135
223
 
136
- rule %r/package\s+/, Keyword, :modulename
137
- rule %r/sub\s+/, Keyword, :funcname
138
- rule %r/\[\]|\*\*|::|<<|>>|>=|<=|<=>|={3}|!=|=~|!~|&&?|\|\||\.{1,3}/,
139
- Operator
140
- rule %r/[()\[\]:;,<>\/?{}]/, Punctuation
224
+ rule %r/package\b/, Keyword, :modulename
225
+ rule %r/sub\b/, Keyword, :funcname
226
+ rule %r/[(]/, Punctuation, :expr_start
227
+ rule %r/[)\[\]:;,<>\/?{}]/, Punctuation
228
+
229
+ rule %r/[a-z]\w*/ do |m|
230
+ w = m[0]
231
+ if BUILTINS.include?(w)
232
+ token Name::Builtin
233
+ else
234
+ fallthrough!
235
+ end
236
+ end
237
+
141
238
  rule(/(?=\w)/) { push :name }
142
239
  end
143
240