rougegal 2.1.2

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 (311) 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/cli.rb +394 -0
  6. data/lib/rouge/demos/abap +6 -0
  7. data/lib/rouge/demos/actionscript +4 -0
  8. data/lib/rouge/demos/apache +21 -0
  9. data/lib/rouge/demos/apiblueprint +33 -0
  10. data/lib/rouge/demos/applescript +2 -0
  11. data/lib/rouge/demos/awk +4 -0
  12. data/lib/rouge/demos/biml +38 -0
  13. data/lib/rouge/demos/bsl +7 -0
  14. data/lib/rouge/demos/c +8 -0
  15. data/lib/rouge/demos/ceylon +7 -0
  16. data/lib/rouge/demos/cfscript +18 -0
  17. data/lib/rouge/demos/clojure +5 -0
  18. data/lib/rouge/demos/cmake +7 -0
  19. data/lib/rouge/demos/coffeescript +5 -0
  20. data/lib/rouge/demos/common_lisp +1 -0
  21. data/lib/rouge/demos/conf +4 -0
  22. data/lib/rouge/demos/console +6 -0
  23. data/lib/rouge/demos/coq +13 -0
  24. data/lib/rouge/demos/cpp +8 -0
  25. data/lib/rouge/demos/csharp +5 -0
  26. data/lib/rouge/demos/css +4 -0
  27. data/lib/rouge/demos/d +16 -0
  28. data/lib/rouge/demos/dart +6 -0
  29. data/lib/rouge/demos/diff +7 -0
  30. data/lib/rouge/demos/digdag +19 -0
  31. data/lib/rouge/demos/docker +9 -0
  32. data/lib/rouge/demos/dot +5 -0
  33. data/lib/rouge/demos/eiffel +30 -0
  34. data/lib/rouge/demos/elixir +1 -0
  35. data/lib/rouge/demos/erb +1 -0
  36. data/lib/rouge/demos/erlang +7 -0
  37. data/lib/rouge/demos/factor +5 -0
  38. data/lib/rouge/demos/fortran +22 -0
  39. data/lib/rouge/demos/fsharp +12 -0
  40. data/lib/rouge/demos/gal +22 -0
  41. data/lib/rouge/demos/gherkin +17 -0
  42. data/lib/rouge/demos/glsl +14 -0
  43. data/lib/rouge/demos/go +7 -0
  44. data/lib/rouge/demos/gradle +10 -0
  45. data/lib/rouge/demos/graphql +17 -0
  46. data/lib/rouge/demos/groovy +9 -0
  47. data/lib/rouge/demos/haml +5 -0
  48. data/lib/rouge/demos/handlebars +7 -0
  49. data/lib/rouge/demos/haskell +6 -0
  50. data/lib/rouge/demos/html +8 -0
  51. data/lib/rouge/demos/http +14 -0
  52. data/lib/rouge/demos/hylang +10 -0
  53. data/lib/rouge/demos/idlang +8 -0
  54. data/lib/rouge/demos/igorpro +9 -0
  55. data/lib/rouge/demos/ini +4 -0
  56. data/lib/rouge/demos/io +11 -0
  57. data/lib/rouge/demos/irb +4 -0
  58. data/lib/rouge/demos/irb_output +2 -0
  59. data/lib/rouge/demos/java +5 -0
  60. data/lib/rouge/demos/javascript +1 -0
  61. data/lib/rouge/demos/jinja +9 -0
  62. data/lib/rouge/demos/json +1 -0
  63. data/lib/rouge/demos/json-doc +1 -0
  64. data/lib/rouge/demos/jsonnet +28 -0
  65. data/lib/rouge/demos/jsx +17 -0
  66. data/lib/rouge/demos/julia +11 -0
  67. data/lib/rouge/demos/kotlin +3 -0
  68. data/lib/rouge/demos/lasso +12 -0
  69. data/lib/rouge/demos/liquid +11 -0
  70. data/lib/rouge/demos/literate_coffeescript +3 -0
  71. data/lib/rouge/demos/literate_haskell +7 -0
  72. data/lib/rouge/demos/llvm +20 -0
  73. data/lib/rouge/demos/lua +12 -0
  74. data/lib/rouge/demos/make +6 -0
  75. data/lib/rouge/demos/markdown +4 -0
  76. data/lib/rouge/demos/matlab +6 -0
  77. data/lib/rouge/demos/moonscript +16 -0
  78. data/lib/rouge/demos/mosel +10 -0
  79. data/lib/rouge/demos/mxml +22 -0
  80. data/lib/rouge/demos/nasm +26 -0
  81. data/lib/rouge/demos/nginx +5 -0
  82. data/lib/rouge/demos/nim +27 -0
  83. data/lib/rouge/demos/objective_c +18 -0
  84. data/lib/rouge/demos/ocaml +12 -0
  85. data/lib/rouge/demos/pascal +14 -0
  86. data/lib/rouge/demos/perl +5 -0
  87. data/lib/rouge/demos/php +3 -0
  88. data/lib/rouge/demos/plaintext +1 -0
  89. data/lib/rouge/demos/plist +142 -0
  90. data/lib/rouge/demos/pony +17 -0
  91. data/lib/rouge/demos/powershell +49 -0
  92. data/lib/rouge/demos/praat +26 -0
  93. data/lib/rouge/demos/prolog +9 -0
  94. data/lib/rouge/demos/prometheus +9 -0
  95. data/lib/rouge/demos/properties +7 -0
  96. data/lib/rouge/demos/protobuf +5 -0
  97. data/lib/rouge/demos/puppet +6 -0
  98. data/lib/rouge/demos/python +6 -0
  99. data/lib/rouge/demos/q +2 -0
  100. data/lib/rouge/demos/qml +9 -0
  101. data/lib/rouge/demos/r +8 -0
  102. data/lib/rouge/demos/racket +24 -0
  103. data/lib/rouge/demos/ruby +9 -0
  104. data/lib/rouge/demos/rust +12 -0
  105. data/lib/rouge/demos/sass +3 -0
  106. data/lib/rouge/demos/scala +3 -0
  107. data/lib/rouge/demos/scheme +4 -0
  108. data/lib/rouge/demos/scss +5 -0
  109. data/lib/rouge/demos/sed +4 -0
  110. data/lib/rouge/demos/shell +2 -0
  111. data/lib/rouge/demos/sieve +10 -0
  112. data/lib/rouge/demos/slim +17 -0
  113. data/lib/rouge/demos/smalltalk +6 -0
  114. data/lib/rouge/demos/smarty +12 -0
  115. data/lib/rouge/demos/sml +4 -0
  116. data/lib/rouge/demos/sql +1 -0
  117. data/lib/rouge/demos/swift +5 -0
  118. data/lib/rouge/demos/tap +5 -0
  119. data/lib/rouge/demos/tcl +1 -0
  120. data/lib/rouge/demos/tex +1 -0
  121. data/lib/rouge/demos/toml +9 -0
  122. data/lib/rouge/demos/tsx +17 -0
  123. data/lib/rouge/demos/tulip +13 -0
  124. data/lib/rouge/demos/turtle +26 -0
  125. data/lib/rouge/demos/twig +9 -0
  126. data/lib/rouge/demos/typescript +1 -0
  127. data/lib/rouge/demos/vala +8 -0
  128. data/lib/rouge/demos/vb +4 -0
  129. data/lib/rouge/demos/verilog +27 -0
  130. data/lib/rouge/demos/vhdl +23 -0
  131. data/lib/rouge/demos/viml +14 -0
  132. data/lib/rouge/demos/vue +11 -0
  133. data/lib/rouge/demos/wollok +11 -0
  134. data/lib/rouge/demos/xml +2 -0
  135. data/lib/rouge/demos/yaml +4 -0
  136. data/lib/rouge/formatter.rb +75 -0
  137. data/lib/rouge/formatters/html.rb +37 -0
  138. data/lib/rouge/formatters/html_inline.rb +30 -0
  139. data/lib/rouge/formatters/html_legacy.rb +44 -0
  140. data/lib/rouge/formatters/html_linewise.rb +27 -0
  141. data/lib/rouge/formatters/html_pygments.rb +16 -0
  142. data/lib/rouge/formatters/html_table.rb +61 -0
  143. data/lib/rouge/formatters/null.rb +19 -0
  144. data/lib/rouge/formatters/terminal256.rb +172 -0
  145. data/lib/rouge/guesser.rb +55 -0
  146. data/lib/rouge/guessers/filename.rb +25 -0
  147. data/lib/rouge/guessers/glob_mapping.rb +46 -0
  148. data/lib/rouge/guessers/mimetype.rb +14 -0
  149. data/lib/rouge/guessers/modeline.rb +42 -0
  150. data/lib/rouge/guessers/source.rb +39 -0
  151. data/lib/rouge/lexer.rb +452 -0
  152. data/lib/rouge/lexers/abap.rb +238 -0
  153. data/lib/rouge/lexers/actionscript.rb +195 -0
  154. data/lib/rouge/lexers/apache.rb +71 -0
  155. data/lib/rouge/lexers/apache/keywords.yml +764 -0
  156. data/lib/rouge/lexers/apiblueprint.rb +51 -0
  157. data/lib/rouge/lexers/apple_script.rb +367 -0
  158. data/lib/rouge/lexers/awk.rb +161 -0
  159. data/lib/rouge/lexers/biml.rb +41 -0
  160. data/lib/rouge/lexers/bsl.rb +81 -0
  161. data/lib/rouge/lexers/c.rb +217 -0
  162. data/lib/rouge/lexers/ceylon.rb +123 -0
  163. data/lib/rouge/lexers/cfscript.rb +153 -0
  164. data/lib/rouge/lexers/clojure.rb +112 -0
  165. data/lib/rouge/lexers/cmake.rb +206 -0
  166. data/lib/rouge/lexers/coffeescript.rb +174 -0
  167. data/lib/rouge/lexers/common_lisp.rb +345 -0
  168. data/lib/rouge/lexers/conf.rb +24 -0
  169. data/lib/rouge/lexers/console.rb +136 -0
  170. data/lib/rouge/lexers/coq.rb +191 -0
  171. data/lib/rouge/lexers/cpp.rb +78 -0
  172. data/lib/rouge/lexers/csharp.rb +114 -0
  173. data/lib/rouge/lexers/css.rb +273 -0
  174. data/lib/rouge/lexers/d.rb +176 -0
  175. data/lib/rouge/lexers/dart.rb +104 -0
  176. data/lib/rouge/lexers/diff.rb +31 -0
  177. data/lib/rouge/lexers/digdag.rb +72 -0
  178. data/lib/rouge/lexers/docker.rb +50 -0
  179. data/lib/rouge/lexers/dot.rb +68 -0
  180. data/lib/rouge/lexers/eiffel.rb +65 -0
  181. data/lib/rouge/lexers/elixir.rb +133 -0
  182. data/lib/rouge/lexers/erb.rb +56 -0
  183. data/lib/rouge/lexers/erlang.rb +118 -0
  184. data/lib/rouge/lexers/factor.rb +302 -0
  185. data/lib/rouge/lexers/fortran.rb +170 -0
  186. data/lib/rouge/lexers/fsharp.rb +118 -0
  187. data/lib/rouge/lexers/gal.rb +50 -0
  188. data/lib/rouge/lexers/gherkin.rb +137 -0
  189. data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
  190. data/lib/rouge/lexers/glsl.rb +135 -0
  191. data/lib/rouge/lexers/go.rb +178 -0
  192. data/lib/rouge/lexers/gradle.rb +37 -0
  193. data/lib/rouge/lexers/graphql.rb +243 -0
  194. data/lib/rouge/lexers/groovy.rb +112 -0
  195. data/lib/rouge/lexers/haml.rb +233 -0
  196. data/lib/rouge/lexers/handlebars.rb +79 -0
  197. data/lib/rouge/lexers/haskell.rb +183 -0
  198. data/lib/rouge/lexers/html.rb +138 -0
  199. data/lib/rouge/lexers/http.rb +80 -0
  200. data/lib/rouge/lexers/hylang.rb +93 -0
  201. data/lib/rouge/lexers/idlang.rb +316 -0
  202. data/lib/rouge/lexers/igorpro.rb +407 -0
  203. data/lib/rouge/lexers/ini.rb +57 -0
  204. data/lib/rouge/lexers/io.rb +68 -0
  205. data/lib/rouge/lexers/irb.rb +66 -0
  206. data/lib/rouge/lexers/java.rb +87 -0
  207. data/lib/rouge/lexers/javascript.rb +269 -0
  208. data/lib/rouge/lexers/jinja.rb +137 -0
  209. data/lib/rouge/lexers/json.rb +29 -0
  210. data/lib/rouge/lexers/json_doc.rb +23 -0
  211. data/lib/rouge/lexers/jsonnet.rb +151 -0
  212. data/lib/rouge/lexers/jsx.rb +102 -0
  213. data/lib/rouge/lexers/julia.rb +172 -0
  214. data/lib/rouge/lexers/kotlin.rb +84 -0
  215. data/lib/rouge/lexers/lasso.rb +217 -0
  216. data/lib/rouge/lexers/lasso/keywords.yml +446 -0
  217. data/lib/rouge/lexers/liquid.rb +287 -0
  218. data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
  219. data/lib/rouge/lexers/literate_haskell.rb +36 -0
  220. data/lib/rouge/lexers/llvm.rb +84 -0
  221. data/lib/rouge/lexers/lua.rb +125 -0
  222. data/lib/rouge/lexers/lua/builtins.rb +22 -0
  223. data/lib/rouge/lexers/make.rb +116 -0
  224. data/lib/rouge/lexers/markdown.rb +154 -0
  225. data/lib/rouge/lexers/matlab.rb +75 -0
  226. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  227. data/lib/rouge/lexers/moonscript.rb +114 -0
  228. data/lib/rouge/lexers/mosel.rb +231 -0
  229. data/lib/rouge/lexers/mxml.rb +68 -0
  230. data/lib/rouge/lexers/nasm.rb +203 -0
  231. data/lib/rouge/lexers/nginx.rb +71 -0
  232. data/lib/rouge/lexers/nim.rb +152 -0
  233. data/lib/rouge/lexers/objective_c.rb +208 -0
  234. data/lib/rouge/lexers/ocaml.rb +100 -0
  235. data/lib/rouge/lexers/pascal.rb +66 -0
  236. data/lib/rouge/lexers/perl.rb +197 -0
  237. data/lib/rouge/lexers/php.rb +193 -0
  238. data/lib/rouge/lexers/php/builtins.rb +194 -0
  239. data/lib/rouge/lexers/plain_text.rb +26 -0
  240. data/lib/rouge/lexers/plist.rb +49 -0
  241. data/lib/rouge/lexers/pony.rb +93 -0
  242. data/lib/rouge/lexers/powershell.rb +132 -0
  243. data/lib/rouge/lexers/praat.rb +350 -0
  244. data/lib/rouge/lexers/prolog.rb +64 -0
  245. data/lib/rouge/lexers/prometheus.rb +121 -0
  246. data/lib/rouge/lexers/properties.rb +55 -0
  247. data/lib/rouge/lexers/protobuf.rb +70 -0
  248. data/lib/rouge/lexers/puppet.rb +128 -0
  249. data/lib/rouge/lexers/python.rb +231 -0
  250. data/lib/rouge/lexers/q.rb +124 -0
  251. data/lib/rouge/lexers/qml.rb +73 -0
  252. data/lib/rouge/lexers/r.rb +89 -0
  253. data/lib/rouge/lexers/racket.rb +542 -0
  254. data/lib/rouge/lexers/ruby.rb +437 -0
  255. data/lib/rouge/lexers/rust.rb +192 -0
  256. data/lib/rouge/lexers/sass.rb +74 -0
  257. data/lib/rouge/lexers/sass/common.rb +180 -0
  258. data/lib/rouge/lexers/scala.rb +142 -0
  259. data/lib/rouge/lexers/scheme.rb +112 -0
  260. data/lib/rouge/lexers/scss.rb +34 -0
  261. data/lib/rouge/lexers/sed.rb +172 -0
  262. data/lib/rouge/lexers/shell.rb +180 -0
  263. data/lib/rouge/lexers/sieve.rb +96 -0
  264. data/lib/rouge/lexers/slim.rb +228 -0
  265. data/lib/rouge/lexers/smalltalk.rb +116 -0
  266. data/lib/rouge/lexers/smarty.rb +91 -0
  267. data/lib/rouge/lexers/sml.rb +348 -0
  268. data/lib/rouge/lexers/sql.rb +140 -0
  269. data/lib/rouge/lexers/swift.rb +161 -0
  270. data/lib/rouge/lexers/tap.rb +91 -0
  271. data/lib/rouge/lexers/tcl.rb +192 -0
  272. data/lib/rouge/lexers/tex.rb +69 -0
  273. data/lib/rouge/lexers/toml.rb +71 -0
  274. data/lib/rouge/lexers/tsx.rb +19 -0
  275. data/lib/rouge/lexers/tulip.rb +107 -0
  276. data/lib/rouge/lexers/turtle.rb +72 -0
  277. data/lib/rouge/lexers/twig.rb +39 -0
  278. data/lib/rouge/lexers/typescript.rb +22 -0
  279. data/lib/rouge/lexers/typescript/common.rb +33 -0
  280. data/lib/rouge/lexers/vala.rb +77 -0
  281. data/lib/rouge/lexers/vb.rb +164 -0
  282. data/lib/rouge/lexers/verilog.rb +164 -0
  283. data/lib/rouge/lexers/vhdl.rb +97 -0
  284. data/lib/rouge/lexers/viml.rb +101 -0
  285. data/lib/rouge/lexers/viml/keywords.rb +12 -0
  286. data/lib/rouge/lexers/vue.rb +124 -0
  287. data/lib/rouge/lexers/wollok.rb +107 -0
  288. data/lib/rouge/lexers/xml.rb +59 -0
  289. data/lib/rouge/lexers/yaml.rb +373 -0
  290. data/lib/rouge/plugins/redcarpet.rb +30 -0
  291. data/lib/rouge/regex_lexer.rb +441 -0
  292. data/lib/rouge/template_lexer.rb +20 -0
  293. data/lib/rouge/text_analyzer.rb +48 -0
  294. data/lib/rouge/theme.rb +213 -0
  295. data/lib/rouge/themes/base16.rb +130 -0
  296. data/lib/rouge/themes/colorful.rb +67 -0
  297. data/lib/rouge/themes/github.rb +71 -0
  298. data/lib/rouge/themes/gruvbox.rb +167 -0
  299. data/lib/rouge/themes/igor_pro.rb +20 -0
  300. data/lib/rouge/themes/molokai.rb +82 -0
  301. data/lib/rouge/themes/monokai.rb +92 -0
  302. data/lib/rouge/themes/monokai_sublime.rb +90 -0
  303. data/lib/rouge/themes/pastie.rb +69 -0
  304. data/lib/rouge/themes/thankful_eyes.rb +74 -0
  305. data/lib/rouge/themes/tulip.rb +69 -0
  306. data/lib/rouge/token.rb +182 -0
  307. data/lib/rouge/util.rb +101 -0
  308. data/lib/rouge/version.rb +7 -0
  309. data/lib/rougegal.rb +80 -0
  310. data/rougegal.gemspec +18 -0
  311. metadata +356 -0
@@ -0,0 +1,112 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Groovy < RegexLexer
6
+ title "Groovy"
7
+ desc 'The Groovy programming language (http://www.groovy-lang.org/)'
8
+ tag 'groovy'
9
+ filenames '*.groovy', 'Jenkinsfile'
10
+ mimetypes 'text/x-groovy'
11
+
12
+ ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+)
13
+
14
+ def self.analyze_text(text)
15
+ return 1 if text.shebang?(/groovy/)
16
+ end
17
+
18
+ def self.keywords
19
+ @keywords ||= Set.new %w(
20
+ assert break case catch continue default do else finally for
21
+ if goto instanceof new return switch this throw try while in as
22
+ )
23
+ end
24
+
25
+ def self.declarations
26
+ @declarations ||= Set.new %w(
27
+ abstract const enum extends final implements native private
28
+ protected public static strictfp super synchronized throws
29
+ transient volatile
30
+ )
31
+ end
32
+
33
+ def self.types
34
+ @types ||= Set.new %w(
35
+ def boolean byte char double float int long short void
36
+ )
37
+ end
38
+
39
+ def self.constants
40
+ @constants ||= Set.new %w(true false null)
41
+ end
42
+
43
+ state :root do
44
+ rule %r(^
45
+ (\s*(?:\w[\w\d.\[\]]*\s+)+?) # return arguments
46
+ (\w[\w\d]*) # method name
47
+ (\s*) (\() # signature start
48
+ )x do |m|
49
+ delegate self.clone, m[1]
50
+ token Name::Function, m[2]
51
+ token Text, m[3]
52
+ token Operator, m[4]
53
+ end
54
+
55
+ # whitespace
56
+ rule /[^\S\n]+/, Text
57
+ rule %r(//.*?$), Comment::Single
58
+ rule %r(/[*].*?[*]/)m, Comment::Multiline
59
+ rule /@\w[\w\d.]*/, Name::Decorator
60
+ rule /(class|interface|trait)\b/, Keyword::Declaration, :class
61
+ rule /package\b/, Keyword::Namespace, :import
62
+ rule /import\b/, Keyword::Namespace, :import
63
+
64
+ # TODO: highlight backslash escapes
65
+ rule /""".*?"""/m, Str::Double
66
+ rule /'''.*?'''/m, Str::Single
67
+
68
+ rule /"(\\.|\\\n|.)*?"/, Str::Double
69
+ rule /'(\\.|\\\n|.)*?'/, Str::Single
70
+ rule %r(\$/(\$.|.)*?/\$)m, Str
71
+ rule %r(/(\\.|\\\n|.)*?/), Str
72
+ rule /'\\.'|'[^\\]'|'\\u[0-9a-f]{4}'/, Str::Char
73
+ rule /(\.)([a-zA-Z_][a-zA-Z0-9_]*)/ do
74
+ groups Operator, Name::Attribute
75
+ end
76
+
77
+ rule /[a-zA-Z_][a-zA-Z0-9_]*:/, Name::Label
78
+ rule /[a-zA-Z_\$][a-zA-Z0-9_]*/ do |m|
79
+ if self.class.keywords.include? m[0]
80
+ token Keyword
81
+ elsif self.class.declarations.include? m[0]
82
+ token Keyword::Declaration
83
+ elsif self.class.types.include? m[0]
84
+ token Keyword::Type
85
+ elsif self.class.constants.include? m[0]
86
+ token Keyword::Constant
87
+ else
88
+ token Name
89
+ end
90
+ end
91
+
92
+ rule %r([~^*!%&\[\](){}<>\|+=:;,./?-]), Operator
93
+
94
+ # numbers
95
+ rule /\d+\.\d+([eE]\d+)?[fd]?/, Num::Float
96
+ rule /0x[0-9a-f]+/, Num::Hex
97
+ rule /[0-9]+L?/, Num::Integer
98
+ rule /\n/, Text
99
+ end
100
+
101
+ state :class do
102
+ rule /\s+/, Text
103
+ rule /\w[\w\d]*/, Name::Class, :pop!
104
+ end
105
+
106
+ state :import do
107
+ rule /\s+/, Text
108
+ rule /[\w\d.]+[*]?/, Name::Namespace, :pop!
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,233 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ # A lexer for the Haml templating system for Ruby.
6
+ # @see http://haml.info
7
+ class Haml < RegexLexer
8
+ include Indentation
9
+
10
+ title "Haml"
11
+ desc "The Haml templating system for Ruby (haml.info)"
12
+
13
+ tag 'haml'
14
+ aliases 'HAML'
15
+
16
+ filenames '*.haml'
17
+ mimetypes 'text/x-haml'
18
+
19
+ def self.analyze_text(text)
20
+ return 0.1 if text.start_with? '!!!'
21
+ end
22
+
23
+ option 'filters[filter_name]', 'Mapping of lexers to use for haml :filters'
24
+ attr_reader :filters
25
+ # @option opts :filters
26
+ # A hash of filter name to lexer of how various filters should be
27
+ # highlighted. By default, :javascript, :css, :ruby, and :erb
28
+ # are supported.
29
+ def initialize(opts={})
30
+ super
31
+
32
+ default_filters = {
33
+ 'javascript' => Javascript.new(options),
34
+ 'css' => CSS.new(options),
35
+ 'ruby' => ruby,
36
+ 'erb' => ERB.new(options),
37
+ 'markdown' => Markdown.new(options),
38
+ 'sass' => Sass.new(options),
39
+ # TODO
40
+ # 'textile' => Textile.new(options),
41
+ # 'maruku' => Maruku.new(options),
42
+ }
43
+
44
+ @filters = hash_option(:filters, default_filters) do |v|
45
+ as_lexer(v) || PlainText.new(@options)
46
+ end
47
+ end
48
+
49
+ def ruby
50
+ @ruby ||= Ruby.new(@options)
51
+ end
52
+
53
+ def html
54
+ @html ||= HTML.new(@options)
55
+ end
56
+
57
+ def ruby!(state)
58
+ ruby.reset!
59
+ push state
60
+ end
61
+
62
+ start { ruby.reset!; html.reset! }
63
+
64
+ identifier = /[\w:-]+/
65
+ ruby_var = /[a-z]\w*/
66
+
67
+ # Haml can include " |\n" anywhere,
68
+ # which is ignored and used to wrap long lines.
69
+ # To accomodate this, use this custom faux dot instead.
70
+ dot = /[ ]\|\n(?=.*[ ]\|)|./
71
+
72
+ # In certain places, a comma at the end of the line
73
+ # allows line wrapping as well.
74
+ comma_dot = /,\s*\n|#{dot}/
75
+
76
+ state :root do
77
+ rule /\s*\n/, Text
78
+ rule(/\s*/) { |m| token Text; indentation(m[0]) }
79
+ end
80
+
81
+ state :content do
82
+ mixin :css
83
+ rule(/%#{identifier}/) { token Name::Tag; goto :tag }
84
+ rule /!!!#{dot}*\n/, Name::Namespace, :pop!
85
+ rule %r(
86
+ (/) (\[#{dot}*?\]) (#{dot}*\n)
87
+ )x do
88
+ groups Comment, Comment::Special, Comment
89
+ pop!
90
+ end
91
+
92
+ rule %r(/#{dot}*\n) do
93
+ token Comment
94
+ pop!
95
+ starts_block :html_comment_block
96
+ end
97
+
98
+ rule /-##{dot}*\n/ do
99
+ token Comment
100
+ pop!
101
+ starts_block :haml_comment_block
102
+ end
103
+
104
+ rule /-/ do
105
+ token Punctuation
106
+ reset_stack
107
+ ruby! :ruby_line
108
+ end
109
+
110
+ # filters
111
+ rule /:(#{dot}*)\n/ do |m|
112
+ token Name::Decorator
113
+ pop!
114
+ starts_block :filter_block
115
+
116
+ filter_name = m[1].strip
117
+
118
+ @filter_lexer = self.filters[filter_name]
119
+ @filter_lexer.reset! unless @filter_lexer.nil?
120
+
121
+ puts " haml: filter #{filter_name.inspect} #{@filter_lexer.inspect}" if @debug
122
+ end
123
+
124
+ mixin :eval_or_plain
125
+ end
126
+
127
+ state :css do
128
+ rule(/\.#{identifier}/) { token Name::Class; goto :tag }
129
+ rule(/##{identifier}/) { token Name::Function; goto :tag }
130
+ end
131
+
132
+ state :tag do
133
+ mixin :css
134
+ rule(/[{]/) { token Punctuation; ruby! :ruby_tag }
135
+ rule(/\[#{dot}*?\]/) { delegate ruby }
136
+
137
+ rule /\(/, Punctuation, :html_attributes
138
+ rule /\s*\n/, Text, :pop!
139
+
140
+ # whitespace chompers
141
+ rule /[<>]{1,2}(?=[ \t=])/, Punctuation
142
+
143
+ mixin :eval_or_plain
144
+ end
145
+
146
+ state :plain do
147
+ rule(/([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/) { delegate html }
148
+ mixin :interpolation
149
+ rule(/\n/) { token Text; reset_stack }
150
+ end
151
+
152
+ state :eval_or_plain do
153
+ rule /[&!]?==/, Punctuation, :plain
154
+ rule /[&!]?[=!]/ do
155
+ token Punctuation
156
+ reset_stack
157
+ ruby! :ruby_line
158
+ end
159
+
160
+ rule(//) { push :plain }
161
+ end
162
+
163
+ state :ruby_line do
164
+ rule /\n/, Text, :pop!
165
+ rule(/,[ \t]*\n/) { delegate ruby }
166
+ rule /[ ]\|[ \t]*\n/, Str::Escape
167
+ rule(/.*?(?=(,$| \|)?[ \t]*$)/) { delegate ruby }
168
+ end
169
+
170
+ state :ruby_tag do
171
+ mixin :ruby_inner
172
+ end
173
+
174
+ state :html_attributes do
175
+ rule /\s+/, Text
176
+ rule /#{identifier}\s*=/, Name::Attribute, :html_attribute_value
177
+ rule identifier, Name::Attribute
178
+ rule /\)/, Text, :pop!
179
+ end
180
+
181
+ state :html_attribute_value do
182
+ rule /\s+/, Text
183
+ rule ruby_var, Name::Variable, :pop!
184
+ rule /@#{ruby_var}/, Name::Variable::Instance, :pop!
185
+ rule /\$#{ruby_var}/, Name::Variable::Global, :pop!
186
+ rule /'(\\\\|\\'|[^'\n])*'/, Str, :pop!
187
+ rule /"(\\\\|\\"|[^"\n])*"/, Str, :pop!
188
+ end
189
+
190
+ state :html_comment_block do
191
+ rule /#{dot}+/, Comment
192
+ mixin :indented_block
193
+ end
194
+
195
+ state :haml_comment_block do
196
+ rule /#{dot}+/, Comment::Preproc
197
+ mixin :indented_block
198
+ end
199
+
200
+ state :filter_block do
201
+ rule /([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do
202
+ if @filter_lexer
203
+ delegate @filter_lexer
204
+ else
205
+ token Name::Decorator
206
+ end
207
+ end
208
+
209
+ mixin :interpolation
210
+ mixin :indented_block
211
+ end
212
+
213
+ state :interpolation do
214
+ rule /#[{]/, Str::Interpol, :ruby
215
+ end
216
+
217
+ state :ruby do
218
+ rule /[}]/, Str::Interpol, :pop!
219
+ mixin :ruby_inner
220
+ end
221
+
222
+ state :ruby_inner do
223
+ rule(/[{]/) { delegate ruby; push :ruby_inner }
224
+ rule(/[}]/) { delegate ruby; pop! }
225
+ rule(/[^{}]+/) { delegate ruby }
226
+ end
227
+
228
+ state :indented_block do
229
+ rule(/\n/) { token Text; reset_stack }
230
+ end
231
+ end
232
+ end
233
+ end
@@ -0,0 +1,79 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Handlebars < TemplateLexer
6
+ title "Handlebars"
7
+ desc 'the Handlebars and Mustache templating languages'
8
+ tag 'handlebars'
9
+ aliases 'hbs', 'mustache'
10
+ filenames '*.handlebars', '*.hbs', '*.mustache'
11
+ mimetypes 'text/x-handlebars', 'text/x-mustache'
12
+
13
+ id = %r([\w$-]+)
14
+
15
+ state :root do
16
+ # escaped slashes
17
+ rule(/\\{+/) { delegate parent }
18
+
19
+ # block comments
20
+ rule /{{!--/, Comment, :comment
21
+ rule /{{!.*?}}/, Comment
22
+
23
+ rule /{{{?/ do
24
+ token Keyword
25
+ push :stache
26
+ push :open_sym
27
+ end
28
+
29
+ rule(/(.+?)(?=\\|{{)/m) { delegate parent }
30
+
31
+ # if we get here, there's no more mustache tags, so we eat
32
+ # the rest of the doc
33
+ rule(/.+/m) { delegate parent }
34
+ end
35
+
36
+ state :comment do
37
+ rule(/{{/) { token Comment; push }
38
+ rule(/}}/) { token Comment; pop! }
39
+ rule(/[^{}]+/m) { token Comment }
40
+ rule(/[{}]/) { token Comment }
41
+ end
42
+
43
+ state :stache do
44
+ rule /}}}?/, Keyword, :pop!
45
+ rule /\s+/m, Text
46
+ rule /[=]/, Operator
47
+ rule /[\[\]]/, Punctuation
48
+ rule /[.](?=[}\s])/, Name::Variable
49
+ rule /[.][.]/, Name::Variable
50
+ rule %r([/.]), Punctuation
51
+ rule /"(\\.|.)*?"/, Str::Double
52
+ rule /'(\\.|.)*?'/, Str::Single
53
+ rule /\d+(?=}\s)/, Num
54
+ rule /(true|false)(?=[}\s])/, Keyword::Constant
55
+ rule /else(?=[}\s])/, Keyword
56
+ rule /this(?=[}\s])/, Name::Builtin::Pseudo
57
+ rule /@#{id}/, Name::Attribute
58
+ rule id, Name::Variable
59
+ end
60
+
61
+ state :open_sym do
62
+ rule %r([#/]) do
63
+ token Keyword
64
+ goto :block_name
65
+ end
66
+
67
+ rule /[>^&]/, Keyword
68
+
69
+ rule(//) { pop! }
70
+ end
71
+
72
+ state :block_name do
73
+ rule /if(?=[}\s])/, Keyword
74
+ rule id, Name::Namespace, :pop!
75
+ rule(//) { pop! }
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,183 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Haskell < RegexLexer
6
+ title "Haskell"
7
+ desc "The Haskell programming language (haskell.org)"
8
+
9
+ tag 'haskell'
10
+ aliases 'hs'
11
+ filenames '*.hs'
12
+ mimetypes 'text/x-haskell'
13
+
14
+ def self.analyze_text(text)
15
+ return 1 if text.shebang?('runhaskell')
16
+ end
17
+
18
+ reserved = %w(
19
+ _ case class data default deriving do else if in
20
+ infix[lr]? instance let newtype of then type where
21
+ )
22
+
23
+ ascii = %w(
24
+ NUL SOH [SE]TX EOT ENQ ACK BEL BS HT LF VT FF CR S[OI] DLE
25
+ DC[1-4] NAK SYN ETB CAN EM SUB ESC [FGRU]S SP DEL
26
+ )
27
+
28
+ state :basic do
29
+ rule /\s+/m, Text
30
+ rule /{-#/, Comment::Preproc, :comment_preproc
31
+ rule /{-/, Comment::Multiline, :comment
32
+ rule /^--\s+\|.*?$/, Comment::Doc
33
+ # this is complicated in order to support custom symbols
34
+ # like -->
35
+ rule /--(?![!#\$\%&*+.\/<=>?@\^\|_~]).*?$/, Comment::Single
36
+ end
37
+
38
+ # nested commenting
39
+ state :comment do
40
+ rule /-}/, Comment::Multiline, :pop!
41
+ rule /{-/, Comment::Multiline, :comment
42
+ rule /[^-{}]+/, Comment::Multiline
43
+ rule /[-{}]/, Comment::Multiline
44
+ end
45
+
46
+ state :comment_preproc do
47
+ rule /-}/, Comment::Preproc, :pop!
48
+ rule /{-/, Comment::Preproc, :comment
49
+ rule /[^-{}]+/, Comment::Preproc
50
+ rule /[-{}]/, Comment::Preproc
51
+ end
52
+
53
+ state :root do
54
+ mixin :basic
55
+
56
+ rule /\bimport\b/, Keyword::Reserved, :import
57
+ rule /\bmodule\b/, Keyword::Reserved, :module
58
+ rule /\berror\b/, Name::Exception
59
+ rule /\b(?:#{reserved.join('|')})\b/, Keyword::Reserved
60
+ # not sure why, but ^ doesn't work here
61
+ # rule /^[_a-z][\w']*/, Name::Function
62
+ rule /[_a-z][\w']*/, Name
63
+ rule /[A-Z][\w']*/, Keyword::Type
64
+
65
+ # lambda operator
66
+ rule %r(\\(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Name::Function
67
+ # special operators
68
+ rule %r((<-|::|->|=>|=)(?![:!#\$\%&*+.\\/<=>?@^\|~-]+)), Operator
69
+ # constructor/type operators
70
+ rule %r(:[:!#\$\%&*+.\\/<=>?@^\|~-]*), Operator
71
+ # other operators
72
+ rule %r([:!#\$\%&*+.\\/<=>?@^\|~-]+), Operator
73
+
74
+ rule /\d+e[+-]?\d+/i, Num::Float
75
+ rule /\d+\.\d+(e[+-]?\d+)?/i, Num::Float
76
+ rule /0o[0-7]+/i, Num::Oct
77
+ rule /0x[\da-f]+/i, Num::Hex
78
+ rule /\d+/, Num::Integer
79
+
80
+ rule /'/, Str::Char, :character
81
+ rule /"/, Str, :string
82
+
83
+ rule /\[\s*\]/, Keyword::Type
84
+ rule /\(\s*\)/, Name::Builtin
85
+ rule /[\[\](),;`{}]/, Punctuation
86
+ end
87
+
88
+ state :import do
89
+ rule /\s+/, Text
90
+ rule /"/, Str, :string
91
+ rule /\bqualified\b/, Keyword
92
+ # import X as Y
93
+ rule /([A-Z][\w.]*)(\s+)(as)(\s+)([A-Z][a-zA-Z0-9_.]*)/ do
94
+ groups(
95
+ Name::Namespace, # X
96
+ Text, Keyword, # as
97
+ Text, Name # Y
98
+ )
99
+ pop!
100
+ end
101
+
102
+ # import X hiding (functions)
103
+ rule /([A-Z][\w.]*)(\s+)(hiding)(\s+)(\()/ do
104
+ groups(
105
+ Name::Namespace, # X
106
+ Text, Keyword, # hiding
107
+ Text, Punctuation # (
108
+ )
109
+ goto :funclist
110
+ end
111
+
112
+ # import X (functions)
113
+ rule /([A-Z][\w.]*)(\s+)(\()/ do
114
+ groups(
115
+ Name::Namespace, # X
116
+ Text,
117
+ Punctuation # (
118
+ )
119
+ goto :funclist
120
+ end
121
+
122
+ rule /[\w.]+/, Name::Namespace, :pop!
123
+ end
124
+
125
+ state :module do
126
+ rule /\s+/, Text
127
+ # module Foo (functions)
128
+ rule /([A-Z][\w.]*)(\s+)(\()/ do
129
+ groups Name::Namespace, Text, Punctuation
130
+ push :funclist
131
+ end
132
+
133
+ rule /\bwhere\b/, Keyword::Reserved, :pop!
134
+
135
+ rule /[A-Z][a-zA-Z0-9_.]*/, Name::Namespace, :pop!
136
+ end
137
+
138
+ state :funclist do
139
+ mixin :basic
140
+ rule /[A-Z]\w*/, Keyword::Type
141
+ rule /(_[\w\']+|[a-z][\w\']*)/, Name::Function
142
+ rule /,/, Punctuation
143
+ rule /[:!#\$\%&*+.\\\/<=>?@^\|~-]+/, Operator
144
+ rule /\(/, Punctuation, :funclist
145
+ rule /\)/, Punctuation, :pop!
146
+ end
147
+
148
+ state :character do
149
+ rule /\\/ do
150
+ token Str::Escape
151
+ push :character_end
152
+ push :escape
153
+ end
154
+
155
+ rule /./ do
156
+ token Str::Char
157
+ goto :character_end
158
+ end
159
+ end
160
+
161
+ state :character_end do
162
+ rule /'/, Str::Char, :pop!
163
+ rule /./, Error, :pop!
164
+ end
165
+
166
+ state :string do
167
+ rule /"/, Str, :pop!
168
+ rule /\\/, Str::Escape, :escape
169
+ rule /[^\\"]+/, Str
170
+ end
171
+
172
+ state :escape do
173
+ rule /[abfnrtv"'&\\]/, Str::Escape, :pop!
174
+ rule /\^[\]\[A-Z@\^_]/, Str::Escape, :pop!
175
+ rule /#{ascii.join('|')}/, Str::Escape, :pop!
176
+ rule /o[0-7]+/i, Str::Escape, :pop!
177
+ rule /x[\da-f]/i, Str::Escape, :pop!
178
+ rule /\d+/, Str::Escape, :pop!
179
+ rule /\s+\\/, Str::Escape, :pop!
180
+ end
181
+ end
182
+ end
183
+ end