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,72 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class TeX < RegexLexer
6
+ title "TeX"
7
+ desc "The TeX typesetting system"
8
+ tag 'tex'
9
+ aliases 'TeX', 'LaTeX', 'latex'
10
+
11
+ filenames '*.tex', '*.aux', '*.toc'
12
+ mimetypes 'text/x-tex', 'text/x-latex'
13
+
14
+ def self.analyze_text(text)
15
+ return 1 if text =~ /\A\s*\\documentclass/
16
+ return 1 if text =~ /\A\s*\\input/
17
+ return 1 if text =~ /\A\s*\\documentstyle/
18
+ return 1 if text =~ /\A\s*\\relax/
19
+ end
20
+
21
+ command = /\\([a-z]+|\s+|.)/i
22
+
23
+ state :general do
24
+ rule /%.*$/, Comment
25
+ rule /[{}&_^]/, Punctuation
26
+ end
27
+
28
+ state :root do
29
+ rule /\\\[/, Punctuation, :displaymath
30
+ rule /\\\(/, Punctuation, :inlinemath
31
+ rule /\$\$/, Punctuation, :displaymath
32
+ rule /\$/, Punctuation, :inlinemath
33
+ rule /\\(begin|end)\{.*?\}/, Name::Tag
34
+
35
+ rule /(\\verb)\b(\S)(.*?)(\2)/ do |m|
36
+ groups Name::Builtin, Keyword::Pseudo, Str::Other, Keyword::Pseudo
37
+ end
38
+
39
+ rule command, Keyword, :command
40
+ mixin :general
41
+ rule /[^\\$%&_^{}]+/, Text
42
+ end
43
+
44
+ state :math do
45
+ rule command, Name::Variable
46
+ mixin :general
47
+ rule /[0-9]+/, Num
48
+ rule /[-=!+*\/()\[\]]/, Operator
49
+ rule /[^=!+*\/()\[\]\\$%&_^{}0-9-]+/, Name::Builtin
50
+ end
51
+
52
+ state :inlinemath do
53
+ rule /\\\)/, Punctuation, :pop!
54
+ rule /\$/, Punctuation, :pop!
55
+ mixin :math
56
+ end
57
+
58
+ state :displaymath do
59
+ rule /\\\]/, Punctuation, :pop!
60
+ rule /\$\$/, Punctuation, :pop!
61
+ rule /\$/, Name::Builtin
62
+ mixin :math
63
+ end
64
+
65
+ state :command do
66
+ rule /\[.*?\]/, Name::Attribute
67
+ rule /\*/, Keyword
68
+ rule(//) { pop! }
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,71 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class TOML < RegexLexer
6
+ title "TOML"
7
+ desc 'the TOML configuration format (https://github.com/mojombo/toml)'
8
+ tag 'toml'
9
+
10
+ filenames '*.toml'
11
+ mimetypes 'text/x-toml'
12
+
13
+ def self.analyze_text(text)
14
+ return 0.1 if text =~ /\A\[[\w.]+\]\s*\w+\s*=\s*("\w+")+/
15
+ end
16
+
17
+ identifier = /[\w.\S]+/
18
+
19
+ state :basic do
20
+ rule /\s+/, Text
21
+ rule /#.*?$/, Comment
22
+ rule /(true|false)/, Keyword::Constant
23
+ rule /(?<!=)\s*\[[\w\d\S]+\]/, Name::Namespace
24
+
25
+ rule /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z/, Literal::Date
26
+
27
+ rule /(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?/, Num::Float
28
+ rule /\d+[eE][+-]?[0-9]+j?/, Num::Float
29
+ rule /\-?\d+/, Num::Integer
30
+ end
31
+
32
+ state :root do
33
+ mixin :basic
34
+
35
+ rule /(#{identifier})(\s*)(=)/ do
36
+ groups Name::Property, Text, Punctuation
37
+ push :value
38
+ end
39
+
40
+ end
41
+
42
+ state :value do
43
+ rule /\n/, Text, :pop!
44
+ mixin :content
45
+ end
46
+
47
+ state :content do
48
+ mixin :basic
49
+ rule /"/, Str, :dq
50
+ mixin :esc_str
51
+ rule /\,/, Punctuation
52
+ rule /\[/, Punctuation, :array
53
+ end
54
+
55
+ state :dq do
56
+ rule /"/, Str, :pop!
57
+ mixin :esc_str
58
+ rule /[^\\"]+/, Str
59
+ end
60
+
61
+ state :esc_str do
62
+ rule /\\[0t\tn\n "\\ r]/, Str::Escape
63
+ end
64
+
65
+ state :array do
66
+ mixin :content
67
+ rule /\]/, Punctuation, :pop!
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,75 @@
1
+ module Rouge
2
+ module Lexers
3
+ class Tulip < RegexLexer
4
+ tag 'tulip'
5
+ aliases 'tlp'
6
+ filenames '*.tlp'
7
+ desc 'The tulip programming language http://github.com/jneen/tulip'
8
+
9
+ id = /\w[\w-]*/
10
+
11
+ def self.analyze_text(text)
12
+ return 1 if text.shebang?('tulip')
13
+ end
14
+
15
+ state :root do
16
+ rule /\s+/, Text
17
+ rule /#.*?\n/, Comment
18
+ rule /%#{id}/, Keyword::Type
19
+ rule /@#{id}/, Keyword
20
+ rule /[.][.]?#{id}/, Name::Label
21
+ rule /-#{id}[?]?/, Str::Symbol
22
+ rule /\d+/, Num
23
+ rule %r(/#{id}?), Name::Decorator
24
+ rule %r((#{id}/)(#{id})) do
25
+ groups Name::Namespace, Name::Variable
26
+ end
27
+
28
+ rule /"{/, Str, :string_interp
29
+ rule /'?{/, Str, :string
30
+ rule /['"][^\s)\]]+/, Str
31
+
32
+ rule /[$]/, Name::Variable
33
+
34
+ rule /[-+:;~!()\[\]=?>|_%,]/, Punctuation
35
+ rule /[.][.][.]/, Punctuation
36
+ rule id, Name
37
+ end
38
+
39
+ state :string_base do
40
+ rule /{/ do
41
+ token Str; push
42
+ end
43
+
44
+ rule /}/, Str, :pop!
45
+ rule /[$]/, Str
46
+ rule /[^${}\\]+/, Str
47
+ end
48
+
49
+ state :string do
50
+ mixin :string_base
51
+ rule /\\/, Str
52
+ end
53
+
54
+ state :interp do
55
+ rule(/[(]/) { token Punctuation; push }
56
+ rule /[)]/, Punctuation, :pop!
57
+ mixin :root
58
+ end
59
+
60
+ state :interp_root do
61
+ rule /[(]/, Str::Interpol, :interp
62
+ rule /[)]/, Str::Interpol, :pop!
63
+ mixin :root
64
+ end
65
+
66
+ state :string_interp do
67
+ rule /\\./, Str::Escape
68
+ rule /[$][(]/, Str::Interpol, :interp_root
69
+ rule /[$]#{id}?/, Name::Variable
70
+ mixin :string_base
71
+ end
72
+ end
73
+ end
74
+ end
75
+
@@ -0,0 +1,164 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class VisualBasic < RegexLexer
6
+ title "Visual Basic"
7
+ desc "Visual Basic"
8
+ tag 'vb'
9
+ aliases 'visualbasic'
10
+ filenames '*.vbs'
11
+ mimetypes 'text/x-visualbasic', 'application/x-visualbasic'
12
+
13
+ def self.keywords
14
+ @keywords ||= Set.new %w(
15
+ AddHandler Alias ByRef ByVal CBool CByte CChar CDate CDbl CDec
16
+ CInt CLng CObj CSByte CShort CSng CStr CType CUInt CULng CUShort
17
+ Call Case Catch Class Const Continue Declare Default Delegate
18
+ Dim DirectCast Do Each Else ElseIf End EndIf Enum Erase Error
19
+ Event Exit False Finally For Friend Function Get Global GoSub
20
+ GoTo Handles If Implements Imports Inherits Interface Let
21
+ Lib Loop Me Module MustInherit MustOverride MyBase MyClass
22
+ Namespace Narrowing New Next Not NotInheritable NotOverridable
23
+ Nothing Of On Operator Option Optional Overloads Overridable
24
+ Overrides ParamArray Partial Private Property Protected Public
25
+ RaiseEvent ReDim ReadOnly RemoveHandler Resume Return Select Set
26
+ Shadows Shared Single Static Step Stop Structure Sub SyncLock
27
+ Then Throw To True Try TryCast Using Wend When While Widening
28
+ With WithEvents WriteOnly
29
+ )
30
+ end
31
+
32
+ def self.keywords_type
33
+ @keywords_type ||= Set.new %w(
34
+ Boolean Byte Char Date Decimal Double Integer Long Object
35
+ SByte Short Single String Variant UInteger ULong UShort
36
+ )
37
+ end
38
+
39
+ def self.operator_words
40
+ @operator_words ||= Set.new %w(
41
+ AddressOf And AndAlso As GetType In Is IsNot Like Mod Or OrElse
42
+ TypeOf Xor
43
+ )
44
+ end
45
+
46
+ def self.builtins
47
+ @builtins ||= Set.new %w(
48
+ Console ConsoleColor
49
+ )
50
+ end
51
+
52
+ id = /[a-z_]\w*/i
53
+ upper_id = /[A-Z]\w*/
54
+
55
+ state :whitespace do
56
+ rule /\s+/, Text
57
+ rule /\n/, Text, :bol
58
+ rule /rem\b.*?$/i, Comment::Single
59
+ rule %r(%\{.*?%\})m, Comment::Multiline
60
+ rule /'.*$/, Comment::Single
61
+ end
62
+
63
+ state :bol do
64
+ rule /\s+/, Text
65
+ rule /<.*?>/, Name::Attribute
66
+ rule(//) { :pop! }
67
+ end
68
+
69
+ state :root do
70
+ mixin :whitespace
71
+ rule %r(
72
+ [#]If\b .*? \bThen
73
+ | [#]ElseIf\b .*? \bThen
74
+ | [#]End \s+ If
75
+ | [#]Const
76
+ | [#]ExternalSource .*? \n
77
+ | [#]End \s+ ExternalSource
78
+ | [#]Region .*? \n
79
+ | [#]End \s+ Region
80
+ | [#]ExternalChecksum
81
+ )x, Comment::Preproc
82
+ rule /[.]/, Punctuation, :dotted
83
+ rule /[(){}!#,:]/, Punctuation
84
+ rule /Option\s+(Strict|Explicit|Compare)\s+(On|Off|Binary|Text)/,
85
+ Keyword::Declaration
86
+ rule /End\b/, Keyword, :end
87
+ rule /(Dim|Const)\b/, Keyword, :dim
88
+ rule /(Function|Sub|Property)\b/, Keyword, :funcname
89
+ rule /(Class|Structure|Enum)\b/, Keyword, :classname
90
+ rule /(Module|Namespace|Imports)\b/, Keyword, :namespace
91
+
92
+ rule upper_id do |m|
93
+ match = m[0]
94
+ if self.class.keywords.include? match
95
+ token Keyword
96
+ elsif self.class.keywords_type.include? match
97
+ token Keyword::Type
98
+ elsif self.class.operator_words.include? match
99
+ token Operator::Word
100
+ elsif self.class.builtins.include? match
101
+ token Name::Builtin
102
+ else
103
+ token Name
104
+ end
105
+ end
106
+
107
+ rule(
108
+ %r(&=|[*]=|/=|\\=|\^=|\+=|-=|<<=|>>=|<<|>>|:=|<=|>=|<>|[-&*/\\^+=<>.]),
109
+ Operator
110
+ )
111
+
112
+ rule /"/, Str, :string
113
+ rule /#{id}[%&@!#\$]?/, Name
114
+ rule /#.*?#/, Literal::Date
115
+
116
+ rule /(\d+\.\d*|\d*\.\d+)(f[+-]?\d+)?/i, Num::Float
117
+ rule /\d+([SILDFR]|US|UI|UL)?/, Num::Integer
118
+ rule /&H[0-9a-f]+([SILDFR]|US|UI|UL)?/, Num::Integer
119
+ rule /&O[0-7]+([SILDFR]|US|UI|UL)?/, Num::Integer
120
+
121
+ rule /_\n/, Keyword
122
+ end
123
+
124
+ state :dotted do
125
+ mixin :whitespace
126
+ rule id, Name, :pop!
127
+ end
128
+
129
+ state :string do
130
+ rule /""/, Str::Escape
131
+ rule /"C?/, Str, :pop!
132
+ rule /[^"]+/, Str
133
+ end
134
+
135
+ state :dim do
136
+ mixin :whitespace
137
+ rule id, Name::Variable, :pop!
138
+ rule(//) { pop! }
139
+ end
140
+
141
+ state :funcname do
142
+ mixin :whitespace
143
+ rule id, Name::Function, :pop!
144
+ end
145
+
146
+ state :classname do
147
+ mixin :whitespace
148
+ rule id, Name::Class, :pop!
149
+ end
150
+
151
+ state :namespace do
152
+ mixin :whitespace
153
+ rule /#{id}([.]#{id})*/, Name::Namespace, :pop!
154
+ end
155
+
156
+ state :end do
157
+ mixin :whitespace
158
+ rule /(Function|Sub|Property|Class|Structure|Enum|Module|Namespace)\b/,
159
+ Keyword, :pop!
160
+ rule(//) { pop! }
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,101 @@
1
+ # -*- coding: utf-8 -*- #
2
+
3
+ module Rouge
4
+ module Lexers
5
+ class VimL < RegexLexer
6
+ title "VimL"
7
+ desc "VimL, the scripting language for the Vim editor (vim.org)"
8
+ tag 'viml'
9
+ aliases 'vim', 'vimscript', 'ex'
10
+ filenames '*.vim', '*.vba', '.vimrc', '.exrc', '.gvimrc',
11
+ '_vimrc', '_exrc', '_gvimrc' # _ names for windows
12
+
13
+ mimetypes 'text/x-vim'
14
+
15
+ def self.keywords
16
+ load Pathname.new(__FILE__).dirname.join('viml/keywords.rb')
17
+ self.keywords
18
+ end
19
+
20
+ state :root do
21
+ rule /^(\s*)(".*?)$/ do
22
+ groups Text, Comment
23
+ end
24
+
25
+ rule /^\s*\\/, Str::Escape
26
+
27
+ rule /[ \t]+/, Text
28
+
29
+ # TODO: regexes can have other delimiters
30
+ rule %r(/(\\\\|\\/|[^\n/])*/), Str::Regex
31
+ rule %r("(\\\\|\\"|[^\n"])*"), Str::Double
32
+ rule %r('(\\\\|\\'|[^\n'])*'), Str::Single
33
+
34
+ # if it's not a string, it's a comment.
35
+ rule /(?<=\s)"[^-:.%#=*].*?$/, Comment
36
+
37
+ rule /-?\d+/, Num
38
+ rule /#[0-9a-f]{6}/i, Num::Hex
39
+ rule /^:/, Punctuation
40
+ rule /[():<>+=!\[\]{}\|,~.-]/, Punctuation
41
+ rule /\b(let|if|else|endif|elseif|fun|function|endfunction)\b/,
42
+ Keyword
43
+
44
+ rule /\b(NONE|bold|italic|underline|dark|light)\b/, Name::Builtin
45
+
46
+ rule /[absg]:\w+\b/, Name::Variable
47
+ rule /\b\w+\b/ do |m|
48
+ name = m[0]
49
+ keywords = self.class.keywords
50
+
51
+ if mapping_contains?(keywords[:command], name)
52
+ token Keyword
53
+ elsif mapping_contains?(keywords[:option], name)
54
+ token Name::Builtin
55
+ elsif mapping_contains?(keywords[:auto], name)
56
+ token Name::Builtin
57
+ else
58
+ token Text
59
+ end
60
+ end
61
+
62
+ # no errors in VimL!
63
+ rule /./m, Text
64
+ end
65
+
66
+ def mapping_contains?(mapping, word)
67
+ shortest, longest = find_likely_mapping(mapping, word)
68
+
69
+ shortest and word.start_with?(shortest) and
70
+ longest and longest.start_with?(word)
71
+ end
72
+
73
+ # binary search through the mappings to find the one that's likely
74
+ # to actually work.
75
+ def find_likely_mapping(mapping, word)
76
+ min = 0
77
+ max = mapping.size
78
+
79
+ until max == min
80
+ mid = (max + min) / 2
81
+
82
+ cmp, _ = mapping[mid]
83
+
84
+ case word <=> cmp
85
+ when 1
86
+ # too low
87
+ min = mid + 1
88
+ when -1
89
+ # too high
90
+ max = mid
91
+ when 0
92
+ # just right, abort!
93
+ return mapping[mid]
94
+ end
95
+ end
96
+
97
+ mapping[max - 1]
98
+ end
99
+ end
100
+ end
101
+ end