gitlab-rouge 1.9.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 (185) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +23 -0
  3. data/LICENSE +186 -0
  4. data/bin/rougify +16 -0
  5. data/gitlab-rouge.gemspec +17 -0
  6. data/lib/rouge.rb +57 -0
  7. data/lib/rouge/cli.rb +363 -0
  8. data/lib/rouge/demos/apache +21 -0
  9. data/lib/rouge/demos/applescript +2 -0
  10. data/lib/rouge/demos/c +8 -0
  11. data/lib/rouge/demos/clojure +5 -0
  12. data/lib/rouge/demos/coffeescript +5 -0
  13. data/lib/rouge/demos/common_lisp +1 -0
  14. data/lib/rouge/demos/conf +4 -0
  15. data/lib/rouge/demos/cpp +8 -0
  16. data/lib/rouge/demos/csharp +5 -0
  17. data/lib/rouge/demos/css +4 -0
  18. data/lib/rouge/demos/dart +6 -0
  19. data/lib/rouge/demos/diff +7 -0
  20. data/lib/rouge/demos/elixir +1 -0
  21. data/lib/rouge/demos/erb +1 -0
  22. data/lib/rouge/demos/erlang +7 -0
  23. data/lib/rouge/demos/factor +5 -0
  24. data/lib/rouge/demos/gherkin +17 -0
  25. data/lib/rouge/demos/glsl +14 -0
  26. data/lib/rouge/demos/go +7 -0
  27. data/lib/rouge/demos/groovy +9 -0
  28. data/lib/rouge/demos/haml +5 -0
  29. data/lib/rouge/demos/handlebars +7 -0
  30. data/lib/rouge/demos/haskell +6 -0
  31. data/lib/rouge/demos/html +8 -0
  32. data/lib/rouge/demos/http +14 -0
  33. data/lib/rouge/demos/ini +4 -0
  34. data/lib/rouge/demos/io +11 -0
  35. data/lib/rouge/demos/java +5 -0
  36. data/lib/rouge/demos/javascript +1 -0
  37. data/lib/rouge/demos/json +1 -0
  38. data/lib/rouge/demos/json-doc +1 -0
  39. data/lib/rouge/demos/liquid +11 -0
  40. data/lib/rouge/demos/literate_coffeescript +3 -0
  41. data/lib/rouge/demos/literate_haskell +7 -0
  42. data/lib/rouge/demos/llvm +20 -0
  43. data/lib/rouge/demos/lua +12 -0
  44. data/lib/rouge/demos/make +6 -0
  45. data/lib/rouge/demos/markdown +4 -0
  46. data/lib/rouge/demos/matlab +6 -0
  47. data/lib/rouge/demos/moonscript +16 -0
  48. data/lib/rouge/demos/nginx +5 -0
  49. data/lib/rouge/demos/nim +27 -0
  50. data/lib/rouge/demos/objective_c +14 -0
  51. data/lib/rouge/demos/ocaml +12 -0
  52. data/lib/rouge/demos/perl +5 -0
  53. data/lib/rouge/demos/php +3 -0
  54. data/lib/rouge/demos/plaintext +1 -0
  55. data/lib/rouge/demos/powershell +49 -0
  56. data/lib/rouge/demos/prolog +9 -0
  57. data/lib/rouge/demos/properties +7 -0
  58. data/lib/rouge/demos/puppet +6 -0
  59. data/lib/rouge/demos/python +6 -0
  60. data/lib/rouge/demos/qml +9 -0
  61. data/lib/rouge/demos/r +8 -0
  62. data/lib/rouge/demos/racket +24 -0
  63. data/lib/rouge/demos/ruby +9 -0
  64. data/lib/rouge/demos/rust +12 -0
  65. data/lib/rouge/demos/sass +3 -0
  66. data/lib/rouge/demos/scala +3 -0
  67. data/lib/rouge/demos/scheme +4 -0
  68. data/lib/rouge/demos/scss +5 -0
  69. data/lib/rouge/demos/sed +4 -0
  70. data/lib/rouge/demos/shell +2 -0
  71. data/lib/rouge/demos/slim +17 -0
  72. data/lib/rouge/demos/smalltalk +6 -0
  73. data/lib/rouge/demos/sml +4 -0
  74. data/lib/rouge/demos/sql +1 -0
  75. data/lib/rouge/demos/swift +5 -0
  76. data/lib/rouge/demos/tcl +1 -0
  77. data/lib/rouge/demos/tex +1 -0
  78. data/lib/rouge/demos/toml +9 -0
  79. data/lib/rouge/demos/tulip +14 -0
  80. data/lib/rouge/demos/vb +4 -0
  81. data/lib/rouge/demos/viml +5 -0
  82. data/lib/rouge/demos/xml +2 -0
  83. data/lib/rouge/demos/yaml +4 -0
  84. data/lib/rouge/formatter.rb +50 -0
  85. data/lib/rouge/formatters/html.rb +117 -0
  86. data/lib/rouge/formatters/null.rb +19 -0
  87. data/lib/rouge/formatters/terminal256.rb +176 -0
  88. data/lib/rouge/lexer.rb +443 -0
  89. data/lib/rouge/lexers/apache.rb +68 -0
  90. data/lib/rouge/lexers/apache/keywords.yml +453 -0
  91. data/lib/rouge/lexers/apple_script.rb +367 -0
  92. data/lib/rouge/lexers/c.rb +212 -0
  93. data/lib/rouge/lexers/clojure.rb +112 -0
  94. data/lib/rouge/lexers/coffeescript.rb +174 -0
  95. data/lib/rouge/lexers/common_lisp.rb +345 -0
  96. data/lib/rouge/lexers/conf.rb +24 -0
  97. data/lib/rouge/lexers/cpp.rb +66 -0
  98. data/lib/rouge/lexers/csharp.rb +88 -0
  99. data/lib/rouge/lexers/css.rb +271 -0
  100. data/lib/rouge/lexers/dart.rb +104 -0
  101. data/lib/rouge/lexers/diff.rb +31 -0
  102. data/lib/rouge/lexers/elixir.rb +108 -0
  103. data/lib/rouge/lexers/erb.rb +56 -0
  104. data/lib/rouge/lexers/erlang.rb +118 -0
  105. data/lib/rouge/lexers/factor.rb +302 -0
  106. data/lib/rouge/lexers/gherkin.rb +137 -0
  107. data/lib/rouge/lexers/gherkin/keywords.rb +14 -0
  108. data/lib/rouge/lexers/glsl.rb +135 -0
  109. data/lib/rouge/lexers/go.rb +178 -0
  110. data/lib/rouge/lexers/groovy.rb +104 -0
  111. data/lib/rouge/lexers/haml.rb +228 -0
  112. data/lib/rouge/lexers/handlebars.rb +79 -0
  113. data/lib/rouge/lexers/haskell.rb +183 -0
  114. data/lib/rouge/lexers/html.rb +94 -0
  115. data/lib/rouge/lexers/http.rb +80 -0
  116. data/lib/rouge/lexers/ini.rb +57 -0
  117. data/lib/rouge/lexers/io.rb +68 -0
  118. data/lib/rouge/lexers/java.rb +76 -0
  119. data/lib/rouge/lexers/javascript.rb +297 -0
  120. data/lib/rouge/lexers/liquid.rb +287 -0
  121. data/lib/rouge/lexers/literate_coffeescript.rb +33 -0
  122. data/lib/rouge/lexers/literate_haskell.rb +36 -0
  123. data/lib/rouge/lexers/llvm.rb +84 -0
  124. data/lib/rouge/lexers/lua.rb +122 -0
  125. data/lib/rouge/lexers/lua/builtins.rb +22 -0
  126. data/lib/rouge/lexers/make.rb +116 -0
  127. data/lib/rouge/lexers/markdown.rb +154 -0
  128. data/lib/rouge/lexers/matlab.rb +74 -0
  129. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  130. data/lib/rouge/lexers/moonscript.rb +110 -0
  131. data/lib/rouge/lexers/nginx.rb +71 -0
  132. data/lib/rouge/lexers/nim.rb +152 -0
  133. data/lib/rouge/lexers/objective_c.rb +197 -0
  134. data/lib/rouge/lexers/ocaml.rb +111 -0
  135. data/lib/rouge/lexers/perl.rb +197 -0
  136. data/lib/rouge/lexers/php.rb +173 -0
  137. data/lib/rouge/lexers/php/builtins.rb +204 -0
  138. data/lib/rouge/lexers/plain_text.rb +25 -0
  139. data/lib/rouge/lexers/powershell.rb +96 -0
  140. data/lib/rouge/lexers/prolog.rb +64 -0
  141. data/lib/rouge/lexers/properties.rb +55 -0
  142. data/lib/rouge/lexers/puppet.rb +128 -0
  143. data/lib/rouge/lexers/python.rb +228 -0
  144. data/lib/rouge/lexers/qml.rb +72 -0
  145. data/lib/rouge/lexers/r.rb +56 -0
  146. data/lib/rouge/lexers/racket.rb +542 -0
  147. data/lib/rouge/lexers/ruby.rb +415 -0
  148. data/lib/rouge/lexers/rust.rb +191 -0
  149. data/lib/rouge/lexers/sass.rb +74 -0
  150. data/lib/rouge/lexers/sass/common.rb +180 -0
  151. data/lib/rouge/lexers/scala.rb +142 -0
  152. data/lib/rouge/lexers/scheme.rb +112 -0
  153. data/lib/rouge/lexers/scss.rb +34 -0
  154. data/lib/rouge/lexers/sed.rb +170 -0
  155. data/lib/rouge/lexers/shell.rb +152 -0
  156. data/lib/rouge/lexers/slim.rb +228 -0
  157. data/lib/rouge/lexers/smalltalk.rb +116 -0
  158. data/lib/rouge/lexers/sml.rb +347 -0
  159. data/lib/rouge/lexers/sql.rb +140 -0
  160. data/lib/rouge/lexers/swift.rb +144 -0
  161. data/lib/rouge/lexers/tcl.rb +192 -0
  162. data/lib/rouge/lexers/tex.rb +72 -0
  163. data/lib/rouge/lexers/toml.rb +71 -0
  164. data/lib/rouge/lexers/tulip.rb +75 -0
  165. data/lib/rouge/lexers/vb.rb +164 -0
  166. data/lib/rouge/lexers/viml.rb +101 -0
  167. data/lib/rouge/lexers/viml/keywords.rb +12 -0
  168. data/lib/rouge/lexers/xml.rb +59 -0
  169. data/lib/rouge/lexers/yaml.rb +364 -0
  170. data/lib/rouge/plugins/redcarpet.rb +30 -0
  171. data/lib/rouge/regex_lexer.rb +439 -0
  172. data/lib/rouge/template_lexer.rb +22 -0
  173. data/lib/rouge/text_analyzer.rb +48 -0
  174. data/lib/rouge/theme.rb +195 -0
  175. data/lib/rouge/themes/base16.rb +130 -0
  176. data/lib/rouge/themes/colorful.rb +67 -0
  177. data/lib/rouge/themes/github.rb +71 -0
  178. data/lib/rouge/themes/molokai.rb +82 -0
  179. data/lib/rouge/themes/monokai.rb +92 -0
  180. data/lib/rouge/themes/monokai_sublime.rb +90 -0
  181. data/lib/rouge/themes/thankful_eyes.rb +71 -0
  182. data/lib/rouge/token.rb +182 -0
  183. data/lib/rouge/util.rb +101 -0
  184. data/lib/rouge/version.rb +7 -0
  185. metadata +231 -0
@@ -0,0 +1,71 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Nginx < RegexLexer
6
+ title "nginx"
7
+ desc 'configuration files for the nginx web server (nginx.org)'
8
+ tag 'nginx'
9
+ mimetypes 'text/x-nginx-conf'
10
+ filenames 'nginx.conf'
11
+
12
+ id = /[^\s$;{}()#]+/
13
+
14
+ state :root do
15
+ rule /(include)(\s+)([^\s;]+)/ do
16
+ groups Keyword, Text, Name
17
+ end
18
+
19
+ rule id, Keyword, :statement
20
+
21
+ mixin :base
22
+ end
23
+
24
+ state :block do
25
+ rule /}/, Punctuation, :pop!
26
+ rule id, Keyword::Namespace, :statement
27
+ mixin :base
28
+ end
29
+
30
+ state :statement do
31
+ rule /{/ do
32
+ token Punctuation; pop!; push :block
33
+ end
34
+
35
+ rule /;/, Punctuation, :pop!
36
+
37
+ mixin :base
38
+ end
39
+
40
+ state :base do
41
+ rule /\s+/, Text
42
+
43
+ rule /#.*?\n/, Comment::Single
44
+ rule /(?:on|off)\b/, Name::Constant
45
+ rule /[$][\w-]+/, Name::Variable
46
+
47
+ # host/port
48
+ rule /([a-z0-9.-]+)(:)([0-9]+)/i do
49
+ groups Name::Function, Punctuation, Num::Integer
50
+ end
51
+
52
+ # mimetype
53
+ rule %r([a-z-]+/[a-z-]+)i, Name::Class
54
+
55
+ rule /[0-9]+[kmg]?\b/i, Num::Integer
56
+ rule /(~)(\s*)([^\s{]+)/ do
57
+ groups Punctuation, Text, Str::Regex
58
+ end
59
+
60
+ rule /[:=~]/, Punctuation
61
+
62
+ # pathname
63
+ rule %r(/#{id}?), Name
64
+
65
+ rule /[^#\s;{}$\\]+/, Str # catchall
66
+
67
+ rule /[$;]/, Text
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,152 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class Nim < RegexLexer
6
+ # This is pretty much a 1-1 port of the pygments NimrodLexer class
7
+ title "Nim"
8
+ desc "The Nim programming language (http://nim-lang.org/)"
9
+
10
+ tag 'nim'
11
+ aliases 'nimrod'
12
+ filenames '*.nim'
13
+
14
+ KEYWORDS = %w(
15
+ addr as asm atomic bind block break case cast const continue
16
+ converter defer discard distinct do elif else end enum except export
17
+ func finally for from generic if import include interface iterator let
18
+ macro method mixin nil object of out proc ptr raise ref return static
19
+ template try tuple type using var when while with without yield
20
+ )
21
+
22
+ OPWORDS = %w(
23
+ and or not xor shl shr div mod in notin is isnot
24
+ )
25
+
26
+ PSEUDOKEYWORDS = %w(
27
+ nil true false
28
+ )
29
+
30
+ TYPES = %w(
31
+ int int8 int16 int32 int64 float float32 float64 bool char range array
32
+ seq set string
33
+ )
34
+
35
+ NAMESPACE = %w(
36
+ from import include
37
+ )
38
+
39
+ def self.underscorize(words)
40
+ words.map do |w|
41
+ w.gsub(/./) { |x| "#{Regexp.escape(x)}_?" }
42
+ end.join('|')
43
+ end
44
+
45
+ state :chars do
46
+ rule(/\\([\\abcefnrtvl"\']|x[a-fA-F0-9]{2}|[0-9]{1,3})/, Str::Escape)
47
+ rule(/'/, Str::Char, :pop!)
48
+ rule(/./, Str::Char)
49
+ end
50
+
51
+ state :strings do
52
+ rule(/(?<!\$)\$(\d+|#|\w+)+/, Str::Interpol)
53
+ rule(/[^\\\'"\$\n]+/, Str)
54
+ rule(/[\'"\\]/, Str)
55
+ rule(/\$/, Str)
56
+ end
57
+
58
+ state :dqs do
59
+ rule(/\\([\\abcefnrtvl"\']|\n|x[a-fA-F0-9]{2}|[0-9]{1,3})/,
60
+ Str::Escape)
61
+ rule(/"/, Str, :pop!)
62
+ mixin :strings
63
+ end
64
+
65
+ state :rdqs do
66
+ rule(/"(?!")/, Str, :pop!)
67
+ rule(/"/, Str::Escape, :pop!)
68
+ mixin :strings
69
+ end
70
+
71
+ state :tdqs do
72
+ rule(/"""(?!")/, Str, :pop!)
73
+ mixin :strings
74
+ mixin :nl
75
+ end
76
+
77
+ state :funcname do
78
+ rule(/((?![\d_])\w)(((?!_)\w)|(_(?!_)\w))*/, Name::Function, :pop!)
79
+ rule(/`.+`/, Name::Function, :pop!)
80
+ end
81
+
82
+ state :nl do
83
+ rule(/\n/, Str)
84
+ end
85
+
86
+ state :floatnumber do
87
+ rule(/\.(?!\.)[0-9_]*/, Num::Float)
88
+ rule(/[eE][+-]?[0-9][0-9_]*/, Num::Float)
89
+ rule(//, Text, :pop!)
90
+ end
91
+
92
+ # Making apostrophes optional, as only hexadecimal with type suffix
93
+ # possibly ambiguous.
94
+ state :floatsuffix do
95
+ rule(/'?[fF](32|64)/, Num::Float)
96
+ rule(//, Text, :pop!)
97
+ end
98
+
99
+ state :intsuffix do
100
+ rule(/'?[iI](32|64)/, Num::Integer::Long)
101
+ rule(/'?[iI](8|16)/, Num::Integer)
102
+ rule(/'?[uU]/, Num::Integer)
103
+ rule(//, Text, :pop!)
104
+ end
105
+
106
+ state :root do
107
+ rule(/##.*$/, Str::Doc)
108
+ rule(/#.*$/, Comment)
109
+ rule(/\*|=|>|<|\+|-|\/|@|\$|~|&|%|\!|\?|\||\\|\[|\]/, Operator)
110
+ rule(/\.\.|\.|,|\[\.|\.\]|{\.|\.}|\(\.|\.\)|{|}|\(|\)|:|\^|`|;/,
111
+ Punctuation)
112
+
113
+ # Strings
114
+ rule(/(?:[\w]+)"/,Str, :rdqs)
115
+ rule(/"""/, Str, :tdqs)
116
+ rule(/"/, Str, :dqs)
117
+
118
+ # Char
119
+ rule(/'/, Str::Char, :chars)
120
+
121
+ # Keywords
122
+ rule(%r[(#{Nim.underscorize(OPWORDS)})\b], Operator::Word)
123
+ rule(/(p_?r_?o_?c_?\s)(?![\(\[\]])/, Keyword, :funcname)
124
+ rule(%r[(#{Nim.underscorize(KEYWORDS)})\b], Keyword)
125
+ rule(%r[(#{Nim.underscorize(NAMESPACE)})\b], Keyword::Namespace)
126
+ rule(/(v_?a_?r)\b/, Keyword::Declaration)
127
+ rule(%r[(#{Nim.underscorize(TYPES)})\b], Keyword::Type)
128
+ rule(%r[(#{Nim.underscorize(PSEUDOKEYWORDS)})\b], Keyword::Pseudo)
129
+ # Identifiers
130
+ rule(/\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*/, Name)
131
+
132
+ # Numbers
133
+ # Note: Have to do this with a block to push multiple states first,
134
+ # since we can't pass array of states like w/ Pygments.
135
+ rule(/[0-9][0-9_]*(?=([eE.]|'?[fF](32|64)))/) do |number|
136
+ push :floatsuffix
137
+ push :floatnumber
138
+ token Num::Float
139
+ end
140
+ rule(/0[xX][a-fA-F0-9][a-fA-F0-9_]*/, Num::Hex, :intsuffix)
141
+ rule(/0[bB][01][01_]*/, Num, :intsuffix)
142
+ rule(/0o[0-7][0-7_]*/, Num::Oct, :intsuffix)
143
+ rule(/[0-9][0-9_]*/, Num::Integer, :intsuffix)
144
+
145
+ # Whitespace
146
+ rule(/\s+/, Text)
147
+ rule(/.+$/, Error)
148
+ end
149
+
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,197 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ load_const :C, 'c.rb'
6
+
7
+ class ObjectiveC < C
8
+ tag 'objective_c'
9
+ title "Objective-C"
10
+ desc 'an extension of C commonly used to write Apple software'
11
+ aliases 'objc'
12
+ filenames '*.m', '*.h'
13
+
14
+ mimetypes 'text/x-objective_c', 'application/x-objective_c'
15
+
16
+ def self.at_keywords
17
+ @at_keywords ||= %w(
18
+ selector private protected public encode synchronized try
19
+ throw catch finally end property synthesize dynamic optional
20
+ interface implementation import
21
+ )
22
+ end
23
+
24
+ def self.at_builtins
25
+ @at_builtins ||= %w(true false YES NO)
26
+ end
27
+
28
+ def self.builtins
29
+ @builtins ||= %w(YES NO nil)
30
+ end
31
+
32
+ def self.analyze_text(text)
33
+ return 1 if text =~ /@(end|implementation|protocol|property)\b/
34
+
35
+ id = /[a-z$_][a-z0-9$_]*/i
36
+ return 0.4 if text =~ %r(
37
+ \[ \s* #{id} \s+
38
+ (?:
39
+ #{id} \s* \]
40
+ | #{id}? :
41
+ )
42
+ )x
43
+ return 0.4 if text.include? '@"'
44
+ end
45
+
46
+ id = /[a-z$_][a-z0-9$_]*/i
47
+
48
+ prepend :statements do
49
+ rule /@"/, Str, :string
50
+ rule /@'(\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|\\.|[^\\'\n]')/,
51
+ Str::Char
52
+ rule /@(\d+[.]\d*|[.]\d+|\d+)e[+-]?\d+l?/i,
53
+ Num::Float
54
+ rule /@(\d+[.]\d*|[.]\d+|\d+f)f?/i, Num::Float
55
+ rule /@0x\h+[lL]?/, Num::Hex
56
+ rule /@0[0-7]+l?/i, Num::Oct
57
+ rule /@\d+l?/, Num::Integer
58
+ rule /\bin\b/, Keyword
59
+
60
+ rule /@(?:interface|implementation)\b/ do
61
+ token Keyword
62
+ goto :classname
63
+ end
64
+
65
+ rule /@(?:class|protocol)\b/ do
66
+ token Keyword
67
+ goto :forward_classname
68
+ end
69
+
70
+ rule /@([[:alnum:]]+)/ do |m|
71
+ if self.class.at_keywords.include? m[1]
72
+ token Keyword
73
+ elsif self.class.at_builtins.include? m[1]
74
+ token Name::Builtin
75
+ else
76
+ token Error
77
+ end
78
+ end
79
+
80
+ rule /[?]/, Punctuation, :ternary
81
+ rule /\[/, Punctuation, :message
82
+ rule /@\[/, Punctuation, :array_literal
83
+ end
84
+
85
+ state :ternary do
86
+ rule /:/, Punctuation, :pop!
87
+ mixin :statements
88
+ end
89
+
90
+ state :message_shared do
91
+ rule /\]/, Punctuation, :pop!
92
+ rule /;/, Error
93
+
94
+ mixin :statement
95
+ end
96
+
97
+ state :message do
98
+ rule /(#{id})(\s*)(:)/ do
99
+ groups(Name::Function, Text, Punctuation)
100
+ goto :message_with_args
101
+ end
102
+
103
+ rule /(#{id})(\s*)(\])/ do
104
+ groups(Name::Function, Text, Punctuation)
105
+ pop!
106
+ end
107
+
108
+ mixin :message_shared
109
+ end
110
+
111
+ state :message_with_args do
112
+ rule /(#{id})(\s*)(:)/ do
113
+ groups(Name::Function, Text, Punctuation)
114
+ end
115
+
116
+ mixin :message_shared
117
+ end
118
+
119
+ state :array_literal do
120
+ rule /]/, Punctuation, :pop!
121
+ rule /,/, Punctuation
122
+ mixin :statements
123
+ end
124
+
125
+ state :classname do
126
+ mixin :whitespace
127
+
128
+ rule /(#{id})(\s*)(:)(\s*)(#{id})/ do
129
+ groups(Name::Class, Text,
130
+ Punctuation, Text,
131
+ Name::Class)
132
+ pop!
133
+ end
134
+
135
+ rule /(#{id})(\s*)([(])(\s*)(#{id})(\s*)([)])/ do
136
+ groups(Name::Class, Text,
137
+ Punctuation, Text,
138
+ Name::Label, Text,
139
+ Punctuation)
140
+ end
141
+
142
+ rule id, Name::Class, :pop!
143
+ end
144
+
145
+ state :forward_classname do
146
+ mixin :whitespace
147
+
148
+ rule /(#{id})(\s*)(,)(\s*)/ do
149
+ groups(Name::Class, Text, Punctuation, Text)
150
+ push
151
+ end
152
+
153
+ rule /(#{id})(\s*)(;?)/ do
154
+ groups(Name::Class, Text, Punctuation)
155
+ pop!
156
+ end
157
+ end
158
+
159
+ prepend :root do
160
+ rule %r(
161
+ ([-+])(\s*)
162
+ ([(].*?[)])?(\s*)
163
+ (?=#{id}:?)
164
+ )ix do |m|
165
+ token Keyword, m[1]; token Text, m[2]
166
+ recurse m[3]; token Text, m[4]
167
+ push :method_definition
168
+ end
169
+ end
170
+
171
+ state :method_definition do
172
+ rule /,/, Punctuation
173
+ rule /[.][.][.]/, Punctuation
174
+ rule /([(].*?[)])(#{id})/ do |m|
175
+ recurse m[1]; token Name::Variable, m[2]
176
+ end
177
+
178
+ rule /(#{id})(\s*)(:)/m do
179
+ groups(Name::Function, Text, Punctuation)
180
+ end
181
+
182
+ rule /;/, Punctuation, :pop!
183
+
184
+ rule /{/ do
185
+ token Punctuation
186
+ goto :function
187
+ end
188
+
189
+ mixin :inline_whitespace
190
+ rule %r(//.*?\n), Comment::Single
191
+ rule /\s+/m, Text
192
+
193
+ rule(//) { pop! }
194
+ end
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,111 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class OCaml < RegexLexer
6
+ title "OCaml"
7
+ desc 'Objective CAML (ocaml.org)'
8
+ tag 'ocaml'
9
+ filenames '*.ml', '*.mli', '*.mll', '*.mly'
10
+ mimetypes 'text/x-ocaml'
11
+
12
+ def self.keywords
13
+ @keywords ||= Set.new %w(
14
+ as assert begin class constraint do done downto else end
15
+ exception external false for fun function functor if in include
16
+ inherit initializer lazy let match method module mutable new
17
+ object of open private raise rec sig struct then to true try
18
+ type value val virtual when while with
19
+ )
20
+ end
21
+
22
+ def self.keyopts
23
+ @keyopts ||= Set.new %w(
24
+ != # & && ( ) * \+ , - -. -> . .. : :: := :> ; ;; < <- =
25
+ > >] >} ? ?? [ [< [> [| ] _ ` { {< | |] } ~
26
+ )
27
+ end
28
+
29
+ def self.word_operators
30
+ @word_operators ||= Set.new %w(and asr land lor lsl lxor mod or)
31
+ end
32
+
33
+ def self.primitives
34
+ @primitives ||= Set.new %w(unit int float bool string char list array)
35
+ end
36
+
37
+ operator = %r([\[\];,{}_()!$%&*+./:<=>?@^|~#-]+)
38
+ id = /[a-z][\w']*/i
39
+ upper_id = /[A-Z][\w']*/
40
+
41
+ state :root do
42
+ rule /\s+/m, Text
43
+ rule /false|true|[(][)]|\[\]/, Name::Builtin::Pseudo
44
+ rule /#{upper_id}(?=\s*[.])/, Name::Namespace, :dotted
45
+ rule upper_id, Name::Class
46
+ rule /[(][*](?![)])/, Comment, :comment
47
+ rule id do |m|
48
+ match = m[0]
49
+ if self.class.keywords.include? match
50
+ token Keyword
51
+ elsif self.class.word_operators.include? match
52
+ token Operator::Word
53
+ elsif self.class.primitives.include? match
54
+ token Keyword::Type
55
+ else
56
+ token Name
57
+ end
58
+ end
59
+
60
+ rule operator do |m|
61
+ match = m[0]
62
+ if self.class.keyopts.include? match
63
+ token Punctuation
64
+ else
65
+ token Operator
66
+ end
67
+ end
68
+
69
+ rule /-?\d[\d_]*(.[\d_]*)?(e[+-]?\d[\d_]*)/i, Num::Float
70
+ rule /0x\h[\h_]*/i, Num::Hex
71
+ rule /0o[0-7][0-7_]*/i, Num::Oct
72
+ rule /0b[01][01_]*/i, Num::Bin
73
+ rule /\d[\d_]*/, Num::Integer
74
+
75
+ rule /'(?:(\\[\\"'ntbr ])|(\\[0-9]{3})|(\\x\h{2}))'/, Str::Char
76
+ rule /'[.]'/, Str::Char
77
+ rule /'/, Keyword
78
+ rule /"/, Str::Double, :string
79
+ rule /[~?]#{id}/, Name::Variable
80
+ end
81
+
82
+ state :comment do
83
+ rule /[^(*)]+/, Comment
84
+ rule(/[(][*]/) { token Comment; push }
85
+ rule /[*][)]/, Comment, :pop!
86
+ rule /[(*)]/, Comment
87
+ end
88
+
89
+ state :string do
90
+ rule /[^\\"]+/, Str::Double
91
+ mixin :escape_sequence
92
+ rule /\\\n/, Str::Double
93
+ rule /"/, Str::Double, :pop!
94
+ end
95
+
96
+ state :escape_sequence do
97
+ rule /\\[\\"'ntbr]/, Str::Escape
98
+ rule /\\\d{3}/, Str::Escape
99
+ rule /\\x\h{2}/, Str::Escape
100
+ end
101
+
102
+ state :dotted do
103
+ rule /\s+/m, Text
104
+ rule /[.]/, Punctuation
105
+ rule /#{upper_id}(?=\s*[.])/, Name::Namespace
106
+ rule upper_id, Name::Class, :pop!
107
+ rule id, Name, :pop!
108
+ end
109
+ end
110
+ end
111
+ end