rouge 3.2.0 → 3.18.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 (316) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +17 -3
  3. data/bin/rougify +1 -0
  4. data/lib/rouge.rb +67 -43
  5. data/lib/rouge/cli.rb +84 -17
  6. data/lib/rouge/demos/ada +26 -0
  7. data/lib/rouge/demos/apex +9 -0
  8. data/lib/rouge/demos/armasm +12 -0
  9. data/lib/rouge/demos/batchfile +3 -0
  10. data/lib/rouge/demos/bbcbasic +6 -0
  11. data/lib/rouge/demos/bpf +7 -0
  12. data/lib/rouge/demos/brainfuck +5 -0
  13. data/lib/rouge/demos/clean +6 -0
  14. data/lib/rouge/demos/cmhg +8 -0
  15. data/lib/rouge/demos/csvs +8 -0
  16. data/lib/rouge/demos/cuda +11 -0
  17. data/lib/rouge/demos/cypher +5 -0
  18. data/lib/rouge/demos/cython +6 -0
  19. data/lib/rouge/demos/datastudio +21 -0
  20. data/lib/rouge/demos/ecl +18 -0
  21. data/lib/rouge/demos/eex +1 -0
  22. data/lib/rouge/demos/epp +4 -0
  23. data/lib/rouge/demos/escape +3 -0
  24. data/lib/rouge/demos/freefem +16 -0
  25. data/lib/rouge/demos/gdscript +18 -0
  26. data/lib/rouge/demos/ghc-cmm +23 -0
  27. data/lib/rouge/demos/ghc-core +26 -0
  28. data/lib/rouge/demos/haxe +5 -0
  29. data/lib/rouge/demos/hocon +8 -0
  30. data/lib/rouge/demos/hql +5 -0
  31. data/lib/rouge/demos/isbl +4 -0
  32. data/lib/rouge/demos/jsl +3 -0
  33. data/lib/rouge/demos/jsp +29 -0
  34. data/lib/rouge/demos/liquid +0 -1
  35. data/lib/rouge/demos/lustre +6 -0
  36. data/lib/rouge/demos/lutin +18 -0
  37. data/lib/rouge/demos/m68k +16 -0
  38. data/lib/rouge/demos/magik +6 -0
  39. data/lib/rouge/demos/mason +22 -0
  40. data/lib/rouge/demos/mathematica +8 -0
  41. data/lib/rouge/demos/minizinc +23 -0
  42. data/lib/rouge/demos/msgtrans +4 -0
  43. data/lib/rouge/demos/nasm +6 -6
  44. data/lib/rouge/demos/nesasm +11 -0
  45. data/lib/rouge/demos/objective_cpp +17 -0
  46. data/lib/rouge/demos/openedge +4 -0
  47. data/lib/rouge/demos/opentype_feature_file +6 -0
  48. data/lib/rouge/demos/plist +1 -132
  49. data/lib/rouge/demos/powershell +12 -48
  50. data/lib/rouge/demos/q +6 -0
  51. data/lib/rouge/demos/reasonml +12 -0
  52. data/lib/rouge/demos/rego +8 -0
  53. data/lib/rouge/demos/robot_framework +27 -0
  54. data/lib/rouge/demos/sas +13 -0
  55. data/lib/rouge/demos/slice +10 -0
  56. data/lib/rouge/demos/solidity +13 -0
  57. data/lib/rouge/demos/sparql +6 -0
  58. data/lib/rouge/demos/sqf +14 -0
  59. data/lib/rouge/demos/supercollider +11 -0
  60. data/lib/rouge/demos/terraform +0 -15
  61. data/lib/rouge/demos/ttcn3 +6 -0
  62. data/lib/rouge/demos/vcl +12 -0
  63. data/lib/rouge/demos/xojo +14 -0
  64. data/lib/rouge/demos/xpath +2 -0
  65. data/lib/rouge/demos/xquery +22 -0
  66. data/lib/rouge/demos/yang +17 -0
  67. data/lib/rouge/formatter.rb +39 -2
  68. data/lib/rouge/formatters/html.rb +21 -2
  69. data/lib/rouge/formatters/html_inline.rb +1 -0
  70. data/lib/rouge/formatters/html_legacy.rb +1 -0
  71. data/lib/rouge/formatters/html_line_table.rb +53 -0
  72. data/lib/rouge/formatters/html_linewise.rb +7 -11
  73. data/lib/rouge/formatters/html_pygments.rb +2 -0
  74. data/lib/rouge/formatters/html_table.rb +21 -31
  75. data/lib/rouge/formatters/null.rb +1 -0
  76. data/lib/rouge/formatters/terminal256.rb +23 -5
  77. data/lib/rouge/formatters/terminal_truecolor.rb +37 -0
  78. data/lib/rouge/formatters/tex.rb +92 -0
  79. data/lib/rouge/guesser.rb +2 -0
  80. data/lib/rouge/guessers/disambiguation.rb +35 -0
  81. data/lib/rouge/guessers/filename.rb +2 -0
  82. data/lib/rouge/guessers/glob_mapping.rb +3 -1
  83. data/lib/rouge/guessers/mimetype.rb +2 -0
  84. data/lib/rouge/guessers/modeline.rb +3 -1
  85. data/lib/rouge/guessers/source.rb +3 -1
  86. data/lib/rouge/guessers/util.rb +2 -0
  87. data/lib/rouge/lexer.rb +71 -15
  88. data/lib/rouge/lexers/abap.rb +13 -11
  89. data/lib/rouge/lexers/actionscript.rb +35 -34
  90. data/lib/rouge/lexers/ada.rb +162 -0
  91. data/lib/rouge/lexers/apache.rb +13 -15
  92. data/lib/rouge/lexers/apache/keywords.rb +15 -0
  93. data/lib/rouge/lexers/apex.rb +126 -0
  94. data/lib/rouge/lexers/apiblueprint.rb +2 -0
  95. data/lib/rouge/lexers/apple_script.rb +17 -14
  96. data/lib/rouge/lexers/armasm.rb +145 -0
  97. data/lib/rouge/lexers/awk.rb +26 -25
  98. data/lib/rouge/lexers/batchfile.rb +164 -0
  99. data/lib/rouge/lexers/bbcbasic.rb +112 -0
  100. data/lib/rouge/lexers/biml.rb +6 -4
  101. data/lib/rouge/lexers/bpf.rb +118 -0
  102. data/lib/rouge/lexers/brainfuck.rb +53 -0
  103. data/lib/rouge/lexers/bsl.rb +13 -12
  104. data/lib/rouge/lexers/c.rb +35 -57
  105. data/lib/rouge/lexers/ceylon.rb +7 -34
  106. data/lib/rouge/lexers/cfscript.rb +27 -26
  107. data/lib/rouge/lexers/clean.rb +156 -0
  108. data/lib/rouge/lexers/clojure.rb +15 -14
  109. data/lib/rouge/lexers/cmake.rb +16 -14
  110. data/lib/rouge/lexers/cmhg.rb +34 -0
  111. data/lib/rouge/lexers/coffeescript.rb +90 -49
  112. data/lib/rouge/lexers/common_lisp.rb +39 -38
  113. data/lib/rouge/lexers/conf.rb +7 -6
  114. data/lib/rouge/lexers/console.rb +92 -38
  115. data/lib/rouge/lexers/coq.rb +27 -23
  116. data/lib/rouge/lexers/cpp.rb +24 -13
  117. data/lib/rouge/lexers/crystal.rb +71 -70
  118. data/lib/rouge/lexers/csharp.rb +29 -29
  119. data/lib/rouge/lexers/css.rb +24 -23
  120. data/lib/rouge/lexers/csvs.rb +44 -0
  121. data/lib/rouge/lexers/cuda.rb +35 -0
  122. data/lib/rouge/lexers/cypher.rb +108 -0
  123. data/lib/rouge/lexers/cython.rb +151 -0
  124. data/lib/rouge/lexers/d.rb +64 -63
  125. data/lib/rouge/lexers/dart.rb +34 -33
  126. data/lib/rouge/lexers/datastudio.rb +138 -0
  127. data/lib/rouge/lexers/diff.rb +10 -4
  128. data/lib/rouge/lexers/digdag.rb +3 -1
  129. data/lib/rouge/lexers/docker.rb +12 -11
  130. data/lib/rouge/lexers/dot.rb +19 -18
  131. data/lib/rouge/lexers/ecl.rb +175 -0
  132. data/lib/rouge/lexers/eex.rb +52 -0
  133. data/lib/rouge/lexers/eiffel.rb +21 -20
  134. data/lib/rouge/lexers/elixir.rb +52 -36
  135. data/lib/rouge/lexers/elm.rb +30 -29
  136. data/lib/rouge/lexers/epp.rb +51 -0
  137. data/lib/rouge/lexers/erb.rb +5 -4
  138. data/lib/rouge/lexers/erlang.rb +1 -0
  139. data/lib/rouge/lexers/escape.rb +58 -0
  140. data/lib/rouge/lexers/factor.rb +41 -40
  141. data/lib/rouge/lexers/fortran.rb +34 -32
  142. data/lib/rouge/lexers/freefem.rb +240 -0
  143. data/lib/rouge/lexers/fsharp.rb +33 -31
  144. data/lib/rouge/lexers/gdscript.rb +171 -0
  145. data/lib/rouge/lexers/ghc_cmm.rb +340 -0
  146. data/lib/rouge/lexers/ghc_core.rb +151 -0
  147. data/lib/rouge/lexers/gherkin.rb +17 -14
  148. data/lib/rouge/lexers/gherkin/keywords.rb +2 -0
  149. data/lib/rouge/lexers/glsl.rb +2 -5
  150. data/lib/rouge/lexers/go.rb +3 -2
  151. data/lib/rouge/lexers/gradle.rb +1 -0
  152. data/lib/rouge/lexers/graphql.rb +78 -60
  153. data/lib/rouge/lexers/groovy.rb +24 -25
  154. data/lib/rouge/lexers/hack.rb +2 -1
  155. data/lib/rouge/lexers/haml.rb +26 -29
  156. data/lib/rouge/lexers/handlebars.rb +32 -20
  157. data/lib/rouge/lexers/haskell.rb +67 -65
  158. data/lib/rouge/lexers/haxe.rb +246 -0
  159. data/lib/rouge/lexers/hcl.rb +26 -25
  160. data/lib/rouge/lexers/hocon.rb +86 -0
  161. data/lib/rouge/lexers/hql.rb +139 -0
  162. data/lib/rouge/lexers/html.rb +33 -31
  163. data/lib/rouge/lexers/http.rb +10 -9
  164. data/lib/rouge/lexers/hylang.rb +15 -14
  165. data/lib/rouge/lexers/idlang.rb +34 -32
  166. data/lib/rouge/lexers/igorpro.rb +32 -31
  167. data/lib/rouge/lexers/ini.rb +13 -12
  168. data/lib/rouge/lexers/io.rb +10 -9
  169. data/lib/rouge/lexers/irb.rb +6 -5
  170. data/lib/rouge/lexers/isbl.rb +97 -0
  171. data/lib/rouge/lexers/isbl/builtins.rb +17 -0
  172. data/lib/rouge/lexers/java.rb +29 -25
  173. data/lib/rouge/lexers/javascript.rb +58 -61
  174. data/lib/rouge/lexers/jinja.rb +39 -22
  175. data/lib/rouge/lexers/jsl.rb +55 -0
  176. data/lib/rouge/lexers/json.rb +54 -11
  177. data/lib/rouge/lexers/json_doc.rb +8 -5
  178. data/lib/rouge/lexers/jsonnet.rb +19 -18
  179. data/lib/rouge/lexers/jsp.rb +120 -0
  180. data/lib/rouge/lexers/jsx.rb +18 -16
  181. data/lib/rouge/lexers/julia.rb +182 -58
  182. data/lib/rouge/lexers/kotlin.rb +78 -26
  183. data/lib/rouge/lexers/lasso.rb +54 -58
  184. data/lib/rouge/lexers/lasso/keywords.rb +14 -0
  185. data/lib/rouge/lexers/liquid.rb +116 -118
  186. data/lib/rouge/lexers/literate_coffeescript.rb +3 -2
  187. data/lib/rouge/lexers/literate_haskell.rb +6 -5
  188. data/lib/rouge/lexers/llvm.rb +66 -49
  189. data/lib/rouge/lexers/lua.rb +43 -4
  190. data/lib/rouge/lexers/lua/builtins.rb +2 -0
  191. data/lib/rouge/lexers/lustre.rb +79 -0
  192. data/lib/rouge/lexers/lutin.rb +33 -0
  193. data/lib/rouge/lexers/m68k.rb +143 -0
  194. data/lib/rouge/lexers/magik.rb +127 -0
  195. data/lib/rouge/lexers/make.rb +57 -34
  196. data/lib/rouge/lexers/markdown.rb +67 -39
  197. data/lib/rouge/lexers/mason.rb +110 -0
  198. data/lib/rouge/lexers/mathematica.rb +96 -0
  199. data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
  200. data/lib/rouge/lexers/matlab.rb +26 -17
  201. data/lib/rouge/lexers/matlab/builtins.rb +4 -4
  202. data/lib/rouge/lexers/minizinc.rb +87 -0
  203. data/lib/rouge/lexers/moonscript.rb +4 -3
  204. data/lib/rouge/lexers/mosel.rb +64 -63
  205. data/lib/rouge/lexers/msgtrans.rb +26 -0
  206. data/lib/rouge/lexers/mxml.rb +19 -18
  207. data/lib/rouge/lexers/nasm.rb +43 -169
  208. data/lib/rouge/lexers/nesasm.rb +78 -0
  209. data/lib/rouge/lexers/nginx.rb +15 -14
  210. data/lib/rouge/lexers/nim.rb +4 -2
  211. data/lib/rouge/lexers/nix.rb +44 -43
  212. data/lib/rouge/lexers/objective_c.rb +5 -178
  213. data/lib/rouge/lexers/objective_c/common.rb +184 -0
  214. data/lib/rouge/lexers/objective_cpp.rb +31 -0
  215. data/lib/rouge/lexers/ocaml.rb +29 -64
  216. data/lib/rouge/lexers/ocaml/common.rb +53 -0
  217. data/lib/rouge/lexers/openedge.rb +429 -0
  218. data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
  219. data/lib/rouge/lexers/pascal.rb +6 -5
  220. data/lib/rouge/lexers/perl.rb +102 -67
  221. data/lib/rouge/lexers/php.rb +91 -53
  222. data/lib/rouge/lexers/php/builtins.rb +183 -174
  223. data/lib/rouge/lexers/plain_text.rb +2 -1
  224. data/lib/rouge/lexers/plist.rb +16 -14
  225. data/lib/rouge/lexers/pony.rb +21 -20
  226. data/lib/rouge/lexers/powershell.rb +190 -638
  227. data/lib/rouge/lexers/praat.rb +76 -75
  228. data/lib/rouge/lexers/prolog.rb +27 -19
  229. data/lib/rouge/lexers/prometheus.rb +32 -30
  230. data/lib/rouge/lexers/properties.rb +13 -12
  231. data/lib/rouge/lexers/protobuf.rb +23 -22
  232. data/lib/rouge/lexers/puppet.rb +33 -32
  233. data/lib/rouge/lexers/python.rb +124 -99
  234. data/lib/rouge/lexers/q.rb +17 -14
  235. data/lib/rouge/lexers/qml.rb +13 -12
  236. data/lib/rouge/lexers/r.rb +13 -13
  237. data/lib/rouge/lexers/racket.rb +47 -22
  238. data/lib/rouge/lexers/reasonml.rb +65 -0
  239. data/lib/rouge/lexers/rego.rb +45 -0
  240. data/lib/rouge/lexers/robot_framework.rb +249 -0
  241. data/lib/rouge/lexers/ruby.rb +88 -71
  242. data/lib/rouge/lexers/rust.rb +45 -44
  243. data/lib/rouge/lexers/sas.rb +563 -0
  244. data/lib/rouge/lexers/sass.rb +9 -8
  245. data/lib/rouge/lexers/sass/common.rb +41 -40
  246. data/lib/rouge/lexers/scala.rb +67 -40
  247. data/lib/rouge/lexers/scheme.rb +19 -18
  248. data/lib/rouge/lexers/scss.rb +4 -3
  249. data/lib/rouge/lexers/sed.rb +31 -30
  250. data/lib/rouge/lexers/shell.rb +67 -55
  251. data/lib/rouge/lexers/sieve.rb +10 -9
  252. data/lib/rouge/lexers/slice.rb +32 -0
  253. data/lib/rouge/lexers/slim.rb +27 -26
  254. data/lib/rouge/lexers/smalltalk.rb +34 -33
  255. data/lib/rouge/lexers/smarty.rb +20 -19
  256. data/lib/rouge/lexers/sml.rb +68 -67
  257. data/lib/rouge/lexers/solidity.rb +185 -0
  258. data/lib/rouge/lexers/sparql.rb +129 -0
  259. data/lib/rouge/lexers/sqf.rb +109 -0
  260. data/lib/rouge/lexers/sqf/commands.rb +15 -0
  261. data/lib/rouge/lexers/sql.rb +47 -26
  262. data/lib/rouge/lexers/supercollider.rb +116 -0
  263. data/lib/rouge/lexers/swift.rb +49 -44
  264. data/lib/rouge/lexers/tap.rb +22 -20
  265. data/lib/rouge/lexers/tcl.rb +28 -27
  266. data/lib/rouge/lexers/terraform.rb +37 -13
  267. data/lib/rouge/lexers/tex.rb +20 -19
  268. data/lib/rouge/lexers/toml.rb +59 -20
  269. data/lib/rouge/lexers/tsx.rb +1 -0
  270. data/lib/rouge/lexers/ttcn3.rb +119 -0
  271. data/lib/rouge/lexers/tulip.rb +38 -36
  272. data/lib/rouge/lexers/turtle.rb +36 -38
  273. data/lib/rouge/lexers/twig.rb +1 -0
  274. data/lib/rouge/lexers/typescript.rb +12 -0
  275. data/lib/rouge/lexers/typescript/common.rb +1 -0
  276. data/lib/rouge/lexers/vala.rb +19 -18
  277. data/lib/rouge/lexers/varnish.rb +168 -0
  278. data/lib/rouge/lexers/vb.rb +28 -27
  279. data/lib/rouge/lexers/verilog.rb +27 -28
  280. data/lib/rouge/lexers/vhdl.rb +12 -11
  281. data/lib/rouge/lexers/viml.rb +15 -14
  282. data/lib/rouge/lexers/viml/keywords.rb +2 -0
  283. data/lib/rouge/lexers/vue.rb +15 -10
  284. data/lib/rouge/lexers/wollok.rb +27 -26
  285. data/lib/rouge/lexers/xml.rb +18 -21
  286. data/lib/rouge/lexers/xojo.rb +61 -0
  287. data/lib/rouge/lexers/xpath.rb +332 -0
  288. data/lib/rouge/lexers/xquery.rb +145 -0
  289. data/lib/rouge/lexers/yaml.rb +64 -61
  290. data/lib/rouge/lexers/yang.rb +147 -0
  291. data/lib/rouge/plugins/redcarpet.rb +9 -2
  292. data/lib/rouge/regex_lexer.rb +27 -25
  293. data/lib/rouge/template_lexer.rb +1 -0
  294. data/lib/rouge/tex_theme_renderer.rb +132 -0
  295. data/lib/rouge/text_analyzer.rb +1 -0
  296. data/lib/rouge/theme.rb +5 -0
  297. data/lib/rouge/themes/base16.rb +1 -0
  298. data/lib/rouge/themes/bw.rb +41 -0
  299. data/lib/rouge/themes/colorful.rb +1 -0
  300. data/lib/rouge/themes/github.rb +1 -0
  301. data/lib/rouge/themes/gruvbox.rb +1 -0
  302. data/lib/rouge/themes/igor_pro.rb +1 -0
  303. data/lib/rouge/themes/magritte.rb +78 -0
  304. data/lib/rouge/themes/molokai.rb +1 -0
  305. data/lib/rouge/themes/monokai.rb +1 -0
  306. data/lib/rouge/themes/monokai_sublime.rb +4 -1
  307. data/lib/rouge/themes/pastie.rb +2 -1
  308. data/lib/rouge/themes/thankful_eyes.rb +2 -1
  309. data/lib/rouge/themes/tulip.rb +2 -1
  310. data/lib/rouge/token.rb +31 -22
  311. data/lib/rouge/util.rb +3 -2
  312. data/lib/rouge/version.rb +2 -1
  313. data/rouge.gemspec +6 -3
  314. metadata +130 -8
  315. data/lib/rouge/lexers/apache/keywords.yml +0 -764
  316. data/lib/rouge/lexers/lasso/keywords.yml +0 -446
@@ -1,17 +1,53 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Lexers
6
+ # The {ConsoleLexer} class is intended to lex content that represents the
7
+ # text that would display in a console/terminal. As distinct from the
8
+ # {Shell} lexer, {ConsoleLexer} will try to parse out the prompt from each
9
+ # line before passing the remainder of the line to the language lexer for
10
+ # the shell (by default, the {Shell} lexer).
11
+ #
12
+ # The {ConsoleLexer} class accepts five options:
13
+ # 1. **lang**: the shell language to lex (default: `shell`);
14
+ # 2. **output**: the output language (default: `plaintext?token=Generic.Output`);
15
+ # 3. **prompt**: comma-separated list of strings that indicate the end of a
16
+ # prompt (default: `$,#,>,;`);
17
+ # 4. **comments**: whether to enable comments.
18
+ # 5. **error**: comma-separated list of strings that indicate the start of an
19
+ # error message
20
+ #
21
+ # The comments option, if enabled, will lex lines that begin with a `#` as a
22
+ # comment. Please note that this option will only work if the prompt is
23
+ # either not manually specified or, if manually specified, does not include
24
+ # the `#` character.
25
+ #
26
+ # Most Markdown lexers that recognise GitHub-Flavored Markdown syntax, will
27
+ # pass the language string to Rouge as written in the original document.
28
+ # This allows an end user to pass options to {ConsoleLexer} by passing them
29
+ # as CGI-style parameters as in the example below.
30
+ #
31
+ # @example
32
+ # <pre>Here's some regular text.
33
+ #
34
+ # ```console?comments=true
35
+ # # This is a comment
36
+ # $ cp foo bar
37
+ # ```
38
+ #
39
+ # Some more regular text.</pre>
5
40
  class ConsoleLexer < Lexer
6
41
  tag 'console'
7
42
  aliases 'terminal', 'shell_session', 'shell-session'
8
43
  filenames '*.cap'
9
- desc 'A generic lexer for shell sessions. Accepts ?lang and ?output lexer options, a ?prompt option, and ?comments to enable # comments.'
44
+ desc 'A generic lexer for shell sessions. Accepts ?lang and ?output lexer options, a ?prompt option, ?comments to enable # comments, and ?error to handle error messages.'
10
45
 
11
46
  option :lang, 'the shell language to lex (default: shell)'
12
47
  option :output, 'the output language (default: plaintext?token=Generic.Output)'
13
48
  option :prompt, 'comma-separated list of strings that indicate the end of a prompt. (default: $,#,>,;)'
14
49
  option :comments, 'enable hash-comments at the start of a line - otherwise interpreted as a prompt. (default: false, implied by ?prompt not containing `#`)'
50
+ option :error, 'comma-separated list of strings that indicate the start of an error message'
15
51
 
16
52
  def initialize(*)
17
53
  super
@@ -19,20 +55,7 @@ module Rouge
19
55
  @lang = lexer_option(:lang) { 'shell' }
20
56
  @output = lexer_option(:output) { PlainText.new(token: Generic::Output) }
21
57
  @comments = bool_option(:comments) { :guess }
22
- end
23
-
24
- def prompt_regex
25
- @prompt_regex ||= begin
26
- /^#{prompt_prefix_regex}(?:#{end_chars.map(&Regexp.method(:escape)).join('|')})/
27
- end
28
- end
29
-
30
- def end_chars
31
- @end_chars ||= if @prompt.any?
32
- @prompt.reject { |c| c.empty? }
33
- else
34
- %w($ # > ;)
35
- end
58
+ @error = list_option(:error) { nil }
36
59
  end
37
60
 
38
61
  # whether to allow comments. if manually specifying a prompt that isn't
@@ -46,11 +69,23 @@ module Rouge
46
69
  end
47
70
  end
48
71
 
49
- def prompt_prefix_regex
50
- if allow_comments?
51
- /[^<#]*?/m
72
+ def comment_regex
73
+ /\A\s*?#/
74
+ end
75
+
76
+ def end_chars
77
+ @end_chars ||= if @prompt.any?
78
+ @prompt.reject { |c| c.empty? }
79
+ elsif allow_comments?
80
+ %w($ > ;)
52
81
  else
53
- /.*?/m
82
+ %w($ # > ;)
83
+ end
84
+ end
85
+
86
+ def error_regex
87
+ @error_regex ||= if @error.any?
88
+ /^(?:#{@error.map(&Regexp.method(:escape)).join('|')})/
54
89
  end
55
90
  end
56
91
 
@@ -67,6 +102,10 @@ module Rouge
67
102
  end
68
103
  end
69
104
 
105
+ def line_regex
106
+ /(\\.|[^\\])*?(\n|$)/m
107
+ end
108
+
70
109
  def output_lexer
71
110
  @output_lexer ||= case @output
72
111
  when nil
@@ -80,25 +119,12 @@ module Rouge
80
119
  end
81
120
  end
82
121
 
83
- def line_regex
84
- /(\\.|[^\\])*?(\n|$)/m
85
- end
86
-
87
- def comment_regex
88
- /\A\s*?#/
89
- end
90
-
91
- def stream_tokens(input, &output)
92
- input = StringScanner.new(input)
93
- lang_lexer.reset!
94
- output_lexer.reset!
95
-
96
- process_line(input, &output) while !input.eos?
97
- end
98
-
99
122
  def process_line(input, &output)
100
123
  input.scan(line_regex)
101
124
 
125
+ # As a nicety, support the use of elisions in input text. A user can
126
+ # write a line with only `<...>` or one or more `.` characters and
127
+ # Rouge will treat it as a comment.
102
128
  if input[0] =~ /\A\s*(?:<[.]+>|[.]+)\s*\z/
103
129
  puts "console: matched snip #{input[0].inspect}" if @debug
104
130
  output_lexer.reset!
@@ -115,22 +141,50 @@ module Rouge
115
141
  # before we pass to the lang lexer so it can determine where
116
142
  # the "real" beginning of the line is
117
143
  $' =~ /\A\s*/
118
- yield Text, $& unless $&.empty?
144
+ yield Text::Whitespace, $& unless $&.empty?
119
145
 
120
- lang_lexer.lex($', continue: true, &output)
146
+ lang_lexer.continue_lex($', &output)
121
147
  elsif comment_regex =~ input[0].strip
122
148
  puts "console: matched comment #{input[0].inspect}" if @debug
123
149
  output_lexer.reset!
124
150
  lang_lexer.reset!
125
151
 
126
152
  yield Comment, input[0]
153
+ elsif error_regex =~ input[0]
154
+ puts "console: matched error #{input[0].inspect}" if @debug
155
+ output_lexer.reset!
156
+ lang_lexer.reset!
157
+
158
+ yield Generic::Error, input[0]
127
159
  else
128
160
  puts "console: matched output #{input[0].inspect}" if @debug
129
161
  lang_lexer.reset!
130
162
 
131
- output_lexer.lex(input[0], continue: true, &output)
163
+ output_lexer.continue_lex(input[0], &output)
132
164
  end
133
165
  end
166
+
167
+ def prompt_prefix_regex
168
+ if allow_comments?
169
+ /[^<#]*?/m
170
+ else
171
+ /.*?/m
172
+ end
173
+ end
174
+
175
+ def prompt_regex
176
+ @prompt_regex ||= begin
177
+ /^#{prompt_prefix_regex}(?:#{end_chars.map(&Regexp.method(:escape)).join('|')})/
178
+ end
179
+ end
180
+
181
+ def stream_tokens(input, &output)
182
+ input = StringScanner.new(input)
183
+ lang_lexer.reset!
184
+ output_lexer.reset!
185
+
186
+ process_line(input, &output) while !input.eos?
187
+ end
134
188
  end
135
189
  end
136
190
  end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Lexers
@@ -57,7 +58,7 @@ module Rouge
57
58
 
58
59
  def self.keyopts
59
60
  @keyopts ||= Set.new %w(
60
- := => -> /\\ \\/ _ ; :> :
61
+ := => -> /\\ \\/ _ ; :> : ⇒ → ↔ ⇔ ≔ ≡ ∀ ∃ ∧ ∨ ¬ ⊤ ⊥ ⊢ ⊨ ∈
61
62
  )
62
63
  end
63
64
 
@@ -89,8 +90,8 @@ module Rouge
89
90
  set_options = /(Set|Unset)(\s+)(Universe|Printing|Implicit|Strict)(\s+)(Polymorphism|All|Notations|Arguments|Universes|Implicit)(\s*)\./m
90
91
 
91
92
  state :root do
92
- rule /[(][*](?![)])/, Comment, :comment
93
- rule /\s+/m, Text::Whitespace
93
+ rule %r/[(][*](?![)])/, Comment, :comment
94
+ rule %r/\s+/m, Text::Whitespace
94
95
  rule module_type do |m|
95
96
  token Keyword , 'Module'
96
97
  token Text::Whitespace , m[1]
@@ -112,42 +113,45 @@ module Rouge
112
113
  @continue = false
113
114
  push :continue_id
114
115
  end
115
- rule /\/\\/, Operator
116
- rule /\\\//, Operator
117
- rule operator do |m|
116
+ rule %r(/\\), Operator
117
+ rule %r/\\\//, Operator
118
+
119
+ rule %r/-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float
120
+ rule %r/\d[\d_]*/, Num::Integer
121
+
122
+ rule %r/'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char
123
+ rule %r/'/, Keyword
124
+ rule %r/"/, Str::Double, :string
125
+ rule %r/[~?]#{id}/, Name::Variable
126
+
127
+ rule %r/./ do |m|
118
128
  match = m[0]
119
129
  if self.class.keyopts.include? match
120
130
  token Punctuation
121
- else
131
+ elsif match =~ operator
122
132
  token Operator
133
+ else
134
+ token Error
123
135
  end
124
136
  end
125
-
126
- rule /-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float
127
- rule /\d[\d_]*/, Num::Integer
128
-
129
- rule /'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char
130
- rule /'/, Keyword
131
- rule /"/, Str::Double, :string
132
- rule /[~?]#{id}/, Name::Variable
133
137
  end
134
138
 
135
139
  state :comment do
136
- rule /[^(*)]+/, Comment
140
+ rule %r/[^(*)]+/, Comment
137
141
  rule(/[(][*]/) { token Comment; push }
138
- rule /[*][)]/, Comment, :pop!
139
- rule /[(*)]/, Comment
142
+ rule %r/[*][)]/, Comment, :pop!
143
+ rule %r/[(*)]/, Comment
140
144
  end
141
145
 
142
146
  state :string do
143
- rule /[^\\"]+/, Str::Double
147
+ rule %r/(?:\\")+|[^"]/, Str::Double
144
148
  mixin :escape_sequence
145
- rule /\\\n/, Str::Double
146
- rule /"/, Str::Double, :pop!
149
+ rule %r/\\\n/, Str::Double
150
+ rule %r/"/, Str::Double, :pop!
147
151
  end
148
152
 
149
153
  state :escape_sequence do
150
- rule /\\[\\"'ntbr]/, Str::Escape
154
+ rule %r/\\[\\"'ntbr]/, Str::Escape
151
155
  end
152
156
 
153
157
  state :continue_id do
@@ -170,7 +174,7 @@ module Rouge
170
174
  @continue = false
171
175
  pop!
172
176
  end
173
- rule // do
177
+ rule %r// do
174
178
  if @continue
175
179
  token Name::Constant , @name
176
180
  else
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Lexers
@@ -16,15 +17,15 @@ module Rouge
16
17
  '*.cc', '*.hh',
17
18
  '*.cxx', '*.hxx',
18
19
  '*.pde', '*.ino',
19
- '*.tpp'
20
+ '*.tpp', '*.h'
20
21
  mimetypes 'text/x-c++hdr', 'text/x-c++src'
21
22
 
22
23
  def self.keywords
23
24
  @keywords ||= super + Set.new(%w(
24
- asm auto catch const_cast delete dynamic_cast explicit export
25
- friend mutable namespace new operator private protected public
26
- reinterpret_cast restrict size_of static_cast template this throw
27
- throws typeid typename using virtual final override
25
+ asm auto catch const_cast delete dynamic_cast explicit export friend
26
+ mutable namespace new operator private protected public
27
+ reinterpret_cast restrict size_of static_cast this throw throws
28
+ typeid typename using virtual final override
28
29
 
29
30
  alignas alignof constexpr decltype noexcept static_assert
30
31
  thread_local try
@@ -48,7 +49,7 @@ module Rouge
48
49
 
49
50
  prepend :root do
50
51
  # Offload C++ extensions, http://offload.codeplay.com/
51
- rule /(?:__offload|__blockingoffload|__outer)\b/, Keyword::Pseudo
52
+ rule %r/(?:__offload|__blockingoffload|__outer)\b/, Keyword::Pseudo
52
53
  end
53
54
 
54
55
  # digits with optional inner quotes
@@ -56,23 +57,33 @@ module Rouge
56
57
  dq = /\d('?\d)*/
57
58
 
58
59
  prepend :statements do
59
- rule /class\b/, Keyword, :classname
60
+ rule %r/(class|struct)\b/, Keyword, :classname
61
+ rule %r/template\b/, Keyword, :template
62
+ rule %r/\d+(\.\d+)?(?:h|(?:min)|s|(?:ms)|(?:us)|(?:ns))/, Num::Other
60
63
  rule %r((#{dq}[.]#{dq}?|[.]#{dq})(e[+-]?#{dq}[lu]*)?)i, Num::Float
61
64
  rule %r(#{dq}e[+-]?#{dq}[lu]*)i, Num::Float
62
- rule /0x\h('?\h)*[lu]*/i, Num::Hex
63
- rule /0[0-7]('?[0-7])*[lu]*/i, Num::Oct
64
- rule /#{dq}[lu]*/i, Num::Integer
65
- rule /\bnullptr\b/, Name::Builtin
66
- rule /(?:u8|u|U|L)?R"([a-zA-Z0-9_{}\[\]#<>%:;.?*\+\-\/\^&|~!=,"']{,16})\(.*?\)\1"/m, Str
65
+ rule %r/0x\h('?\h)*[lu]*/i, Num::Hex
66
+ rule %r/0b[01]+(?:_[01]+)*/, Num::Bin
67
+ rule %r/0[0-7]('?[0-7])*[lu]*/i, Num::Oct
68
+ rule %r/#{dq}[lu]*/i, Num::Integer
69
+ rule %r/\bnullptr\b/, Name::Builtin
70
+ rule %r/(?:u8|u|U|L)?R"([a-zA-Z0-9_{}\[\]#<>%:;.?*\+\-\/\^&|~!=,"']{,16})\(.*?\)\1"/m, Str
67
71
  end
68
72
 
69
73
  state :classname do
70
74
  rule id, Name::Class, :pop!
71
75
 
72
76
  # template specification
73
- rule /\s*(?=>)/m, Text, :pop!
77
+ rule %r/\s*(?=>)/m, Text, :pop!
78
+ rule %r/[.]{3}/, Operator
74
79
  mixin :whitespace
75
80
  end
81
+
82
+ state :template do
83
+ rule %r/>/, Punctuation, :pop!
84
+ rule %r/typename\b/, Keyword, :classname
85
+ mixin :root
86
+ end
76
87
  end
77
88
  end
78
89
  end
@@ -1,4 +1,5 @@
1
1
  # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Rouge
4
5
  module Lexers
@@ -27,15 +28,15 @@ module Rouge
27
28
  rule %r(:(?:\*\*|[-+]@|[/\%&\|^`~]|\[\]=?|<<|>>|<=?>|<=?|===?)),
28
29
  Str::Symbol
29
30
 
30
- rule /:'(\\\\|\\'|[^'])*'/, Str::Symbol
31
- rule /:"/, Str::Symbol, :simple_sym
31
+ rule %r/:'(\\\\|\\'|[^'])*'/, Str::Symbol
32
+ rule %r/:"/, Str::Symbol, :simple_sym
32
33
  end
33
34
 
34
35
  state :sigil_strings do
35
36
  # %-sigiled strings
36
37
  # %(abc), %[abc], %<abc>, %.abc., %r.abc., etc
37
38
  delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' }
38
- rule /%([rqswQWxiI])?([^\w\s])/ do |m|
39
+ rule %r/%([rqswQWxiI])?([^\w\s])/ do |m|
39
40
  open = Regexp.escape(m[2])
40
41
  close = Regexp.escape(delimiter_map[m[2]] || m[2])
41
42
  interp = /[rQWxI]/ === m[1]
@@ -53,38 +54,38 @@ module Rouge
53
54
  token toktype
54
55
 
55
56
  push do
56
- rule /\\[##{open}#{close}\\]/, Str::Escape
57
+ rule %r/\\[##{open}#{close}\\]/, Str::Escape
57
58
  # nesting rules only with asymmetric delimiters
58
59
  if open != close
59
- rule /#{open}/ do
60
+ rule %r/#{open}/ do
60
61
  token toktype
61
62
  push
62
63
  end
63
64
  end
64
- rule /#{close}/, toktype, :pop!
65
+ rule %r/#{close}/, toktype, :pop!
65
66
 
66
67
  if interp
67
68
  mixin :string_intp_escaped
68
- rule /#/, toktype
69
+ rule %r/#/, toktype
69
70
  else
70
- rule /[\\#]/, toktype
71
+ rule %r/[\\#]/, toktype
71
72
  end
72
73
 
73
- rule /[^##{open}#{close}\\]+/m, toktype
74
+ rule %r/[^##{open}#{close}\\]+/m, toktype
74
75
  end
75
76
  end
76
77
  end
77
78
 
78
79
  state :strings do
79
80
  mixin :symbols
80
- rule /\b[a-z_]\w*?[?!]?:\s+/, Str::Symbol, :expr_start
81
- rule /'(\\\\|\\'|[^'])*'/, Str::Single
82
- rule /"/, Str::Double, :simple_string
83
- rule /(?<!\.)`/, Str::Backtick, :simple_backtick
81
+ rule %r/\b[a-z_]\w*?[?!]?:\s+/, Str::Symbol, :expr_start
82
+ rule %r/'(\\\\|\\'|[^'])*'/, Str::Single
83
+ rule %r/"/, Str::Double, :simple_string
84
+ rule %r/(?<!\.)`/, Str::Backtick, :simple_backtick
84
85
  end
85
86
 
86
87
  state :regex_flags do
87
- rule /[mixounse]*/, Str::Regex, :pop!
88
+ rule %r/[mixounse]*/, Str::Regex, :pop!
88
89
  end
89
90
 
90
91
  # double-quoted string and symbol
@@ -93,9 +94,9 @@ module Rouge
93
94
  [:backtick, Str::Backtick, '`']].each do |name, tok, fin|
94
95
  state :"simple_#{name}" do
95
96
  mixin :string_intp_escaped
96
- rule /[^\\#{fin}#]+/m, tok
97
- rule /[\\#]/, tok
98
- rule /#{fin}/, tok, :pop!
97
+ rule %r/[^\\#{fin}#]+/m, tok
98
+ rule %r/[\\#]/, tok
99
+ rule %r/#{fin}/, tok, :pop!
99
100
  end
100
101
  end
101
102
 
@@ -139,40 +140,40 @@ module Rouge
139
140
 
140
141
  state :whitespace do
141
142
  mixin :inline_whitespace
142
- rule /\n\s*/m, Text, :expr_start
143
- rule /#.*$/, Comment::Single
143
+ rule %r/\n\s*/m, Text, :expr_start
144
+ rule %r/#.*$/, Comment::Single
144
145
 
145
146
  rule %r(=begin\b.*?\n=end\b)m, Comment::Multiline
146
147
  end
147
148
 
148
149
  state :inline_whitespace do
149
- rule /[ \t\r]+/, Text
150
+ rule %r/[ \t\r]+/, Text
150
151
  end
151
152
 
152
153
  state :root do
153
154
  mixin :whitespace
154
- rule /__END__/, Comment::Preproc, :end_part
155
+ rule %r/__END__/, Comment::Preproc, :end_part
155
156
 
156
- rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
157
- rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
158
- rule /0b[01]+(?:_[01]+)*/, Num::Bin
159
- rule /\d+\.\d+(e[\+\-]?\d+)?/, Num::Float
160
- rule /[\d]+(?:_\d+)*/, Num::Integer
157
+ rule %r/0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
158
+ rule %r/0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
159
+ rule %r/0b[01]+(?:_[01]+)*/, Num::Bin
160
+ rule %r/\d+\.\d+(e[\+\-]?\d+)?/, Num::Float
161
+ rule %r/[\d]+(?:_\d+)*/, Num::Integer
161
162
 
162
- rule /@\[([^\]]+)\]/, Name::Decorator
163
+ rule %r/@\[([^\]]+)\]/, Name::Decorator
163
164
 
164
165
  # names
165
- rule /@@[a-z_]\w*/i, Name::Variable::Class
166
- rule /@[a-z_]\w*/i, Name::Variable::Instance
167
- rule /\$\w+/, Name::Variable::Global
166
+ rule %r/@@[a-z_]\w*/i, Name::Variable::Class
167
+ rule %r/@[a-z_]\w*/i, Name::Variable::Instance
168
+ rule %r/\$\w+/, Name::Variable::Global
168
169
  rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global
169
- rule /\$-[0adFiIlpvw]/, Name::Variable::Global
170
- rule /::/, Operator
170
+ rule %r/\$-[0adFiIlpvw]/, Name::Variable::Global
171
+ rule %r/::/, Operator
171
172
 
172
173
  mixin :strings
173
174
 
174
- rule /(?:#{keywords.join('|')})\b/, Keyword, :expr_start
175
- rule /(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
175
+ rule %r/(?:#{keywords.join('|')})\b/, Keyword, :expr_start
176
+ rule %r/(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
176
177
 
177
178
  rule %r(
178
179
  (module)
@@ -182,52 +183,52 @@ module Rouge
182
183
  groups Keyword, Text, Name::Namespace
183
184
  end
184
185
 
185
- rule /(def\b)(\s*)/ do
186
+ rule %r/(def\b)(\s*)/ do
186
187
  groups Keyword, Text
187
188
  push :funcname
188
189
  end
189
190
 
190
- rule /(class\b)(\s*)/ do
191
+ rule %r/(class\b)(\s*)/ do
191
192
  groups Keyword, Text
192
193
  push :classname
193
194
  end
194
195
 
195
- rule /(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start
196
- rule /(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start
197
- rule /(?<!\.)(?:#{builtins_g.join('|')})\b/,
196
+ rule %r/(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start
197
+ rule %r/(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start
198
+ rule %r/(?<!\.)(?:#{builtins_g.join('|')})\b/,
198
199
  Name::Builtin, :method_call
199
200
 
200
201
  mixin :has_heredocs
201
202
 
202
203
  # `..` and `...` for ranges must have higher priority than `.`
203
204
  # Otherwise, they will be parsed as :method_call
204
- rule /\.{2,3}/, Operator, :expr_start
205
+ rule %r/\.{2,3}/, Operator, :expr_start
205
206
 
206
- rule /[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call
207
- rule /(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do
207
+ rule %r/[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call
208
+ rule %r/(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do
208
209
  groups Punctuation, Text, Name::Function
209
210
  push :method_call
210
211
  end
211
212
 
212
- rule /[a-zA-Z_]\w*[?!]/, Name, :expr_start
213
- rule /[a-zA-Z_]\w*/, Name, :method_call
214
- rule /\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\./,
213
+ rule %r/[a-zA-Z_]\w*[?!]/, Name, :expr_start
214
+ rule %r/[a-zA-Z_]\w*/, Name, :method_call
215
+ rule %r/\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\./,
215
216
  Operator, :expr_start
216
- rule /[-+\/*%=<>&!^|~]=?/, Operator, :expr_start
217
+ rule %r/[-+\/*%=<>&!^|~]=?/, Operator, :expr_start
217
218
  rule(/[?]/) { token Punctuation; push :ternary; push :expr_start }
218
219
  rule %r<[\[({,:\\;/]>, Punctuation, :expr_start
219
220
  rule %r<[\])}]>, Punctuation
220
221
  end
221
222
 
222
223
  state :has_heredocs do
223
- rule /(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m|
224
+ rule %r/(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m|
224
225
  token Operator, m[1]
225
226
  token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
226
227
  @heredoc_queue << [['<<-', '<<~'].include?(m[1]), m[3]]
227
228
  push :heredoc_queue unless state? :heredoc_queue
228
229
  end
229
230
 
230
- rule /(<<[-~]?)(["'])(\2)/ do |m|
231
+ rule %r/(<<[-~]?)(["'])(\2)/ do |m|
231
232
  token Operator, m[1]
232
233
  token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
233
234
  @heredoc_queue << [['<<-', '<<~'].include?(m[1]), '']
@@ -236,7 +237,7 @@ module Rouge
236
237
  end
237
238
 
238
239
  state :heredoc_queue do
239
- rule /(?=\n)/ do
240
+ rule %r/(?=\n)/ do
240
241
  goto :resolve_heredocs
241
242
  end
242
243
 
@@ -246,13 +247,13 @@ module Rouge
246
247
  state :resolve_heredocs do
247
248
  mixin :string_intp_escaped
248
249
 
249
- rule /\n/, Str::Heredoc, :test_heredoc
250
- rule /[#\\\n]/, Str::Heredoc
251
- rule /[^#\\\n]+/, Str::Heredoc
250
+ rule %r/\n/, Str::Heredoc, :test_heredoc
251
+ rule %r/[#\\\n]/, Str::Heredoc
252
+ rule %r/[^#\\\n]+/, Str::Heredoc
252
253
  end
253
254
 
254
255
  state :test_heredoc do
255
- rule /[^#\\\n]*$/ do |m|
256
+ rule %r/[^#\\\n]*$/ do |m|
256
257
  tolerant, heredoc_name = @heredoc_queue.first
257
258
  check = tolerant ? m[0].strip : m[0].rstrip
258
259
 
@@ -274,12 +275,12 @@ module Rouge
274
275
  end
275
276
 
276
277
  state :funcname do
277
- rule /\s+/, Text
278
- rule /\(/, Punctuation, :defexpr
278
+ rule %r/\s+/, Text
279
+ rule %r/\(/, Punctuation, :defexpr
279
280
  rule %r(
280
- (?:([a-zA-Z_][\w_]*)(\.))?
281
+ (?:([a-zA-Z_]\w*)(\.))?
281
282
  (
282
- [a-zA-Z_][\w_]*[!?]? |
283
+ [a-zA-Z_]\w*[!?]? |
283
284
  \*\*? | [-+]@? | [/%&\|^`~] | \[\]=? |
284
285
  <<? | >>? | <=>? | >= | ===?
285
286
  )
@@ -293,20 +294,20 @@ module Rouge
293
294
  end
294
295
 
295
296
  state :classname do
296
- rule /\s+/, Text
297
- rule /\(/ do
297
+ rule %r/\s+/, Text
298
+ rule %r/\(/ do
298
299
  token Punctuation
299
300
  push :defexpr
300
301
  push :expr_start
301
302
  end
302
303
 
303
304
  # class << expr
304
- rule /<</ do
305
+ rule %r/<</ do
305
306
  token Operator
306
307
  goto :expr_start
307
308
  end
308
309
 
309
- rule /[A-Z_]\w*/, Name::Class, :pop!
310
+ rule %r/[A-Z_]\w*/, Name::Class, :pop!
310
311
 
311
312
  rule(//) { pop! }
312
313
  end
@@ -318,11 +319,11 @@ module Rouge
318
319
  end
319
320
 
320
321
  state :defexpr do
321
- rule /(\))(\.|::)?/ do
322
+ rule %r/(\))(\.|::)?/ do
322
323
  groups Punctuation, Operator
323
324
  pop!
324
325
  end
325
- rule /\(/ do
326
+ rule %r/\(/ do
326
327
  token Punctuation
327
328
  push :defexpr
328
329
  push :expr_start
@@ -332,20 +333,20 @@ module Rouge
332
333
  end
333
334
 
334
335
  state :in_interp do
335
- rule /}/, Str::Interpol, :pop!
336
+ rule %r/}/, Str::Interpol, :pop!
336
337
  mixin :root
337
338
  end
338
339
 
339
340
  state :string_intp do
340
- rule /[#][{]/, Str::Interpol, :in_interp
341
- rule /#(@@?|\$)[a-z_]\w*/i, Str::Interpol
341
+ rule %r/[#][{]/, Str::Interpol, :in_interp
342
+ rule %r/#(@@?|\$)[a-z_]\w*/i, Str::Interpol
342
343
  end
343
344
 
344
345
  state :string_intp_escaped do
345
346
  mixin :string_intp
346
- rule /\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/,
347
+ rule %r/\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/,
347
348
  Str::Escape
348
- rule /\\./, Str::Escape
349
+ rule %r/\\./, Str::Escape
349
350
  end
350
351
 
351
352
  state :method_call do
@@ -398,7 +399,7 @@ module Rouge
398
399
 
399
400
  # special case for using a single space. Ruby demands that
400
401
  # these be in a single line, otherwise it would make no sense.
401
- rule /(\s*)(%[rqswQWxiI]? \S* )/ do
402
+ rule %r/(\s*)(%[rqswQWxiI]? \S* )/ do
402
403
  groups Text, Str::Other
403
404
  pop!
404
405
  end
@@ -422,7 +423,7 @@ module Rouge
422
423
 
423
424
  state :end_part do
424
425
  # eat up the rest of the stream as Comment::Preproc
425
- rule /.+/m, Comment::Preproc, :pop!
426
+ rule %r/.+/m, Comment::Preproc, :pop!
426
427
  end
427
428
  end
428
429
  end