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,79 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ load_lexer 'c.rb'
7
+
8
+ class Cpp < C
9
+ title "C++"
10
+ desc "The C++ programming language"
11
+
12
+ tag 'cpp'
13
+ aliases 'c++'
14
+ # the many varied filenames of c++ source files...
15
+ filenames '*.cpp', '*.hpp',
16
+ '*.c++', '*.h++',
17
+ '*.cc', '*.hh',
18
+ '*.cxx', '*.hxx',
19
+ '*.pde', '*.ino',
20
+ '*.tpp'
21
+ mimetypes 'text/x-c++hdr', 'text/x-c++src'
22
+
23
+ def self.keywords
24
+ @keywords ||= super + Set.new(%w(
25
+ asm auto catch const_cast delete dynamic_cast explicit export
26
+ friend mutable namespace new operator private protected public
27
+ reinterpret_cast restrict size_of static_cast template this throw
28
+ throws typeid typename using virtual final override
29
+
30
+ alignas alignof constexpr decltype noexcept static_assert
31
+ thread_local try
32
+ ))
33
+ end
34
+
35
+ def self.keywords_type
36
+ @keywords_type ||= super + Set.new(%w(
37
+ bool
38
+ ))
39
+ end
40
+
41
+ def self.reserved
42
+ @reserved ||= super + Set.new(%w(
43
+ __virtual_inheritance __uuidof __super __single_inheritance
44
+ __multiple_inheritance __interface __event
45
+ ))
46
+ end
47
+
48
+ id = /[a-zA-Z_][a-zA-Z0-9_]*/
49
+
50
+ prepend :root do
51
+ # Offload C++ extensions, http://offload.codeplay.com/
52
+ rule /(?:__offload|__blockingoffload|__outer)\b/, Keyword::Pseudo
53
+ end
54
+
55
+ # digits with optional inner quotes
56
+ # see www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3781.pdf
57
+ dq = /\d('?\d)*/
58
+
59
+ prepend :statements do
60
+ rule /class\b/, Keyword, :classname
61
+ rule %r((#{dq}[.]#{dq}?|[.]#{dq})(e[+-]?#{dq}[lu]*)?)i, Num::Float
62
+ rule %r(#{dq}e[+-]?#{dq}[lu]*)i, Num::Float
63
+ rule /0x\h('?\h)*[lu]*/i, Num::Hex
64
+ rule /0[0-7]('?[0-7])*[lu]*/i, Num::Oct
65
+ rule /#{dq}[lu]*/i, Num::Integer
66
+ rule /\bnullptr\b/, Name::Builtin
67
+ rule /(?:u8|u|U|L)?R"([a-zA-Z0-9_{}\[\]#<>%:;.?*\+\-\/\^&|~!=,"']{,16})\(.*?\)\1"/m, Str
68
+ end
69
+
70
+ state :classname do
71
+ rule id, Name::Class, :pop!
72
+
73
+ # template specification
74
+ rule /\s*(?=>)/m, Text, :pop!
75
+ mixin :whitespace
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,430 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Crystal < RegexLexer
7
+ title "Crystal"
8
+ desc "Crystal The Programming Language (crystal-lang.org)"
9
+ tag 'crystal'
10
+ aliases 'cr'
11
+ filenames '*.cr'
12
+
13
+ mimetypes 'text/x-crystal', 'application/x-crystal'
14
+
15
+ def self.detect?(text)
16
+ return true if text.shebang? 'crystal'
17
+ end
18
+
19
+ state :symbols do
20
+ # symbols
21
+ rule %r(
22
+ : # initial :
23
+ @{0,2} # optional ivar, for :@foo and :@@foo
24
+ [a-z_]\w*[!?]? # the symbol
25
+ )xi, Str::Symbol
26
+
27
+ # special symbols
28
+ rule %r(:(?:\*\*|[-+]@|[/\%&\|^`~]|\[\]=?|<<|>>|<=?>|<=?|===?)),
29
+ Str::Symbol
30
+
31
+ rule /:'(\\\\|\\'|[^'])*'/, Str::Symbol
32
+ rule /:"/, Str::Symbol, :simple_sym
33
+ end
34
+
35
+ state :sigil_strings do
36
+ # %-sigiled strings
37
+ # %(abc), %[abc], %<abc>, %.abc., %r.abc., etc
38
+ delimiter_map = { '{' => '}', '[' => ']', '(' => ')', '<' => '>' }
39
+ rule /%([rqswQWxiI])?([^\w\s])/ do |m|
40
+ open = Regexp.escape(m[2])
41
+ close = Regexp.escape(delimiter_map[m[2]] || m[2])
42
+ interp = /[rQWxI]/ === m[1]
43
+ toktype = Str::Other
44
+
45
+ puts " open: #{open.inspect}" if @debug
46
+ puts " close: #{close.inspect}" if @debug
47
+
48
+ # regexes
49
+ if m[1] == 'r'
50
+ toktype = Str::Regex
51
+ push :regex_flags
52
+ end
53
+
54
+ token toktype
55
+
56
+ push do
57
+ rule /\\[##{open}#{close}\\]/, Str::Escape
58
+ # nesting rules only with asymmetric delimiters
59
+ if open != close
60
+ rule /#{open}/ do
61
+ token toktype
62
+ push
63
+ end
64
+ end
65
+ rule /#{close}/, toktype, :pop!
66
+
67
+ if interp
68
+ mixin :string_intp_escaped
69
+ rule /#/, toktype
70
+ else
71
+ rule /[\\#]/, toktype
72
+ end
73
+
74
+ rule /[^##{open}#{close}\\]+/m, toktype
75
+ end
76
+ end
77
+ end
78
+
79
+ state :strings do
80
+ mixin :symbols
81
+ rule /\b[a-z_]\w*?[?!]?:\s+/, Str::Symbol, :expr_start
82
+ rule /'(\\\\|\\'|[^'])*'/, Str::Single
83
+ rule /"/, Str::Double, :simple_string
84
+ rule /(?<!\.)`/, Str::Backtick, :simple_backtick
85
+ end
86
+
87
+ state :regex_flags do
88
+ rule /[mixounse]*/, Str::Regex, :pop!
89
+ end
90
+
91
+ # double-quoted string and symbol
92
+ [[:string, Str::Double, '"'],
93
+ [:sym, Str::Symbol, '"'],
94
+ [:backtick, Str::Backtick, '`']].each do |name, tok, fin|
95
+ state :"simple_#{name}" do
96
+ mixin :string_intp_escaped
97
+ rule /[^\\#{fin}#]+/m, tok
98
+ rule /[\\#]/, tok
99
+ rule /#{fin}/, tok, :pop!
100
+ end
101
+ end
102
+
103
+ keywords = %w(
104
+ BEGIN END alias begin break case defined\? do else elsif end
105
+ ensure for if ifdef in next redo rescue raise retry return super then
106
+ undef unless until when while yield lib fun type of as
107
+ )
108
+
109
+ keywords_pseudo = %w(
110
+ initialize new loop include extend raise attr_reader attr_writer
111
+ attr_accessor alias_method attr catch throw private module_function
112
+ public protected true false nil __FILE__ __LINE__
113
+ getter getter? getter! property property? property! struct record
114
+ )
115
+
116
+ builtins_g = %w(
117
+ abort ancestors at_exit
118
+ caller catch chomp chop clone constants
119
+ display dup eval exec exit extend fail fork format freeze
120
+ getc gets global_variables gsub hash id included_modules
121
+ inspect instance_eval instance_method instance_methods
122
+ lambda loop method method_missing
123
+ methods module_eval name object_id open p print printf
124
+ proc putc puts raise rand
125
+ readline readlines require scan select self send
126
+ sleep split sprintf srand sub syscall system
127
+ test throw to_a to_s trap warn
128
+ )
129
+
130
+ builtins_q = %w(
131
+ eql equal include is_a iterator kind_of nil
132
+ )
133
+
134
+ builtins_b = %w(chomp chop exit gsub sub)
135
+
136
+ start do
137
+ push :expr_start
138
+ @heredoc_queue = []
139
+ end
140
+
141
+ state :whitespace do
142
+ mixin :inline_whitespace
143
+ rule /\n\s*/m, Text, :expr_start
144
+ rule /#.*$/, Comment::Single
145
+
146
+ rule %r(=begin\b.*?\n=end\b)m, Comment::Multiline
147
+ end
148
+
149
+ state :inline_whitespace do
150
+ rule /[ \t\r]+/, Text
151
+ end
152
+
153
+ state :root do
154
+ mixin :whitespace
155
+ rule /__END__/, Comment::Preproc, :end_part
156
+
157
+ rule /0_?[0-7]+(?:_[0-7]+)*/, Num::Oct
158
+ rule /0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*/, Num::Hex
159
+ rule /0b[01]+(?:_[01]+)*/, Num::Bin
160
+ rule /\d+\.\d+(e[\+\-]?\d+)?/, Num::Float
161
+ rule /[\d]+(?:_\d+)*/, Num::Integer
162
+
163
+ rule /@\[([^\]]+)\]/, Name::Decorator
164
+
165
+ # names
166
+ rule /@@[a-z_]\w*/i, Name::Variable::Class
167
+ rule /@[a-z_]\w*/i, Name::Variable::Instance
168
+ rule /\$\w+/, Name::Variable::Global
169
+ rule %r(\$[!@&`'+~=/\\,;.<>_*\$?:"]), Name::Variable::Global
170
+ rule /\$-[0adFiIlpvw]/, Name::Variable::Global
171
+ rule /::/, Operator
172
+
173
+ mixin :strings
174
+
175
+ rule /(?:#{keywords.join('|')})\b/, Keyword, :expr_start
176
+ rule /(?:#{keywords_pseudo.join('|')})\b/, Keyword::Pseudo, :expr_start
177
+
178
+ rule %r(
179
+ (module)
180
+ (\s+)
181
+ ([a-zA-Z_][a-zA-Z0-9_]*(::[a-zA-Z_][a-zA-Z0-9_]*)*)
182
+ )x do
183
+ groups Keyword, Text, Name::Namespace
184
+ end
185
+
186
+ rule /(def\b)(\s*)/ do
187
+ groups Keyword, Text
188
+ push :funcname
189
+ end
190
+
191
+ rule /(class\b)(\s*)/ do
192
+ groups Keyword, Text
193
+ push :classname
194
+ end
195
+
196
+ rule /(?:#{builtins_q.join('|')})[?]/, Name::Builtin, :expr_start
197
+ rule /(?:#{builtins_b.join('|')})!/, Name::Builtin, :expr_start
198
+ rule /(?<!\.)(?:#{builtins_g.join('|')})\b/,
199
+ Name::Builtin, :method_call
200
+
201
+ mixin :has_heredocs
202
+
203
+ # `..` and `...` for ranges must have higher priority than `.`
204
+ # Otherwise, they will be parsed as :method_call
205
+ rule /\.{2,3}/, Operator, :expr_start
206
+
207
+ rule /[A-Z][a-zA-Z0-9_]*/, Name::Constant, :method_call
208
+ rule /(\.|::)(\s*)([a-z_]\w*[!?]?|[*%&^`~+-\/\[<>=])/ do
209
+ groups Punctuation, Text, Name::Function
210
+ push :method_call
211
+ end
212
+
213
+ rule /[a-zA-Z_]\w*[?!]/, Name, :expr_start
214
+ rule /[a-zA-Z_]\w*/, Name, :method_call
215
+ rule /\*\*|<<?|>>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\./,
216
+ Operator, :expr_start
217
+ rule /[-+\/*%=<>&!^|~]=?/, Operator, :expr_start
218
+ rule(/[?]/) { token Punctuation; push :ternary; push :expr_start }
219
+ rule %r<[\[({,:\\;/]>, Punctuation, :expr_start
220
+ rule %r<[\])}]>, Punctuation
221
+ end
222
+
223
+ state :has_heredocs do
224
+ rule /(?<!\w)(<<[-~]?)(["`']?)([a-zA-Z_]\w*)(\2)/ do |m|
225
+ token Operator, m[1]
226
+ token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
227
+ @heredoc_queue << [['<<-', '<<~'].include?(m[1]), m[3]]
228
+ push :heredoc_queue unless state? :heredoc_queue
229
+ end
230
+
231
+ rule /(<<[-~]?)(["'])(\2)/ do |m|
232
+ token Operator, m[1]
233
+ token Name::Constant, "#{m[2]}#{m[3]}#{m[4]}"
234
+ @heredoc_queue << [['<<-', '<<~'].include?(m[1]), '']
235
+ push :heredoc_queue unless state? :heredoc_queue
236
+ end
237
+ end
238
+
239
+ state :heredoc_queue do
240
+ rule /(?=\n)/ do
241
+ goto :resolve_heredocs
242
+ end
243
+
244
+ mixin :root
245
+ end
246
+
247
+ state :resolve_heredocs do
248
+ mixin :string_intp_escaped
249
+
250
+ rule /\n/, Str::Heredoc, :test_heredoc
251
+ rule /[#\\\n]/, Str::Heredoc
252
+ rule /[^#\\\n]+/, Str::Heredoc
253
+ end
254
+
255
+ state :test_heredoc do
256
+ rule /[^#\\\n]*$/ do |m|
257
+ tolerant, heredoc_name = @heredoc_queue.first
258
+ check = tolerant ? m[0].strip : m[0].rstrip
259
+
260
+ # check if we found the end of the heredoc
261
+ puts " end heredoc check #{check.inspect} = #{heredoc_name.inspect}" if @debug
262
+ if check == heredoc_name
263
+ @heredoc_queue.shift
264
+ # if there's no more, we're done looking.
265
+ pop! if @heredoc_queue.empty?
266
+ token Name::Constant
267
+ else
268
+ token Str::Heredoc
269
+ end
270
+
271
+ pop!
272
+ end
273
+
274
+ rule(//) { pop! }
275
+ end
276
+
277
+ state :funcname do
278
+ rule /\s+/, Text
279
+ rule /\(/, Punctuation, :defexpr
280
+ rule %r(
281
+ (?:([a-zA-Z_][\w_]*)(\.))?
282
+ (
283
+ [a-zA-Z_][\w_]*[!?]? |
284
+ \*\*? | [-+]@? | [/%&\|^`~] | \[\]=? |
285
+ <<? | >>? | <=>? | >= | ===?
286
+ )
287
+ )x do |m|
288
+ puts "matches: #{[m[0], m[1], m[2], m[3]].inspect}" if @debug
289
+ groups Name::Class, Operator, Name::Function
290
+ pop!
291
+ end
292
+
293
+ rule(//) { pop! }
294
+ end
295
+
296
+ state :classname do
297
+ rule /\s+/, Text
298
+ rule /\(/ do
299
+ token Punctuation
300
+ push :defexpr
301
+ push :expr_start
302
+ end
303
+
304
+ # class << expr
305
+ rule /<</ do
306
+ token Operator
307
+ goto :expr_start
308
+ end
309
+
310
+ rule /[A-Z_]\w*/, Name::Class, :pop!
311
+
312
+ rule(//) { pop! }
313
+ end
314
+
315
+ state :ternary do
316
+ rule(/:(?!:)/) { token Punctuation; goto :expr_start }
317
+
318
+ mixin :root
319
+ end
320
+
321
+ state :defexpr do
322
+ rule /(\))(\.|::)?/ do
323
+ groups Punctuation, Operator
324
+ pop!
325
+ end
326
+ rule /\(/ do
327
+ token Punctuation
328
+ push :defexpr
329
+ push :expr_start
330
+ end
331
+
332
+ mixin :root
333
+ end
334
+
335
+ state :in_interp do
336
+ rule /}/, Str::Interpol, :pop!
337
+ mixin :root
338
+ end
339
+
340
+ state :string_intp do
341
+ rule /[#][{]/, Str::Interpol, :in_interp
342
+ rule /#(@@?|\$)[a-z_]\w*/i, Str::Interpol
343
+ end
344
+
345
+ state :string_intp_escaped do
346
+ mixin :string_intp
347
+ rule /\\([\\abefnrstv#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})/,
348
+ Str::Escape
349
+ rule /\\./, Str::Escape
350
+ end
351
+
352
+ state :method_call do
353
+ rule %r(/) do
354
+ token Operator
355
+ goto :expr_start
356
+ end
357
+
358
+ rule(/(?=\n)/) { pop! }
359
+
360
+ rule(//) { goto :method_call_spaced }
361
+ end
362
+
363
+ state :method_call_spaced do
364
+ mixin :whitespace
365
+
366
+ rule %r([%/]=) do
367
+ token Operator
368
+ goto :expr_start
369
+ end
370
+
371
+ rule %r((/)(?=\S|\s*/)) do
372
+ token Str::Regex
373
+ goto :slash_regex
374
+ end
375
+
376
+ mixin :sigil_strings
377
+
378
+ rule(%r((?=\s*/))) { pop! }
379
+
380
+ rule(/\s+/) { token Text; goto :expr_start }
381
+ rule(//) { pop! }
382
+ end
383
+
384
+ state :expr_start do
385
+ mixin :inline_whitespace
386
+
387
+ rule %r(/) do
388
+ token Str::Regex
389
+ goto :slash_regex
390
+ end
391
+
392
+ # char operator. ?x evaulates to "x", unless there's a digit
393
+ # beforehand like x>=0?n[x]:""
394
+ rule %r(
395
+ [?](\\[MC]-)* # modifiers
396
+ (\\([\\abefnrstv\#"']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)
397
+ (?!\w)
398
+ )x, Str::Char, :pop!
399
+
400
+ # special case for using a single space. Ruby demands that
401
+ # these be in a single line, otherwise it would make no sense.
402
+ rule /(\s*)(%[rqswQWxiI]? \S* )/ do
403
+ groups Text, Str::Other
404
+ pop!
405
+ end
406
+
407
+ mixin :sigil_strings
408
+
409
+ rule(//) { pop! }
410
+ end
411
+
412
+ state :slash_regex do
413
+ mixin :string_intp
414
+ rule %r(\\\\), Str::Regex
415
+ rule %r(\\/), Str::Regex
416
+ rule %r([\\#]), Str::Regex
417
+ rule %r([^\\/#]+)m, Str::Regex
418
+ rule %r(/) do
419
+ token Str::Regex
420
+ goto :regex_flags
421
+ end
422
+ end
423
+
424
+ state :end_part do
425
+ # eat up the rest of the stream as Comment::Preproc
426
+ rule /.+/m, Comment::Preproc, :pop!
427
+ end
428
+ end
429
+ end
430
+ end
@@ -0,0 +1,115 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class CSharp < RegexLexer
7
+ tag 'csharp'
8
+ aliases 'c#', 'cs'
9
+ filenames '*.cs'
10
+ mimetypes 'text/x-csharp'
11
+
12
+ title "C#"
13
+ desc 'a multi-paradigm language targeting .NET'
14
+
15
+ # TODO: support more of unicode
16
+ id = /@?[_a-z]\w*/i
17
+
18
+ #Reserved Identifiers
19
+ #Contextual Keywords
20
+ #LINQ Query Expressions
21
+ keywords = %w(
22
+ abstract as base break case catch checked const continue
23
+ default delegate do else enum event explicit extern false
24
+ finally fixed for foreach goto if implicit in interface
25
+ internal is lock new null operator out override params private
26
+ protected public readonly ref return sealed sizeof stackalloc
27
+ static switch this throw true try typeof unchecked unsafe
28
+ virtual void volatile while
29
+ add alias async await get global partial remove set value where
30
+ yield nameof
31
+ ascending by descending equals from group in into join let on
32
+ orderby select
33
+ )
34
+
35
+ keywords_type = %w(
36
+ bool byte char decimal double dynamic float int long object
37
+ sbyte short string uint ulong ushort var
38
+ )
39
+
40
+ cpp_keywords = %w(
41
+ if endif else elif define undef line error warning region
42
+ endregion pragma
43
+ )
44
+
45
+ state :whitespace do
46
+ rule /\s+/m, Text
47
+ rule %r(//.*?$), Comment::Single
48
+ rule %r(/[*].*?[*]/)m, Comment::Multiline
49
+ end
50
+
51
+ state :nest do
52
+ rule /{/, Punctuation, :nest
53
+ rule /}/, Punctuation, :pop!
54
+ mixin :root
55
+ end
56
+
57
+ state :splice_string do
58
+ rule /\\./, Str
59
+ rule /{/, Punctuation, :nest
60
+ rule /"|\n/, Str, :pop!
61
+ rule /./, Str
62
+ end
63
+
64
+ state :splice_literal do
65
+ rule /""/, Str
66
+ rule /{/, Punctuation, :nest
67
+ rule /"/, Str, :pop!
68
+ rule /./, Str
69
+ end
70
+
71
+ state :root do
72
+ mixin :whitespace
73
+
74
+ rule /^\s*\[.*?\]/, Name::Attribute
75
+ rule /[$]\s*"/, Str, :splice_string
76
+ rule /[$]@\s*"/, Str, :splice_literal
77
+
78
+ rule /(<\[)\s*(#{id}:)?/, Keyword
79
+ rule /\]>/, Keyword
80
+
81
+ rule /[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation
82
+ rule /@"(""|[^"])*"/m, Str
83
+ rule /"(\\.|.)*?["\n]/, Str
84
+ rule /'(\\.|.)'/, Str::Char
85
+ rule /0x[0-9a-f]+[lu]?/i, Num
86
+ rule %r(
87
+ [0-9]
88
+ ([.][0-9]*)? # decimal
89
+ (e[+-][0-9]+)? # exponent
90
+ [fldu]? # type
91
+ )ix, Num
92
+ rule /\b(?:class|struct|interface)\b/, Keyword, :class
93
+ rule /\b(?:namespace|using)\b/, Keyword, :namespace
94
+ rule /^#[ \t]*(#{cpp_keywords.join('|')})\b.*?\n/,
95
+ Comment::Preproc
96
+ rule /\b(#{keywords.join('|')})\b/, Keyword
97
+ rule /\b(#{keywords_type.join('|')})\b/, Keyword::Type
98
+ rule /#{id}(?=\s*[(])/, Name::Function
99
+ rule id, Name
100
+ end
101
+
102
+ state :class do
103
+ mixin :whitespace
104
+ rule id, Name::Class, :pop!
105
+ end
106
+
107
+ state :namespace do
108
+ mixin :whitespace
109
+ rule /(?=[(])/, Text, :pop!
110
+ rule /(#{id}|[.])+/, Name::Namespace, :pop!
111
+ end
112
+
113
+ end
114
+ end
115
+ end