rouge_ecl 0.0.1

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