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
@@ -13,9 +13,8 @@ module Rouge
13
13
 
14
14
  mimetypes 'text/x-vim'
15
15
 
16
- def self.keywords
17
- Kernel::load File.join(Lexers::BASE_DIR, 'viml/keywords.rb')
18
- self.keywords
16
+ lazy do
17
+ require_relative 'viml/keywords'
19
18
  end
20
19
 
21
20
  state :root do
@@ -47,15 +46,14 @@ module Rouge
47
46
  rule %r/[absg]:\w+\b/, Name::Variable
48
47
  rule %r/\b\w+\b/ do |m|
49
48
  name = m[0]
50
- keywords = self.class.keywords
51
49
 
52
- if keywords[:command].include? name
50
+ if KEYWORDS[:command].include? name
53
51
  token Keyword
54
- elsif keywords[:function].include? name
55
- token Name::Builtin
56
- elsif keywords[:option].include? name
57
- token Name::Builtin
58
- elsif keywords[:auto].include? name
52
+ elsif (
53
+ KEYWORDS[:function].include?(name) ||
54
+ KEYWORDS[:option].include?(name) ||
55
+ KEYWORDS[:auto].include?(name)
56
+ )
59
57
  token Name::Builtin
60
58
  else
61
59
  token Text
@@ -1,10 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'html'
4
+
3
5
  module Rouge
4
6
  module Lexers
5
- load_lexer 'html.rb'
6
-
7
7
  class Vue < HTML
8
+ # HTML extended with Vue template attribute shorthands.
9
+ # Used as the delegate lexer for <template> content so that directives
10
+ # like @click and @click.disabled are recognised without polluting the plain
11
+ # HTML lexer with framework-specific syntax.
12
+ class TemplateHTML < HTML
13
+ prepend :tag do
14
+ rule %r/([@a-zA-Z0-9_:#\[\]()*.-]+\s*)(=)(\s*)/m do
15
+ groups Name::Attribute, Operator, Text
16
+ push :attr
17
+ end
18
+ end
19
+ end
20
+
8
21
  desc 'Vue.js single-file components'
9
22
  tag 'vue'
10
23
  aliases 'vuejs'
@@ -38,7 +51,7 @@ module Rouge
38
51
  prepend :root do
39
52
  rule %r/(<)(\s*)(template)/ do
40
53
  groups Name::Tag, Text, Keyword
41
- @lang = HTML
54
+ @lang = TemplateHTML
42
55
  push :template
43
56
  push :lang_tag
44
57
  end
@@ -59,7 +72,10 @@ module Rouge
59
72
  end
60
73
 
61
74
  prepend :tag do
62
- rule %r/[a-zA-Z0-9_:#\[\]()*.-]+\s*=\s*/m, Name::Attribute, :attr
75
+ rule %r/([a-zA-Z0-9_:#\[\]()*.-]+\s*)(=)(\s*)/m do
76
+ groups Name::Attribute, Operator, Text
77
+ push :attr
78
+ end
63
79
  end
64
80
 
65
81
  state :style do
@@ -1,9 +1,10 @@
1
1
  # -*- coding: utf-8 -*- #
2
2
  # frozen_string_literal: true
3
3
 
4
+ require_relative 'xpath'
5
+
4
6
  module Rouge
5
7
  module Lexers
6
- load_lexer 'xpath.rb'
7
8
  class XQuery < XPath
8
9
  title 'XQuery'
9
10
  desc 'XQuery 3.1: An XML Query Language'
@@ -172,12 +172,24 @@ module Rouge
172
172
  end
173
173
 
174
174
  state :block_nodes do
175
- # implicit key
175
+ # implicit unquoted key
176
176
  rule %r/([^#,?\[\]{}"'\n]+)(:)(?=\s|$)/ do |m|
177
177
  groups Name::Attribute, Punctuation::Indicator
178
178
  set_indent m[0], :implicit => true
179
179
  end
180
180
 
181
+ # implicit double-quoted key
182
+ rule %r/("(?:[^\n"]|\\")*")(\s*)(:)(?=\s|$)/ do |m|
183
+ groups Name::Attribute, Text, Punctuation::Indicator
184
+ set_indent m[0], :implicit => true
185
+ end
186
+
187
+ # implicit single-quoted key
188
+ rule %r/('(?:[^\n']|\\')*')(\s*)(:)(?=\s|$)/ do |m|
189
+ groups Name::Attribute, Text, Punctuation::Indicator
190
+ set_indent m[0], :implicit => true
191
+ end
192
+
181
193
  # literal and folded scalars
182
194
  rule %r/[\|>][+-]?/ do
183
195
  token Punctuation::Indicator
@@ -13,74 +13,56 @@ module Rouge
13
13
  id = /[\w-]+(?=[^\w\-\:])\b/
14
14
 
15
15
  #Keywords from RFC7950 ; oriented at BNF style
16
- def self.top_stmts_keywords
17
- @top_stms_keywords ||= Set.new %w(
18
- module submodule
19
- )
20
- end
16
+ top_keywords = Set.new %w(module submodule)
21
17
 
22
- def self.module_header_stmts_keywords
23
- @module_header_stmts_keywords ||= Set.new %w(
24
- belongs-to namespace prefix yang-version
25
- )
26
- end
18
+ module_header_keywords = Set.new %w(belongs-to namespace prefix yang-version)
27
19
 
28
- def self.meta_stmts_keywords
29
- @meta_stmts_keywords ||= Set.new %w(
30
- contact description organization reference revision
31
- )
32
- end
20
+ meta_keywords = Set.new %w(contact description organization reference revision)
33
21
 
34
- def self.linkage_stmts_keywords
35
- @linkage_stmts_keywords ||= Set.new %w(
36
- import include revision-date
37
- )
38
- end
22
+ linkage_keywords = Set.new %w(import include revision-date)
39
23
 
40
- def self.body_stmts_keywords
41
- @body_stms_keywords ||= Set.new %w(
42
- action argument augment deviation extension feature grouping identity
43
- if-feature input notification output rpc typedef
44
- )
45
- end
24
+ body_keywords = Set.new %w(
25
+ action argument augment deviation extension feature grouping identity
26
+ if-feature input notification output rpc typedef
27
+ )
46
28
 
47
- def self.data_def_stmts_keywords
48
- @data_def_stms_keywords ||= Set.new %w(
49
- anydata anyxml case choice config container deviate leaf leaf-list
50
- list must presence refine uses when
51
- )
52
- end
29
+ data_def_keywords = Set.new %w(
30
+ anydata anyxml case choice config container deviate leaf leaf-list
31
+ list must presence refine uses when
32
+ )
53
33
 
54
- def self.type_stmts_keywords
55
- @type_stmts_keywords ||= Set.new %w(
56
- base bit default enum error-app-tag error-message fraction-digits
57
- length max-elements min-elements modifier ordered-by path pattern
58
- position range require-instance status type units value yin-element
59
- )
60
- end
34
+ type_keywords = Set.new %w(
35
+ base bit default enum error-app-tag error-message fraction-digits
36
+ length max-elements min-elements modifier ordered-by path pattern
37
+ position range require-instance status type units value yin-element
38
+ )
61
39
 
62
- def self.list_stmts_keywords
63
- @list_stmts_keywords ||= Set.new %w(
64
- key mandatory unique
65
- )
66
- end
40
+ list_keywords = Set.new %w(
41
+ key mandatory unique
42
+ )
67
43
 
68
44
  #RFC7950 other keywords
69
- def self.constants_keywords
70
- @constants_keywords ||= Set.new %w(
71
- add current delete deprecated false invert-match max min
72
- not-supported obsolete replace true unbounded user
73
- )
74
- end
45
+ CONSTANTS = Set.new %w(
46
+ add current delete deprecated false invert-match max min
47
+ not-supported obsolete replace true unbounded user
48
+ )
75
49
 
76
50
  #RFC7950 Built-In Types
77
- def self.types
78
- @types ||= Set.new %w(
79
- binary bits boolean decimal64 empty enumeration identityref
80
- instance-identifier int16 int32 int64 int8 leafref string uint16
81
- uint32 uint64 uint8 union
82
- )
83
- end
51
+ TYPES = Set.new %w(
52
+ binary bits boolean decimal64 empty enumeration identityref
53
+ instance-identifier int16 int32 int64 int8 leafref string uint16
54
+ uint32 uint64 uint8 union
55
+ )
56
+
57
+ DECLARATIONS =
58
+ top_keywords +
59
+ module_header_keywords +
60
+ meta_keywords +
61
+ linkage_keywords +
62
+ body_keywords +
63
+ data_def_keywords +
64
+ type_keywords +
65
+ list_keywords
84
66
 
85
67
  state :comment do
86
68
  rule %r/[^*\/]/, Comment
@@ -115,25 +97,11 @@ module Rouge
115
97
  rule id do |m|
116
98
  name = m[0].downcase
117
99
 
118
- if self.class.top_stmts_keywords.include? name
119
- token Keyword::Declaration
120
- elsif self.class.module_header_stmts_keywords.include? name
121
- token Keyword::Declaration
122
- elsif self.class.meta_stmts_keywords.include? name
123
- token Keyword::Declaration
124
- elsif self.class.linkage_stmts_keywords.include? name
125
- token Keyword::Declaration
126
- elsif self.class.body_stmts_keywords.include? name
127
- token Keyword::Declaration
128
- elsif self.class.data_def_stmts_keywords.include? name
129
- token Keyword::Declaration
130
- elsif self.class.type_stmts_keywords.include? name
131
- token Keyword::Declaration
132
- elsif self.class.list_stmts_keywords.include? name
100
+ if DECLARATIONS.include?(name)
133
101
  token Keyword::Declaration
134
- elsif self.class.types.include? name
102
+ elsif TYPES.include? name
135
103
  token Keyword::Type
136
- elsif self.class.constants_keywords.include? name
104
+ elsif CONSTANTS.include? name
137
105
  token Name::Constant
138
106
  else
139
107
  token Name
@@ -84,16 +84,16 @@ module Rouge
84
84
  rule %r/([.]?)(\s*)(@?#{id})(\s*)([(]?)/ do |m|
85
85
  name = m[3]
86
86
  t = if self.class.keywords.include? name
87
- Keyword
88
- elsif self.class.builtins.include? name
89
- Name::Builtin
90
- elsif !m[1].empty? && !m[5].empty?
91
- Name::Function
92
- elsif !m[1].empty?
93
- Name::Property
94
- else
95
- Name
96
- end
87
+ Keyword
88
+ elsif self.class.builtins.include? name
89
+ Name::Builtin
90
+ elsif !m[1].empty? && !m[5].empty?
91
+ Name::Function
92
+ elsif !m[1].empty?
93
+ Name::Property
94
+ else
95
+ Name
96
+ end
97
97
 
98
98
  groups Punctuation, Text, t, Text, Punctuation
99
99
  end
@@ -25,12 +25,13 @@ module Rouge
25
25
  end
26
26
 
27
27
  formatter = rouge_formatter(lexer)
28
- formatter.format(lexer.lex(code))
28
+ formatted = formatter.format(lexer.lex(code))
29
+ %(<pre class="highlight #{lexer.tag}"><code>#{formatted}</code></pre>)
29
30
  end
30
31
 
31
32
  # override this method for custom formatting behavior
32
33
  def rouge_formatter(lexer)
33
- Formatters::HTMLLegacy.new(:css_class => "highlight #{lexer.tag}")
34
+ Rouge::Formatters::HTML.new
34
35
  end
35
36
  end
36
37
  end
@@ -37,6 +37,12 @@ module Rouge
37
37
  end
38
38
  end
39
39
 
40
+ # exception class for fallthrough - using an exception is slightly faster
41
+ # than catch { ... }, but it is not semantically an error that should be
42
+ # rescued from.
43
+ class Fallthrough < Exception # rubocop:disable Lint/InheritException
44
+ end
45
+
40
46
  # A rule is a tuple of a regular expression to test, and a callback
41
47
  # to perform if the test succeeds.
42
48
  #
@@ -44,11 +50,9 @@ module Rouge
44
50
  class Rule
45
51
  attr_reader :callback
46
52
  attr_reader :re
47
- attr_reader :beginning_of_line
48
53
  def initialize(re, callback)
49
54
  @re = re
50
55
  @callback = callback
51
- @beginning_of_line = re.source[0] == ?^
52
56
  end
53
57
 
54
58
  def inspect
@@ -277,6 +281,18 @@ module Rouge
277
281
  end
278
282
  end
279
283
 
284
+ def inspect_details
285
+ yield ' stack:['
286
+ first = true
287
+ stack.each do |state|
288
+ yield ',' unless first
289
+ first = false
290
+ yield state.name
291
+ end
292
+
293
+ yield ']'
294
+ end
295
+
280
296
  # @private
281
297
  def get_state(state_name)
282
298
  self.class.get_state(state_name)
@@ -322,7 +338,7 @@ module Rouge
322
338
  #
323
339
  # @see #step #step (where (2.) is implemented)
324
340
  def stream_tokens(str, &b)
325
- stream = StringScanner.new(str)
341
+ stream = StringScanner.new(str, fixed_anchor: true)
326
342
 
327
343
  @current_stream = stream
328
344
  @output_stream = b
@@ -333,7 +349,7 @@ module Rouge
333
349
  if @debug
334
350
  puts
335
351
  puts "lexer: #{self.class.tag}"
336
- puts "stack: #{stack.map(&:name).map(&:to_sym).inspect}"
352
+ puts "stack: #{stack.map { |s| s.name.to_sym }.inspect}"
337
353
  puts "stream: #{stream.peek(20).inspect}"
338
354
  end
339
355
 
@@ -341,7 +357,7 @@ module Rouge
341
357
 
342
358
  if !success
343
359
  puts " no match, yielding Error" if @debug
344
- b.call(Token::Tokens::Error, stream.getch)
360
+ yield(Token::Tokens::Error, stream.getch)
345
361
  end
346
362
  end
347
363
  end
@@ -364,18 +380,9 @@ module Rouge
364
380
  else
365
381
  puts " trying: #{rule.inspect}" if @debug
366
382
 
367
- # XXX HACK XXX
368
- # StringScanner's implementation of ^ is b0rken.
369
- # see http://bugs.ruby-lang.org/issues/7092
370
- # TODO: this doesn't cover cases like /(a|^b)/, but it's
371
- # the most common, for now...
372
- next if rule.beginning_of_line && !stream.beginning_of_line?
373
-
374
383
  if (size = stream.skip(rule.re))
375
384
  puts " got: #{stream[0].inspect}" if @debug
376
385
 
377
- instance_exec(stream, &rule.callback)
378
-
379
386
  if size.zero?
380
387
  @null_steps += 1
381
388
  if @null_steps > MAX_NULL_SCANS
@@ -386,6 +393,13 @@ module Rouge
386
393
  @null_steps = 0
387
394
  end
388
395
 
396
+ begin
397
+ instance_exec(stream, &rule.callback)
398
+ rescue Fallthrough
399
+ stream.unscan
400
+ next
401
+ end
402
+
389
403
  return true
390
404
  end
391
405
  end
@@ -440,10 +454,19 @@ module Rouge
440
454
  end
441
455
  end
442
456
 
457
+ # Re-lexes the given text (or the most recently matched string if
458
+ # none is given) with the current lexer.
443
459
  def recurse(text=nil)
444
460
  delegate(self.class, text)
445
461
  end
446
462
 
463
+ # Breaks out of the current rule block and continues to match later
464
+ # rules, as if the current regex had not matched. Does not affect
465
+ # the stack.
466
+ def fallthrough!
467
+ raise Fallthrough
468
+ end
469
+
447
470
  # Push a state onto the stack. If no state name is given and you've
448
471
  # passed a block, a state will be dynamically created using the
449
472
  # {StateDSL}.
@@ -10,6 +10,7 @@ module Rouge
10
10
  class Gruvbox < CSSTheme
11
11
  name 'gruvbox'
12
12
 
13
+ # rubocop:disable Naming/ConstantName
13
14
  # global Gruvbox colours {{{
14
15
  C_dark0_hard = '#1d2021'
15
16
  C_dark0 ='#282828'
@@ -122,6 +123,8 @@ module Rouge
122
123
  palette orange: C_faded_orange
123
124
  end
124
125
 
126
+ # rubocop:enable Naming/ConstantName
127
+
125
128
  dark!
126
129
  mode :light
127
130
 
@@ -60,7 +60,8 @@ module Rouge
60
60
  Literal::Date,
61
61
  Literal::String::Symbol, :fg => :pink_merengue, :bold => true
62
62
  style Literal::String, :fg => :dune, :bold => true
63
- style Literal::String::Affix, :fg => :sandy, :bold => true
63
+ style Literal::String::Affix,
64
+ Literal::String::Delimiter, :fg => :sandy, :bold => true
64
65
  style Literal::String::Escape,
65
66
  Literal::String::Char,
66
67
  Literal::String::Interpol, :fg => :backlit, :bold => true
data/lib/rouge/token.rb CHANGED
@@ -61,7 +61,7 @@ module Rouge
61
61
 
62
62
  def each_token(&b)
63
63
  Token.cache.each do |(_, t)|
64
- b.call(t)
64
+ yield(t)
65
65
  end
66
66
  end
67
67
  end
data/lib/rouge/util.rb CHANGED
@@ -24,7 +24,7 @@ module Rouge
24
24
 
25
25
  def each(&b)
26
26
  keys.each do |k|
27
- b.call(k, self[k])
27
+ yield(k, self[k])
28
28
  end
29
29
  end
30
30
 
data/lib/rouge/version.rb CHANGED
@@ -3,6 +3,6 @@
3
3
 
4
4
  module Rouge
5
5
  def self.version
6
- "4.7.0"
6
+ "5.1.0"
7
7
  end
8
8
  end
data/lib/rouge.rb CHANGED
@@ -3,6 +3,9 @@
3
3
 
4
4
  # stdlib
5
5
  require 'pathname'
6
+ require 'set'
7
+ require 'strscan'
8
+ require 'uri'
6
9
 
7
10
  # The containing module for Rouge
8
11
  module Rouge
@@ -11,7 +14,12 @@ module Rouge
11
14
  LIB_DIR = __dir__.freeze
12
15
 
13
16
  class << self
17
+ # @deprecated This method of reloading is incompatible with modern Ruby's
18
+ # expectations around global caching of `require`. It is deprecated with no
19
+ # replacement - consider reloading the entire process instead with something
20
+ # like Guard. This method will be removed in rouge 5.0.
14
21
  def reload!
22
+ Kernel::warn "Rouge.reload! is deprecated, with no replacement, and will be removed in 5.0. Use a reloading system like Guard instead."
15
23
  Object::send :remove_const, :Rouge
16
24
  Kernel::load __FILE__
17
25
  end
@@ -36,71 +44,74 @@ module Rouge
36
44
  formatter.format(lexer.lex(text), &b)
37
45
  end
38
46
 
39
- # Load a file relative to the `lib/rouge` path.
40
- #
41
- # @api private
42
- def load_file(path)
43
- Kernel::load File.join(LIB_DIR, "rouge/#{path}.rb")
44
- end
45
-
46
- # Load the lexers in the `lib/rouge/lexers` directory.
47
- #
48
- # @api private
49
- def load_lexers
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))
53
- end
47
+ def eager_load!
48
+ Rouge::Lexer.all.each(&:eager_load!)
54
49
  end
55
50
  end
56
51
  end
57
52
 
58
- Rouge.load_file 'version'
59
- Rouge.load_file 'util'
60
- Rouge.load_file 'text_analyzer'
61
- Rouge.load_file 'token'
53
+ require_relative 'rouge/version'
54
+ require_relative 'rouge/util'
55
+ require_relative 'rouge/text_analyzer'
56
+ require_relative 'rouge/token'
62
57
 
63
- Rouge.load_file 'lexer'
64
- Rouge.load_file 'regex_lexer'
65
- Rouge.load_file 'template_lexer'
58
+ require_relative 'rouge/lexer'
59
+ require_relative 'rouge/regex_lexer'
60
+ require_relative 'rouge/template_lexer'
66
61
 
67
- Rouge.load_lexers
62
+ # workaround for https://bugs.ruby-lang.org/issues/21870
63
+ # delete this entire begin/end block (or guard it against RUBY_VERSION)
64
+ # when that is fixed.
65
+ begin
66
+ old_verbose, $VERBOSE = $VERBOSE, false
67
+ require_relative 'rouge/lexers/xml'
68
+ require_relative 'rouge/lexers/css'
69
+ require_relative 'rouge/lexers/html'
70
+ require_relative 'rouge/lexers/julia'
71
+ ensure
72
+ $VERBOSE = old_verbose
73
+ end
74
+
75
+ Dir.glob('rouge/lexers/*.rb', base: __dir__).each do |file|
76
+ require_relative file
77
+ end
68
78
 
69
- Rouge.load_file 'guesser'
70
- Rouge.load_file 'guessers/util'
71
- Rouge.load_file 'guessers/glob_mapping'
72
- Rouge.load_file 'guessers/modeline'
73
- Rouge.load_file 'guessers/filename'
74
- Rouge.load_file 'guessers/mimetype'
75
- Rouge.load_file 'guessers/source'
76
- Rouge.load_file 'guessers/disambiguation'
79
+ require_relative 'rouge/guesser'
80
+ require_relative 'rouge/guessers/util'
81
+ require_relative 'rouge/guessers/glob_mapping'
82
+ require_relative 'rouge/guessers/modeline'
83
+ require_relative 'rouge/guessers/filename'
84
+ require_relative 'rouge/guessers/mimetype'
85
+ require_relative 'rouge/guessers/source'
86
+ require_relative 'rouge/guessers/disambiguation'
77
87
 
78
- Rouge.load_file 'formatter'
79
- Rouge.load_file 'formatters/html'
80
- Rouge.load_file 'formatters/html_table'
81
- Rouge.load_file 'formatters/html_pygments'
82
- Rouge.load_file 'formatters/html_legacy'
83
- Rouge.load_file 'formatters/html_linewise'
84
- Rouge.load_file 'formatters/html_line_highlighter'
85
- Rouge.load_file 'formatters/html_line_table'
86
- Rouge.load_file 'formatters/html_inline'
87
- Rouge.load_file 'formatters/terminal256'
88
- Rouge.load_file 'formatters/terminal_truecolor'
89
- Rouge.load_file 'formatters/tex'
90
- Rouge.load_file 'formatters/null'
88
+ require_relative 'rouge/formatter'
89
+ require_relative 'rouge/formatters/html'
90
+ require_relative 'rouge/formatters/html_table'
91
+ require_relative 'rouge/formatters/html_pygments'
92
+ require_relative 'rouge/formatters/html_legacy'
93
+ require_relative 'rouge/formatters/html_linewise'
94
+ require_relative 'rouge/formatters/html_line_highlighter'
95
+ require_relative 'rouge/formatters/html_line_table'
96
+ require_relative 'rouge/formatters/html_inline'
97
+ require_relative 'rouge/formatters/html_debug'
98
+ require_relative 'rouge/formatters/terminal256'
99
+ require_relative 'rouge/formatters/terminal_truecolor'
100
+ require_relative 'rouge/formatters/tex'
101
+ require_relative 'rouge/formatters/null'
91
102
 
92
- Rouge.load_file 'theme'
93
- Rouge.load_file 'tex_theme_renderer'
94
- Rouge.load_file 'themes/thankful_eyes'
95
- Rouge.load_file 'themes/colorful'
96
- Rouge.load_file 'themes/base16'
97
- Rouge.load_file 'themes/github'
98
- Rouge.load_file 'themes/igor_pro'
99
- Rouge.load_file 'themes/monokai'
100
- Rouge.load_file 'themes/molokai'
101
- Rouge.load_file 'themes/monokai_sublime'
102
- Rouge.load_file 'themes/gruvbox'
103
- Rouge.load_file 'themes/tulip'
104
- Rouge.load_file 'themes/pastie'
105
- Rouge.load_file 'themes/bw'
106
- Rouge.load_file 'themes/magritte'
103
+ require_relative 'rouge/theme'
104
+ require_relative 'rouge/tex_theme_renderer'
105
+ require_relative 'rouge/themes/thankful_eyes'
106
+ require_relative 'rouge/themes/colorful'
107
+ require_relative 'rouge/themes/base16'
108
+ require_relative 'rouge/themes/github'
109
+ require_relative 'rouge/themes/igor_pro'
110
+ require_relative 'rouge/themes/monokai'
111
+ require_relative 'rouge/themes/molokai'
112
+ require_relative 'rouge/themes/monokai_sublime'
113
+ require_relative 'rouge/themes/gruvbox'
114
+ require_relative 'rouge/themes/tulip'
115
+ require_relative 'rouge/themes/pastie'
116
+ require_relative 'rouge/themes/bw'
117
+ require_relative 'rouge/themes/magritte'