rouge-alda 3.3.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 (335) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +28 -0
  3. data/LICENSE +186 -0
  4. data/bin/rougify +18 -0
  5. data/lib/rouge/cli.rb +432 -0
  6. data/lib/rouge/demos/abap +6 -0
  7. data/lib/rouge/demos/actionscript +4 -0
  8. data/lib/rouge/demos/alda +10 -0
  9. data/lib/rouge/demos/apache +21 -0
  10. data/lib/rouge/demos/apiblueprint +33 -0
  11. data/lib/rouge/demos/applescript +2 -0
  12. data/lib/rouge/demos/awk +4 -0
  13. data/lib/rouge/demos/biml +38 -0
  14. data/lib/rouge/demos/bsl +7 -0
  15. data/lib/rouge/demos/c +8 -0
  16. data/lib/rouge/demos/ceylon +7 -0
  17. data/lib/rouge/demos/cfscript +18 -0
  18. data/lib/rouge/demos/clojure +5 -0
  19. data/lib/rouge/demos/cmake +7 -0
  20. data/lib/rouge/demos/coffeescript +5 -0
  21. data/lib/rouge/demos/common_lisp +1 -0
  22. data/lib/rouge/demos/conf +4 -0
  23. data/lib/rouge/demos/console +6 -0
  24. data/lib/rouge/demos/coq +13 -0
  25. data/lib/rouge/demos/cpp +8 -0
  26. data/lib/rouge/demos/crystal +45 -0
  27. data/lib/rouge/demos/csharp +5 -0
  28. data/lib/rouge/demos/css +4 -0
  29. data/lib/rouge/demos/d +16 -0
  30. data/lib/rouge/demos/dart +6 -0
  31. data/lib/rouge/demos/diff +7 -0
  32. data/lib/rouge/demos/digdag +19 -0
  33. data/lib/rouge/demos/docker +9 -0
  34. data/lib/rouge/demos/dot +5 -0
  35. data/lib/rouge/demos/eiffel +30 -0
  36. data/lib/rouge/demos/elixir +1 -0
  37. data/lib/rouge/demos/elm +4 -0
  38. data/lib/rouge/demos/erb +1 -0
  39. data/lib/rouge/demos/erlang +7 -0
  40. data/lib/rouge/demos/factor +5 -0
  41. data/lib/rouge/demos/fortran +22 -0
  42. data/lib/rouge/demos/fsharp +12 -0
  43. data/lib/rouge/demos/gherkin +17 -0
  44. data/lib/rouge/demos/glsl +14 -0
  45. data/lib/rouge/demos/go +7 -0
  46. data/lib/rouge/demos/gradle +10 -0
  47. data/lib/rouge/demos/graphql +17 -0
  48. data/lib/rouge/demos/groovy +9 -0
  49. data/lib/rouge/demos/hack +5 -0
  50. data/lib/rouge/demos/haml +5 -0
  51. data/lib/rouge/demos/handlebars +7 -0
  52. data/lib/rouge/demos/haskell +6 -0
  53. data/lib/rouge/demos/hcl +7 -0
  54. data/lib/rouge/demos/html +8 -0
  55. data/lib/rouge/demos/http +14 -0
  56. data/lib/rouge/demos/hylang +10 -0
  57. data/lib/rouge/demos/idlang +8 -0
  58. data/lib/rouge/demos/igorpro +9 -0
  59. data/lib/rouge/demos/ini +4 -0
  60. data/lib/rouge/demos/io +11 -0
  61. data/lib/rouge/demos/irb +4 -0
  62. data/lib/rouge/demos/irb_output +2 -0
  63. data/lib/rouge/demos/java +5 -0
  64. data/lib/rouge/demos/javascript +1 -0
  65. data/lib/rouge/demos/jinja +9 -0
  66. data/lib/rouge/demos/json +1 -0
  67. data/lib/rouge/demos/json-doc +1 -0
  68. data/lib/rouge/demos/jsonnet +28 -0
  69. data/lib/rouge/demos/jsp +29 -0
  70. data/lib/rouge/demos/jsx +17 -0
  71. data/lib/rouge/demos/julia +11 -0
  72. data/lib/rouge/demos/kotlin +3 -0
  73. data/lib/rouge/demos/lasso +12 -0
  74. data/lib/rouge/demos/liquid +11 -0
  75. data/lib/rouge/demos/literate_coffeescript +3 -0
  76. data/lib/rouge/demos/literate_haskell +7 -0
  77. data/lib/rouge/demos/llvm +20 -0
  78. data/lib/rouge/demos/lua +12 -0
  79. data/lib/rouge/demos/m68k +16 -0
  80. data/lib/rouge/demos/make +6 -0
  81. data/lib/rouge/demos/markdown +4 -0
  82. data/lib/rouge/demos/mathematica +8 -0
  83. data/lib/rouge/demos/matlab +6 -0
  84. data/lib/rouge/demos/moonscript +16 -0
  85. data/lib/rouge/demos/mosel +10 -0
  86. data/lib/rouge/demos/mxml +22 -0
  87. data/lib/rouge/demos/nasm +26 -0
  88. data/lib/rouge/demos/nginx +5 -0
  89. data/lib/rouge/demos/nim +27 -0
  90. data/lib/rouge/demos/nix +19 -0
  91. data/lib/rouge/demos/objective_c +18 -0
  92. data/lib/rouge/demos/ocaml +12 -0
  93. data/lib/rouge/demos/pascal +14 -0
  94. data/lib/rouge/demos/perl +5 -0
  95. data/lib/rouge/demos/php +3 -0
  96. data/lib/rouge/demos/plaintext +1 -0
  97. data/lib/rouge/demos/plist +142 -0
  98. data/lib/rouge/demos/pony +17 -0
  99. data/lib/rouge/demos/powershell +49 -0
  100. data/lib/rouge/demos/praat +26 -0
  101. data/lib/rouge/demos/prolog +9 -0
  102. data/lib/rouge/demos/prometheus +9 -0
  103. data/lib/rouge/demos/properties +7 -0
  104. data/lib/rouge/demos/protobuf +5 -0
  105. data/lib/rouge/demos/puppet +6 -0
  106. data/lib/rouge/demos/python +6 -0
  107. data/lib/rouge/demos/q +2 -0
  108. data/lib/rouge/demos/qml +9 -0
  109. data/lib/rouge/demos/r +8 -0
  110. data/lib/rouge/demos/racket +24 -0
  111. data/lib/rouge/demos/ruby +9 -0
  112. data/lib/rouge/demos/rust +12 -0
  113. data/lib/rouge/demos/sass +3 -0
  114. data/lib/rouge/demos/scala +3 -0
  115. data/lib/rouge/demos/scheme +4 -0
  116. data/lib/rouge/demos/scss +5 -0
  117. data/lib/rouge/demos/sed +4 -0
  118. data/lib/rouge/demos/shell +2 -0
  119. data/lib/rouge/demos/sieve +10 -0
  120. data/lib/rouge/demos/slim +17 -0
  121. data/lib/rouge/demos/smalltalk +6 -0
  122. data/lib/rouge/demos/smarty +12 -0
  123. data/lib/rouge/demos/sml +4 -0
  124. data/lib/rouge/demos/sqf +14 -0
  125. data/lib/rouge/demos/sql +1 -0
  126. data/lib/rouge/demos/swift +5 -0
  127. data/lib/rouge/demos/tap +5 -0
  128. data/lib/rouge/demos/tcl +1 -0
  129. data/lib/rouge/demos/terraform +31 -0
  130. data/lib/rouge/demos/tex +1 -0
  131. data/lib/rouge/demos/toml +9 -0
  132. data/lib/rouge/demos/tsx +17 -0
  133. data/lib/rouge/demos/tulip +13 -0
  134. data/lib/rouge/demos/turtle +26 -0
  135. data/lib/rouge/demos/twig +9 -0
  136. data/lib/rouge/demos/typescript +1 -0
  137. data/lib/rouge/demos/vala +8 -0
  138. data/lib/rouge/demos/vb +4 -0
  139. data/lib/rouge/demos/verilog +27 -0
  140. data/lib/rouge/demos/vhdl +23 -0
  141. data/lib/rouge/demos/viml +14 -0
  142. data/lib/rouge/demos/vue +11 -0
  143. data/lib/rouge/demos/wollok +11 -0
  144. data/lib/rouge/demos/xml +2 -0
  145. data/lib/rouge/demos/yaml +4 -0
  146. data/lib/rouge/formatter.rb +76 -0
  147. data/lib/rouge/formatters/html.rb +38 -0
  148. data/lib/rouge/formatters/html_inline.rb +31 -0
  149. data/lib/rouge/formatters/html_legacy.rb +45 -0
  150. data/lib/rouge/formatters/html_linewise.rb +28 -0
  151. data/lib/rouge/formatters/html_pygments.rb +18 -0
  152. data/lib/rouge/formatters/html_table.rb +62 -0
  153. data/lib/rouge/formatters/null.rb +20 -0
  154. data/lib/rouge/formatters/terminal256.rb +181 -0
  155. data/lib/rouge/guesser.rb +57 -0
  156. data/lib/rouge/guessers/disambiguation.rb +106 -0
  157. data/lib/rouge/guessers/filename.rb +27 -0
  158. data/lib/rouge/guessers/glob_mapping.rb +45 -0
  159. data/lib/rouge/guessers/mimetype.rb +16 -0
  160. data/lib/rouge/guessers/modeline.rb +46 -0
  161. data/lib/rouge/guessers/source.rb +31 -0
  162. data/lib/rouge/guessers/util.rb +34 -0
  163. data/lib/rouge/lexer.rb +462 -0
  164. data/lib/rouge/lexers/abap.rb +240 -0
  165. data/lib/rouge/lexers/actionscript.rb +196 -0
  166. data/lib/rouge/lexers/alda.rb +43 -0
  167. data/lib/rouge/lexers/apache/keywords.yml +764 -0
  168. data/lib/rouge/lexers/apache.rb +73 -0
  169. data/lib/rouge/lexers/apiblueprint.rb +49 -0
  170. data/lib/rouge/lexers/apple_script.rb +369 -0
  171. data/lib/rouge/lexers/awk.rb +162 -0
  172. data/lib/rouge/lexers/biml.rb +43 -0
  173. data/lib/rouge/lexers/bsl.rb +82 -0
  174. data/lib/rouge/lexers/c.rb +213 -0
  175. data/lib/rouge/lexers/ceylon.rb +124 -0
  176. data/lib/rouge/lexers/cfscript.rb +154 -0
  177. data/lib/rouge/lexers/clojure.rb +113 -0
  178. data/lib/rouge/lexers/cmake.rb +207 -0
  179. data/lib/rouge/lexers/coffeescript.rb +175 -0
  180. data/lib/rouge/lexers/common_lisp.rb +346 -0
  181. data/lib/rouge/lexers/conf.rb +25 -0
  182. data/lib/rouge/lexers/console.rb +137 -0
  183. data/lib/rouge/lexers/coq.rb +188 -0
  184. data/lib/rouge/lexers/cpp.rb +79 -0
  185. data/lib/rouge/lexers/crystal.rb +430 -0
  186. data/lib/rouge/lexers/csharp.rb +115 -0
  187. data/lib/rouge/lexers/css.rb +274 -0
  188. data/lib/rouge/lexers/d.rb +177 -0
  189. data/lib/rouge/lexers/dart.rb +105 -0
  190. data/lib/rouge/lexers/diff.rb +33 -0
  191. data/lib/rouge/lexers/digdag.rb +70 -0
  192. data/lib/rouge/lexers/docker.rb +51 -0
  193. data/lib/rouge/lexers/dot.rb +69 -0
  194. data/lib/rouge/lexers/eiffel.rb +66 -0
  195. data/lib/rouge/lexers/elixir.rb +134 -0
  196. data/lib/rouge/lexers/elm.rb +90 -0
  197. data/lib/rouge/lexers/erb.rb +53 -0
  198. data/lib/rouge/lexers/erlang.rb +115 -0
  199. data/lib/rouge/lexers/factor.rb +303 -0
  200. data/lib/rouge/lexers/fortran.rb +178 -0
  201. data/lib/rouge/lexers/fsharp.rb +119 -0
  202. data/lib/rouge/lexers/gherkin/keywords.rb +16 -0
  203. data/lib/rouge/lexers/gherkin.rb +138 -0
  204. data/lib/rouge/lexers/glsl.rb +136 -0
  205. data/lib/rouge/lexers/go.rb +175 -0
  206. data/lib/rouge/lexers/gradle.rb +38 -0
  207. data/lib/rouge/lexers/graphql.rb +254 -0
  208. data/lib/rouge/lexers/groovy.rb +113 -0
  209. data/lib/rouge/lexers/hack.rb +49 -0
  210. data/lib/rouge/lexers/haml.rb +230 -0
  211. data/lib/rouge/lexers/handlebars.rb +80 -0
  212. data/lib/rouge/lexers/haskell.rb +198 -0
  213. data/lib/rouge/lexers/hcl.rb +163 -0
  214. data/lib/rouge/lexers/html.rb +140 -0
  215. data/lib/rouge/lexers/http.rb +81 -0
  216. data/lib/rouge/lexers/hylang.rb +94 -0
  217. data/lib/rouge/lexers/idlang.rb +312 -0
  218. data/lib/rouge/lexers/igorpro.rb +664 -0
  219. data/lib/rouge/lexers/ini.rb +54 -0
  220. data/lib/rouge/lexers/io.rb +69 -0
  221. data/lib/rouge/lexers/irb.rb +67 -0
  222. data/lib/rouge/lexers/java.rb +88 -0
  223. data/lib/rouge/lexers/javascript.rb +283 -0
  224. data/lib/rouge/lexers/jinja.rb +138 -0
  225. data/lib/rouge/lexers/json.rb +30 -0
  226. data/lib/rouge/lexers/json_doc.rb +24 -0
  227. data/lib/rouge/lexers/jsonnet.rb +152 -0
  228. data/lib/rouge/lexers/jsp.rb +120 -0
  229. data/lib/rouge/lexers/jsx.rb +104 -0
  230. data/lib/rouge/lexers/julia.rb +167 -0
  231. data/lib/rouge/lexers/kotlin.rb +127 -0
  232. data/lib/rouge/lexers/lasso/keywords.yml +446 -0
  233. data/lib/rouge/lexers/lasso.rb +215 -0
  234. data/lib/rouge/lexers/liquid.rb +288 -0
  235. data/lib/rouge/lexers/literate_coffeescript.rb +34 -0
  236. data/lib/rouge/lexers/literate_haskell.rb +37 -0
  237. data/lib/rouge/lexers/llvm.rb +81 -0
  238. data/lib/rouge/lexers/lua/builtins.rb +24 -0
  239. data/lib/rouge/lexers/lua.rb +126 -0
  240. data/lib/rouge/lexers/m68k.rb +144 -0
  241. data/lib/rouge/lexers/make.rb +113 -0
  242. data/lib/rouge/lexers/markdown.rb +155 -0
  243. data/lib/rouge/lexers/mathematica/builtins.rb +13 -0
  244. data/lib/rouge/lexers/mathematica.rb +96 -0
  245. data/lib/rouge/lexers/matlab/builtins.rb +13 -0
  246. data/lib/rouge/lexers/matlab.rb +72 -0
  247. data/lib/rouge/lexers/moonscript.rb +115 -0
  248. data/lib/rouge/lexers/mosel.rb +232 -0
  249. data/lib/rouge/lexers/mxml.rb +69 -0
  250. data/lib/rouge/lexers/nasm.rb +199 -0
  251. data/lib/rouge/lexers/nginx.rb +72 -0
  252. data/lib/rouge/lexers/nim.rb +153 -0
  253. data/lib/rouge/lexers/nix.rb +211 -0
  254. data/lib/rouge/lexers/objective_c.rb +195 -0
  255. data/lib/rouge/lexers/ocaml.rb +101 -0
  256. data/lib/rouge/lexers/pascal.rb +67 -0
  257. data/lib/rouge/lexers/perl.rb +201 -0
  258. data/lib/rouge/lexers/php/builtins.rb +196 -0
  259. data/lib/rouge/lexers/php.rb +194 -0
  260. data/lib/rouge/lexers/plain_text.rb +27 -0
  261. data/lib/rouge/lexers/plist.rb +47 -0
  262. data/lib/rouge/lexers/pony.rb +94 -0
  263. data/lib/rouge/lexers/powershell.rb +679 -0
  264. data/lib/rouge/lexers/praat.rb +351 -0
  265. data/lib/rouge/lexers/prolog.rb +61 -0
  266. data/lib/rouge/lexers/prometheus.rb +123 -0
  267. data/lib/rouge/lexers/properties.rb +52 -0
  268. data/lib/rouge/lexers/protobuf.rb +71 -0
  269. data/lib/rouge/lexers/puppet.rb +129 -0
  270. data/lib/rouge/lexers/python.rb +247 -0
  271. data/lib/rouge/lexers/q.rb +125 -0
  272. data/lib/rouge/lexers/qml.rb +74 -0
  273. data/lib/rouge/lexers/r.rb +90 -0
  274. data/lib/rouge/lexers/racket.rb +545 -0
  275. data/lib/rouge/lexers/ruby.rb +439 -0
  276. data/lib/rouge/lexers/rust.rb +198 -0
  277. data/lib/rouge/lexers/sass/common.rb +181 -0
  278. data/lib/rouge/lexers/sass.rb +75 -0
  279. data/lib/rouge/lexers/scala.rb +143 -0
  280. data/lib/rouge/lexers/scheme.rb +113 -0
  281. data/lib/rouge/lexers/scss.rb +35 -0
  282. data/lib/rouge/lexers/sed.rb +173 -0
  283. data/lib/rouge/lexers/shell.rb +190 -0
  284. data/lib/rouge/lexers/sieve.rb +97 -0
  285. data/lib/rouge/lexers/slim.rb +229 -0
  286. data/lib/rouge/lexers/smalltalk.rb +117 -0
  287. data/lib/rouge/lexers/smarty.rb +81 -0
  288. data/lib/rouge/lexers/sml.rb +345 -0
  289. data/lib/rouge/lexers/sqf/commands.rb +15 -0
  290. data/lib/rouge/lexers/sqf.rb +109 -0
  291. data/lib/rouge/lexers/sql.rb +141 -0
  292. data/lib/rouge/lexers/swift.rb +182 -0
  293. data/lib/rouge/lexers/tap.rb +89 -0
  294. data/lib/rouge/lexers/tcl.rb +193 -0
  295. data/lib/rouge/lexers/terraform.rb +105 -0
  296. data/lib/rouge/lexers/tex.rb +70 -0
  297. data/lib/rouge/lexers/toml.rb +68 -0
  298. data/lib/rouge/lexers/tsx.rb +20 -0
  299. data/lib/rouge/lexers/tulip.rb +108 -0
  300. data/lib/rouge/lexers/turtle.rb +64 -0
  301. data/lib/rouge/lexers/twig.rb +40 -0
  302. data/lib/rouge/lexers/typescript/common.rb +34 -0
  303. data/lib/rouge/lexers/typescript.rb +23 -0
  304. data/lib/rouge/lexers/vala.rb +78 -0
  305. data/lib/rouge/lexers/vb.rb +165 -0
  306. data/lib/rouge/lexers/verilog.rb +165 -0
  307. data/lib/rouge/lexers/vhdl.rb +98 -0
  308. data/lib/rouge/lexers/viml/keywords.rb +14 -0
  309. data/lib/rouge/lexers/viml.rb +102 -0
  310. data/lib/rouge/lexers/vue.rb +124 -0
  311. data/lib/rouge/lexers/wollok.rb +104 -0
  312. data/lib/rouge/lexers/xml.rb +58 -0
  313. data/lib/rouge/lexers/yaml.rb +374 -0
  314. data/lib/rouge/plugins/redcarpet.rb +31 -0
  315. data/lib/rouge/regex_lexer.rb +442 -0
  316. data/lib/rouge/template_lexer.rb +21 -0
  317. data/lib/rouge/text_analyzer.rb +50 -0
  318. data/lib/rouge/theme.rb +214 -0
  319. data/lib/rouge/themes/base16.rb +131 -0
  320. data/lib/rouge/themes/colorful.rb +68 -0
  321. data/lib/rouge/themes/github.rb +72 -0
  322. data/lib/rouge/themes/gruvbox.rb +168 -0
  323. data/lib/rouge/themes/igor_pro.rb +21 -0
  324. data/lib/rouge/themes/molokai.rb +83 -0
  325. data/lib/rouge/themes/monokai.rb +93 -0
  326. data/lib/rouge/themes/monokai_sublime.rb +92 -0
  327. data/lib/rouge/themes/pastie.rb +70 -0
  328. data/lib/rouge/themes/thankful_eyes.rb +75 -0
  329. data/lib/rouge/themes/tulip.rb +70 -0
  330. data/lib/rouge/token.rb +183 -0
  331. data/lib/rouge/util.rb +102 -0
  332. data/lib/rouge/version.rb +8 -0
  333. data/lib/rouge.rb +84 -0
  334. data/rouge.gemspec +25 -0
  335. metadata +384 -0
@@ -0,0 +1,439 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Ruby < RegexLexer
7
+ title "Ruby"
8
+ desc "The Ruby programming language (ruby-lang.org)"
9
+ tag 'ruby'
10
+ aliases 'rb'
11
+ filenames '*.rb', '*.ruby', '*.rbw', '*.rake', '*.gemspec', '*.podspec',
12
+ 'Rakefile', 'Guardfile', 'Gemfile', 'Capfile', 'Podfile',
13
+ 'Vagrantfile', '*.ru', '*.prawn', 'Berksfile', '*.arb',
14
+ 'Dangerfile'
15
+
16
+ mimetypes 'text/x-ruby', 'application/x-ruby'
17
+
18
+ def self.detect?(text)
19
+ return true if text.shebang? 'ruby'
20
+ end
21
+
22
+ state :symbols do
23
+ # symbols
24
+ rule %r(
25
+ : # initial :
26
+ @{0,2} # optional ivar, for :@foo and :@@foo
27
+ [a-z_]\w*[!?]? # the symbol
28
+ )xi, Str::Symbol
29
+
30
+ # special symbols
31
+ rule %r(:(?:\*\*|[-+]@|[/\%&\|^`~]|\[\]=?|<<|>>|<=?>|<=?|===?)),
32
+ Str::Symbol
33
+
34
+ rule /:'(\\\\|\\'|[^'])*'/, Str::Symbol
35
+ rule /:"/, Str::Symbol, :simple_sym
36
+ end
37
+
38
+ state :sigil_strings do
39
+ # %-sigiled strings
40
+ # %(abc), %[abc], %<abc>, %.abc., %r.abc., etc
41
+ delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' }
42
+ rule /%([rqswQWxiI])?([^\w\s])/ do |m|
43
+ open = Regexp.escape(m[2])
44
+ close = Regexp.escape(delimiter_map[m[2]] || m[2])
45
+ interp = /[rQWxI]/ === m[1]
46
+ toktype = Str::Other
47
+
48
+ puts " open: #{open.inspect}" if @debug
49
+ puts " close: #{close.inspect}" if @debug
50
+
51
+ # regexes
52
+ if m[1] == 'r'
53
+ toktype = Str::Regex
54
+ push :regex_flags
55
+ end
56
+
57
+ token toktype
58
+
59
+ push do
60
+ rule /\\[##{open}#{close}\\]/, Str::Escape
61
+ # nesting rules only with asymmetric delimiters
62
+ if open != close
63
+ rule /#{open}/ do
64
+ token toktype
65
+ push
66
+ end
67
+ end
68
+ rule /#{close}/, toktype, :pop!
69
+
70
+ if interp
71
+ mixin :string_intp_escaped
72
+ rule /#/, toktype
73
+ else
74
+ rule /[\\#]/, toktype
75
+ end
76
+
77
+ rule /[^##{open}#{close}\\]+/m, toktype
78
+ end
79
+ end
80
+ end
81
+
82
+ state :strings do
83
+ mixin :symbols
84
+ rule /\b[a-z_]\w*?[?!]?:\s+/, Str::Symbol, :expr_start
85
+ rule /'(\\\\|\\'|[^'])*'/, Str::Single
86
+ rule /"/, Str::Double, :simple_string
87
+ rule /(?<!\.)`/, Str::Backtick, :simple_backtick
88
+ end
89
+
90
+ state :regex_flags do
91
+ rule /[mixounse]*/, Str::Regex, :pop!
92
+ end
93
+
94
+ # double-quoted string and symbol
95
+ [[:string, Str::Double, '"'],
96
+ [:sym, Str::Symbol, '"'],
97
+ [:backtick, Str::Backtick, '`']].each do |name, tok, fin|
98
+ state :"simple_#{name}" do
99
+ mixin :string_intp_escaped
100
+ rule /[^\\#{fin}#]+/m, tok
101
+ rule /[\\#]/, tok
102
+ rule /#{fin}/, tok, :pop!
103
+ end
104
+ end
105
+
106
+ keywords = %w(
107
+ BEGIN END alias begin break case defined\? do else elsif end
108
+ ensure for if in next redo rescue raise retry return super then
109
+ undef unless until when while yield
110
+ )
111
+
112
+ keywords_pseudo = %w(
113
+ loop include extend raise
114
+ alias_method attr catch throw private module_function
115
+ public protected true false nil __FILE__ __LINE__
116
+ )
117
+
118
+ builtins_g = %w(
119
+ attr_reader attr_writer attr_accessor
120
+
121
+ __id__ __send__ abort ancestors at_exit autoload binding callcc
122
+ caller catch chomp chop class_eval class_variables clone
123
+ const_defined\? const_get const_missing const_set constants
124
+ display dup eval exec exit extend fail fork format freeze
125
+ getc gets global_variables gsub hash id included_modules
126
+ inspect instance_eval instance_method instance_methods
127
+ instance_variable_get instance_variable_set instance_variables
128
+ lambda load local_variables loop method method_missing
129
+ methods module_eval name object_id open p print printf
130
+ private_class_method private_instance_methods private_methods proc
131
+ protected_instance_methods protected_methods public_class_method
132
+ public_instance_methods public_methods putc puts raise rand
133
+ readline readlines require require_relative scan select self send set_trace_func
134
+ singleton_methods sleep split sprintf srand sub syscall system
135
+ taint test throw to_a to_s trace_var trap untaint untrace_var warn
136
+ )
137
+
138
+ builtins_q = %w(
139
+ autoload block_given const_defined eql equal frozen
140
+ include instance_of is_a iterator kind_of method_defined
141
+ nil private_method_defined protected_method_defined
142
+ public_method_defined respond_to tainted
143
+ )
144
+
145
+ builtins_b = %w(chomp chop exit gsub sub)
146
+
147
+ start do
148
+ push :expr_start
149
+ @heredoc_queue = []
150
+ end
151
+
152
+ state :whitespace do
153
+ mixin :inline_whitespace
154
+ rule /\n\s*/m, Text, :expr_start
155
+ rule /#.*$/, Comment::Single
156
+
157
+ rule %r(=begin\b.*?\n=end\b)m, Comment::Multiline
158
+ end
159
+
160
+ state :inline_whitespace do
161
+ rule /[ \t\r]+/, Text
162
+ end
163
+
164
+ state :root do
165
+ mixin :whitespace
166
+ rule /__END__/, Comment::Preproc, :end_part
167
+
168
+ rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
169
+ rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
170
+ rule /0b[01]+(?:_[01]+)*/, Num::Bin
171
+ rule /\d+\.\d+(e[\+\-]?\d+)?/, Num::Float
172
+ rule /[\d]+(?:_\d+)*/, Num::Integer
173
+
174
+ # names
175
+ rule /@@[a-z_]\w*/i, Name::Variable::Class
176
+ rule /@[a-z_]\w*/i, Name::Variable::Instance
177
+ rule /\$\w+/, Name::Variable::Global
178
+ rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global
179
+ rule /\$-[0adFiIlpvw]/, Name::Variable::Global
180
+ rule /::/, Operator
181
+
182
+ mixin :strings
183
+
184
+ rule /(?:#{keywords.join('|')})\b/, Keyword, :expr_start
185
+ rule /(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
186
+
187
+ rule %r(
188
+ (module)
189
+ (\s+)
190
+ ([a-zA-Z_][a-zA-Z0-9_]*(::[a-zA-Z_][a-zA-Z0-9_]*)*)
191
+ )x do
192
+ groups Keyword, Text, Name::Namespace
193
+ end
194
+
195
+ rule /(def\b)(\s*)/ do
196
+ groups Keyword, Text
197
+ push :funcname
198
+ end
199
+
200
+ rule /(class\b)(\s*)/ do
201
+ groups Keyword, Text
202
+ push :classname
203
+ end
204
+
205
+ rule /(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start
206
+ rule /(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start
207
+ rule /(?<!\.)(?:#{builtins_g.join('|')})\b/,
208
+ Name::Builtin, :method_call
209
+
210
+ mixin :has_heredocs
211
+
212
+ # `..` and `...` for ranges must have higher priority than `.`
213
+ # Otherwise, they will be parsed as :method_call
214
+ rule /\.{2,3}/, Operator, :expr_start
215
+
216
+ rule /[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call
217
+ rule /(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do
218
+ groups Punctuation, Text, Name::Function
219
+ push :method_call
220
+ end
221
+
222
+ rule /[a-zA-Z_]\w*[?!]/, Name, :expr_start
223
+ rule /[a-zA-Z_]\w*/, Name, :method_call
224
+ rule /\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\./,
225
+ Operator, :expr_start
226
+ rule /[-+\/*%=<>&!^|~]=?/, Operator, :expr_start
227
+ rule(/[?]/) { token Punctuation; push :ternary; push :expr_start }
228
+ rule %r<[\[({,:\\;/]>, Punctuation, :expr_start
229
+ rule %r<[\])}]>, Punctuation
230
+ end
231
+
232
+ state :has_heredocs do
233
+ rule /(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m|
234
+ token Operator, m[1]
235
+ token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
236
+ @heredoc_queue << [['<<-', '<<~'].include?(m[1]), m[3]]
237
+ push :heredoc_queue unless state? :heredoc_queue
238
+ end
239
+
240
+ rule /(<<[-~]?)(["'])(\2)/ do |m|
241
+ token Operator, m[1]
242
+ token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
243
+ @heredoc_queue << [['<<-', '<<~'].include?(m[1]), '']
244
+ push :heredoc_queue unless state? :heredoc_queue
245
+ end
246
+ end
247
+
248
+ state :heredoc_queue do
249
+ rule /(?=\n)/ do
250
+ goto :resolve_heredocs
251
+ end
252
+
253
+ mixin :root
254
+ end
255
+
256
+ state :resolve_heredocs do
257
+ mixin :string_intp_escaped
258
+
259
+ rule /\n/, Str::Heredoc, :test_heredoc
260
+ rule /[#\\\n]/, Str::Heredoc
261
+ rule /[^#\\\n]+/, Str::Heredoc
262
+ end
263
+
264
+ state :test_heredoc do
265
+ rule /[^#\\\n]*$/ do |m|
266
+ tolerant, heredoc_name = @heredoc_queue.first
267
+ check = tolerant ? m[0].strip : m[0].rstrip
268
+
269
+ # check if we found the end of the heredoc
270
+ puts " end heredoc check #{check.inspect} = #{heredoc_name.inspect}" if @debug
271
+ if check == heredoc_name
272
+ @heredoc_queue.shift
273
+ # if there's no more, we're done looking.
274
+ pop! if @heredoc_queue.empty?
275
+ token Name::Constant
276
+ else
277
+ token Str::Heredoc
278
+ end
279
+
280
+ pop!
281
+ end
282
+
283
+ rule(//) { pop! }
284
+ end
285
+
286
+ state :funcname do
287
+ rule /\s+/, Text
288
+ rule /\(/, Punctuation, :defexpr
289
+ rule %r(
290
+ (?:([a-zA-Z_][\w_]*)(\.))?
291
+ (
292
+ [a-zA-Z_][\w_]*[!?]? |
293
+ \*\*? | [-+]@? | [/%&\|^`~] | \[\]=? |
294
+ <<? | >>? | <=>? | >= | ===?
295
+ )
296
+ )x do |m|
297
+ puts "matches: #{[m[0], m[1], m[2], m[3]].inspect}" if @debug
298
+ groups Name::Class, Operator, Name::Function
299
+ pop!
300
+ end
301
+
302
+ rule(//) { pop! }
303
+ end
304
+
305
+ state :classname do
306
+ rule /\s+/, Text
307
+ rule /\(/ do
308
+ token Punctuation
309
+ push :defexpr
310
+ push :expr_start
311
+ end
312
+
313
+ # class << expr
314
+ rule /<</ do
315
+ token Operator
316
+ goto :expr_start
317
+ end
318
+
319
+ rule /[A-Z_]\w*/, Name::Class, :pop!
320
+
321
+ rule(//) { pop! }
322
+ end
323
+
324
+ state :ternary do
325
+ rule(/:(?!:)/) { token Punctuation; goto :expr_start }
326
+
327
+ mixin :root
328
+ end
329
+
330
+ state :defexpr do
331
+ rule /(\))(\.|::)?/ do
332
+ groups Punctuation, Operator
333
+ pop!
334
+ end
335
+ rule /\(/ do
336
+ token Punctuation
337
+ push :defexpr
338
+ push :expr_start
339
+ end
340
+
341
+ mixin :root
342
+ end
343
+
344
+ state :in_interp do
345
+ rule /}/, Str::Interpol, :pop!
346
+ mixin :root
347
+ end
348
+
349
+ state :string_intp do
350
+ rule /[#][{]/, Str::Interpol, :in_interp
351
+ rule /#(@@?|\$)[a-z_]\w*/i, Str::Interpol
352
+ end
353
+
354
+ state :string_intp_escaped do
355
+ mixin :string_intp
356
+ rule /\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/,
357
+ Str::Escape
358
+ rule /\\./, Str::Escape
359
+ end
360
+
361
+ state :method_call do
362
+ rule %r(/) do
363
+ token Operator
364
+ goto :expr_start
365
+ end
366
+
367
+ rule(/(?=\n)/) { pop! }
368
+
369
+ rule(//) { goto :method_call_spaced }
370
+ end
371
+
372
+ state :method_call_spaced do
373
+ mixin :whitespace
374
+
375
+ rule %r([%/]=) do
376
+ token Operator
377
+ goto :expr_start
378
+ end
379
+
380
+ rule %r((/)(?=\S|\s*/)) do
381
+ token Str::Regex
382
+ goto :slash_regex
383
+ end
384
+
385
+ mixin :sigil_strings
386
+
387
+ rule(%r((?=\s*/))) { pop! }
388
+
389
+ rule(/\s+/) { token Text; goto :expr_start }
390
+ rule(//) { pop! }
391
+ end
392
+
393
+ state :expr_start do
394
+ mixin :inline_whitespace
395
+
396
+ rule %r(/) do
397
+ token Str::Regex
398
+ goto :slash_regex
399
+ end
400
+
401
+ # char operator. ?x evaulates to "x", unless there's a digit
402
+ # beforehand like x>=0?n[x]:""
403
+ rule %r(
404
+ [?](\\[MC]-)* # modifiers
405
+ (\\([\\abefnrstv\#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)
406
+ (?!\w)
407
+ )x, Str::Char, :pop!
408
+
409
+ # special case for using a single space. Ruby demands that
410
+ # these be in a single line, otherwise it would make no sense.
411
+ rule /(\s*)(%[rqswQWxiI]? \S* )/ do
412
+ groups Text, Str::Other
413
+ pop!
414
+ end
415
+
416
+ mixin :sigil_strings
417
+
418
+ rule(//) { pop! }
419
+ end
420
+
421
+ state :slash_regex do
422
+ mixin :string_intp
423
+ rule %r(\\\\), Str::Regex
424
+ rule %r(\\/), Str::Regex
425
+ rule %r([\\#]), Str::Regex
426
+ rule %r([^\\/#]+)m, Str::Regex
427
+ rule %r(/) do
428
+ token Str::Regex
429
+ goto :regex_flags
430
+ end
431
+ end
432
+
433
+ state :end_part do
434
+ # eat up the rest of the stream as Comment::Preproc
435
+ rule /.+/m, Comment::Preproc, :pop!
436
+ end
437
+ end
438
+ end
439
+ end
@@ -0,0 +1,198 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Rust < RegexLexer
7
+ title "Rust"
8
+ desc 'The Rust programming language (rust-lang.org)'
9
+ tag 'rust'
10
+ aliases 'rs',
11
+ # So that directives from https://github.com/budziq/rust-skeptic
12
+ # do not prevent highlighting.
13
+ 'rust,no_run', 'rs,no_run',
14
+ 'rust,ignore', 'rs,ignore',
15
+ 'rust,should_panic', 'rs,should_panic'
16
+ filenames '*.rs'
17
+ mimetypes 'text/x-rust'
18
+
19
+ def self.detect?(text)
20
+ return true if text.shebang? 'rustc'
21
+ end
22
+
23
+ def self.keywords
24
+ @keywords ||= %w(
25
+ as assert break const copy do drop else enum extern fail false
26
+ fn for if impl let log loop match mod move mut priv pub pure
27
+ ref return self static struct true trait type unsafe use where
28
+ while box
29
+ )
30
+ end
31
+
32
+ def self.builtins
33
+ @builtins ||= Set.new %w(
34
+ Add BitAnd BitOr BitXor bool c_char c_double c_float char
35
+ c_int clock_t c_long c_longlong Cons Const Copy c_schar c_short
36
+ c_uchar c_uint c_ulong c_ulonglong c_ushort c_void dev_t DIR
37
+ dirent Div Either Eq Err f32 f64 Failure FILE float fpos_t
38
+ i16 i32 i64 i8 isize Index ino_t int intptr_t Left mode_t Modulo Mul
39
+ Neg Nil None Num off_t Ok Option Ord Owned pid_t Ptr ptrdiff_t
40
+ Right Send Shl Shr size_t Some ssize_t str Sub Success time_t
41
+ u16 u32 u64 u8 usize uint uintptr_t
42
+ Box Vec String Gc Rc Arc
43
+ )
44
+ end
45
+
46
+ def macro_closed?
47
+ @macro_delims.values.all?(&:zero?)
48
+ end
49
+
50
+ start {
51
+ @macro_delims = { ']' => 0, ')' => 0, '}' => 0 }
52
+ }
53
+
54
+ delim_map = { '[' => ']', '(' => ')', '{' => '}' }
55
+
56
+ id = /[a-z_]\w*/i
57
+ hex = /[0-9a-f]/i
58
+ escapes = %r(
59
+ \\ ([nrt'\\] | x#{hex}{2} | u#{hex}{4} | U#{hex}{8})
60
+ )x
61
+ size = /8|16|32|64/
62
+
63
+ state :start_line do
64
+ mixin :whitespace
65
+ rule /\s+/, Text
66
+ rule /#\[/ do
67
+ token Name::Decorator; push :attribute
68
+ end
69
+ rule(//) { pop! }
70
+ rule /#\s[^\n]*/, Comment::Preproc
71
+ end
72
+
73
+ state :attribute do
74
+ mixin :whitespace
75
+ mixin :has_literals
76
+ rule /[(,)=]/, Name::Decorator
77
+ rule /\]/, Name::Decorator, :pop!
78
+ rule id, Name::Decorator
79
+ end
80
+
81
+ state :whitespace do
82
+ rule /\s+/, Text
83
+ rule %r(//[^\n]*), Comment
84
+ rule %r(/[*].*?[*]/)m, Comment::Multiline
85
+ end
86
+
87
+ state :root do
88
+ rule /\n/, Text, :start_line
89
+ mixin :whitespace
90
+ rule /\b(?:#{Rust.keywords.join('|')})\b/, Keyword
91
+ mixin :has_literals
92
+
93
+ rule %r([=-]>), Keyword
94
+ rule %r(<->), Keyword
95
+ rule /[()\[\]{}|,:;]/, Punctuation
96
+ rule /[*!@~&+%^<>=-\?]|\.{2,3}/, Operator
97
+
98
+ rule /([.]\s*)?#{id}(?=\s*[(])/m, Name::Function
99
+ rule /[.]\s*#{id}/, Name::Property
100
+ rule /(#{id})(::)/m do
101
+ groups Name::Namespace, Punctuation
102
+ end
103
+
104
+ # macros
105
+ rule /\bmacro_rules!/, Name::Decorator, :macro_rules
106
+ rule /#{id}!/, Name::Decorator, :macro
107
+
108
+ rule /'#{id}/, Name::Variable
109
+ rule /#{id}/ do |m|
110
+ name = m[0]
111
+ if self.class.builtins.include? name
112
+ token Name::Builtin
113
+ else
114
+ token Name
115
+ end
116
+ end
117
+ end
118
+
119
+ state :macro do
120
+ mixin :has_literals
121
+
122
+ rule /[\[{(]/ do |m|
123
+ @macro_delims[delim_map[m[0]]] += 1
124
+ puts " macro_delims: #{@macro_delims.inspect}" if @debug
125
+ token Punctuation
126
+ end
127
+
128
+ rule /[\]})]/ do |m|
129
+ @macro_delims[m[0]] -= 1
130
+ puts " macro_delims: #{@macro_delims.inspect}" if @debug
131
+ pop! if macro_closed?
132
+ token Punctuation
133
+ end
134
+
135
+ # same as the rule in root, but don't push another macro state
136
+ rule /#{id}!/, Name::Decorator
137
+ mixin :root
138
+
139
+ # No syntax errors in macros
140
+ rule /./, Text
141
+ end
142
+
143
+ state :macro_rules do
144
+ rule /[$]#{id}(:#{id})?/, Name::Variable
145
+ rule /[$]/, Name::Variable
146
+
147
+ mixin :macro
148
+ end
149
+
150
+ state :has_literals do
151
+ # constants
152
+ rule /\b(?:true|false|nil)\b/, Keyword::Constant
153
+ # characters
154
+ rule %r(
155
+ ' (?: #{escapes} | [^\\] ) '
156
+ )x, Str::Char
157
+
158
+ rule /"/, Str, :string
159
+
160
+ # numbers
161
+ dot = /[.][0-9_]+/
162
+ exp = /e[-+]?[0-9_]+/
163
+ flt = /f32|f64/
164
+
165
+ rule %r(
166
+ [0-9]+
167
+ (#{dot} #{exp}? #{flt}?
168
+ |#{dot}? #{exp} #{flt}?
169
+ |#{dot}? #{exp}? #{flt}
170
+ )
171
+ )x, Num::Float
172
+
173
+ rule %r(
174
+ ( 0b[10_]+
175
+ | 0x[0-9a-fA-F-]+
176
+ | [0-9]+
177
+ ) (u#{size}?|i#{size})?
178
+ )x, Num::Integer
179
+
180
+ end
181
+
182
+ state :string do
183
+ rule /"/, Str, :pop!
184
+ rule escapes, Str::Escape
185
+ rule /%%/, Str::Interpol
186
+ rule %r(
187
+ %
188
+ ( [0-9]+ [$] )? # Parameter
189
+ [0#+-]* # Flag
190
+ ( [0-9]+ [$]? )? # Width
191
+ ( [.] [0-9]+ )? # Precision
192
+ [bcdfiostuxX?] # Type
193
+ )x, Str::Interpol
194
+ rule /[^%"\\]+/m, Str
195
+ end
196
+ end
197
+ end
198
+ end