rugments 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +52 -0
  3. data/README.md +195 -0
  4. data/bin/rugmentize +6 -0
  5. data/lib/rugments/cli.rb +357 -0
  6. data/lib/rugments/formatter.rb +29 -0
  7. data/lib/rugments/formatters/html.rb +142 -0
  8. data/lib/rugments/formatters/null.rb +17 -0
  9. data/lib/rugments/formatters/terminal256.rb +174 -0
  10. data/lib/rugments/lexer.rb +431 -0
  11. data/lib/rugments/lexers/apache/keywords.yml +453 -0
  12. data/lib/rugments/lexers/apache.rb +67 -0
  13. data/lib/rugments/lexers/apple_script.rb +366 -0
  14. data/lib/rugments/lexers/c.rb +210 -0
  15. data/lib/rugments/lexers/clojure.rb +109 -0
  16. data/lib/rugments/lexers/coffeescript.rb +172 -0
  17. data/lib/rugments/lexers/common_lisp.rb +343 -0
  18. data/lib/rugments/lexers/conf.rb +22 -0
  19. data/lib/rugments/lexers/cpp.rb +63 -0
  20. data/lib/rugments/lexers/csharp.rb +85 -0
  21. data/lib/rugments/lexers/css.rb +269 -0
  22. data/lib/rugments/lexers/dart.rb +102 -0
  23. data/lib/rugments/lexers/diff.rb +39 -0
  24. data/lib/rugments/lexers/elixir.rb +105 -0
  25. data/lib/rugments/lexers/erb.rb +54 -0
  26. data/lib/rugments/lexers/erlang.rb +116 -0
  27. data/lib/rugments/lexers/factor.rb +300 -0
  28. data/lib/rugments/lexers/gherkin/keywords.rb +13 -0
  29. data/lib/rugments/lexers/gherkin.rb +135 -0
  30. data/lib/rugments/lexers/go.rb +176 -0
  31. data/lib/rugments/lexers/groovy.rb +102 -0
  32. data/lib/rugments/lexers/haml.rb +226 -0
  33. data/lib/rugments/lexers/handlebars.rb +77 -0
  34. data/lib/rugments/lexers/haskell.rb +181 -0
  35. data/lib/rugments/lexers/html.rb +92 -0
  36. data/lib/rugments/lexers/http.rb +78 -0
  37. data/lib/rugments/lexers/ini.rb +55 -0
  38. data/lib/rugments/lexers/io.rb +66 -0
  39. data/lib/rugments/lexers/java.rb +74 -0
  40. data/lib/rugments/lexers/javascript.rb +258 -0
  41. data/lib/rugments/lexers/literate_coffeescript.rb +31 -0
  42. data/lib/rugments/lexers/literate_haskell.rb +34 -0
  43. data/lib/rugments/lexers/llvm.rb +82 -0
  44. data/lib/rugments/lexers/lua/builtins.rb +21 -0
  45. data/lib/rugments/lexers/lua.rb +120 -0
  46. data/lib/rugments/lexers/make.rb +114 -0
  47. data/lib/rugments/lexers/markdown.rb +151 -0
  48. data/lib/rugments/lexers/matlab/builtins.rb +10 -0
  49. data/lib/rugments/lexers/matlab.rb +70 -0
  50. data/lib/rugments/lexers/moonscript.rb +108 -0
  51. data/lib/rugments/lexers/nginx.rb +69 -0
  52. data/lib/rugments/lexers/nim.rb +149 -0
  53. data/lib/rugments/lexers/objective_c.rb +188 -0
  54. data/lib/rugments/lexers/ocaml.rb +109 -0
  55. data/lib/rugments/lexers/perl.rb +195 -0
  56. data/lib/rugments/lexers/php/builtins.rb +192 -0
  57. data/lib/rugments/lexers/php.rb +162 -0
  58. data/lib/rugments/lexers/plain_text.rb +23 -0
  59. data/lib/rugments/lexers/prolog.rb +62 -0
  60. data/lib/rugments/lexers/properties.rb +53 -0
  61. data/lib/rugments/lexers/puppet.rb +126 -0
  62. data/lib/rugments/lexers/python.rb +225 -0
  63. data/lib/rugments/lexers/qml.rb +70 -0
  64. data/lib/rugments/lexers/r.rb +55 -0
  65. data/lib/rugments/lexers/racket.rb +540 -0
  66. data/lib/rugments/lexers/ruby.rb +413 -0
  67. data/lib/rugments/lexers/rust.rb +188 -0
  68. data/lib/rugments/lexers/sass/common.rb +172 -0
  69. data/lib/rugments/lexers/sass.rb +72 -0
  70. data/lib/rugments/lexers/scala.rb +140 -0
  71. data/lib/rugments/lexers/scheme.rb +109 -0
  72. data/lib/rugments/lexers/scss.rb +32 -0
  73. data/lib/rugments/lexers/sed.rb +167 -0
  74. data/lib/rugments/lexers/shell.rb +150 -0
  75. data/lib/rugments/lexers/slim.rb +222 -0
  76. data/lib/rugments/lexers/smalltalk.rb +114 -0
  77. data/lib/rugments/lexers/sml.rb +345 -0
  78. data/lib/rugments/lexers/sql.rb +138 -0
  79. data/lib/rugments/lexers/swift.rb +153 -0
  80. data/lib/rugments/lexers/tcl.rb +189 -0
  81. data/lib/rugments/lexers/tex.rb +70 -0
  82. data/lib/rugments/lexers/toml.rb +68 -0
  83. data/lib/rugments/lexers/vb.rb +162 -0
  84. data/lib/rugments/lexers/viml/keywords.rb +11 -0
  85. data/lib/rugments/lexers/viml.rb +99 -0
  86. data/lib/rugments/lexers/xml.rb +57 -0
  87. data/lib/rugments/lexers/yaml.rb +362 -0
  88. data/lib/rugments/plugins/redcarpet.rb +28 -0
  89. data/lib/rugments/regex_lexer.rb +432 -0
  90. data/lib/rugments/template_lexer.rb +23 -0
  91. data/lib/rugments/text_analyzer.rb +46 -0
  92. data/lib/rugments/theme.rb +202 -0
  93. data/lib/rugments/themes/base16.rb +128 -0
  94. data/lib/rugments/themes/colorful.rb +65 -0
  95. data/lib/rugments/themes/github.rb +69 -0
  96. data/lib/rugments/themes/monokai.rb +88 -0
  97. data/lib/rugments/themes/monokai_sublime.rb +89 -0
  98. data/lib/rugments/themes/thankful_eyes.rb +69 -0
  99. data/lib/rugments/token.rb +180 -0
  100. data/lib/rugments/util.rb +99 -0
  101. data/lib/rugments/version.rb +3 -0
  102. data/lib/rugments.rb +33 -0
  103. metadata +149 -0
@@ -0,0 +1,150 @@
1
+ module Rugments
2
+ module Lexers
3
+ class Shell < RegexLexer
4
+ title 'shell'
5
+ desc 'Various shell languages, including sh and bash'
6
+
7
+ tag 'shell'
8
+ aliases 'bash', 'zsh', 'ksh', 'sh'
9
+ filenames '*.sh', '*.bash', '*.zsh', '*.ksh',
10
+ '.bashrc', '.zshrc', '.kshrc', '.profile', 'PKGBUILD'
11
+
12
+ mimetypes 'application/x-sh', 'application/x-shellscript'
13
+
14
+ def self.analyze_text(text)
15
+ text.shebang?(/(ba|z|k)?sh/) ? 1 : 0
16
+ end
17
+
18
+ KEYWORDS = %w(
19
+ if fi else while do done for then return function
20
+ select continue until esac elif in
21
+ ).join('|')
22
+
23
+ BUILTINS = %w(
24
+ alias bg bind break builtin caller cd command compgen
25
+ complete declare dirs disown echo enable eval exec exit
26
+ export false fc fg getopts hash help history jobs kill let
27
+ local logout popd printf pushd pwd read readonly set shift
28
+ shopt source suspend test time times trap true type typeset
29
+ ulimit umask unalias unset wait
30
+ ).join('|')
31
+
32
+ state :basic do
33
+ rule /#.*$/, Comment
34
+
35
+ rule /\b(#{KEYWORDS})\s*\b/, Keyword
36
+ rule /\bcase\b/, Keyword, :case
37
+
38
+ rule /\b(#{BUILTINS})\s*\b(?!\.)/, Name::Builtin
39
+
40
+ rule /^\S*[\$%>#] +/, Generic::Prompt
41
+
42
+ rule /(\b\w+)(=)/ do |_m|
43
+ groups Name::Variable, Operator
44
+ end
45
+
46
+ rule /[\[\]{}()=]/, Operator
47
+ rule /&&|\|\|/, Operator
48
+ # rule /\|\|/, Operator
49
+
50
+ rule /<<</, Operator # here-string
51
+ rule /<<-?\s*(\'?)\\?(\w+)\1/ do |m|
52
+ lsh = Str::Heredoc
53
+ token lsh
54
+ heredocstr = Regexp.escape(m[2])
55
+
56
+ push do
57
+ rule /\s*#{heredocstr}\s*\n/, lsh, :pop!
58
+ rule /.*?\n/, lsh
59
+ end
60
+ end
61
+ end
62
+
63
+ state :double_quotes do
64
+ # NB: "abc$" is literally the string abc$.
65
+ # Here we prevent :interp from interpreting $" as a variable.
66
+ rule /(?:\$#?)?"/, Str::Double, :pop!
67
+ mixin :interp
68
+ rule /[^"`\\$]+/, Str::Double
69
+ end
70
+
71
+ state :single_quotes do
72
+ rule /'/, Str::Single, :pop!
73
+ rule /[^']+/, Str::Single
74
+ end
75
+
76
+ state :data do
77
+ rule /\s+/, Text
78
+ rule /\\./, Str::Escape
79
+ rule /\$?"/, Str::Double, :double_quotes
80
+
81
+ # single quotes are much easier than double quotes - we can
82
+ # literally just scan until the next single quote.
83
+ # POSIX: Enclosing characters in single-quotes ( '' )
84
+ # shall preserve the literal value of each character within the
85
+ # single-quotes. A single-quote cannot occur within single-quotes.
86
+ rule /$?'/, Str::Single, :single_quotes
87
+
88
+ rule /\*/, Keyword
89
+
90
+ rule /;/, Text
91
+ rule /[^=\*\s{}()$"'`\\<]+/, Text
92
+ rule /\d+(?= |\Z)/, Num
93
+ rule /</, Text
94
+ mixin :interp
95
+ end
96
+
97
+ state :curly do
98
+ rule /}/, Keyword, :pop!
99
+ rule /:-/, Keyword
100
+ rule /[a-zA-Z0-9_]+/, Name::Variable
101
+ rule /[^}:"`'$]+/, Punctuation
102
+ mixin :root
103
+ end
104
+
105
+ state :paren do
106
+ rule /\)/, Keyword, :pop!
107
+ mixin :root
108
+ end
109
+
110
+ state :math do
111
+ rule /\)\)/, Keyword, :pop!
112
+ rule %r{[-+*/%^|&]|\*\*|\|\|}, Operator
113
+ rule /\d+/, Num
114
+ mixin :root
115
+ end
116
+
117
+ state :case do
118
+ rule /\besac\b/, Keyword, :pop!
119
+ rule /\|/, Punctuation
120
+ rule /\)/, Punctuation, :case_stanza
121
+ mixin :root
122
+ end
123
+
124
+ state :case_stanza do
125
+ rule /;;/, Punctuation, :pop!
126
+ mixin :root
127
+ end
128
+
129
+ state :backticks do
130
+ rule /`/, Str::Backtick, :pop!
131
+ mixin :root
132
+ end
133
+
134
+ state :interp do
135
+ rule /\\$/, Str::Escape # line continuation
136
+ rule /\\./, Str::Escape
137
+ rule /\$\(\(/, Keyword, :math
138
+ rule /\$\(/, Keyword, :paren
139
+ rule /\${#?/, Keyword, :curly
140
+ rule /`/, Str::Backtick, :backticks
141
+ rule /\$#?(\w+|.)/, Name::Variable
142
+ end
143
+
144
+ state :root do
145
+ mixin :basic
146
+ mixin :data
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,222 @@
1
+ module Rugments
2
+ module Lexers
3
+ # A lexer for the Slim tempalte language
4
+ # @see http://slim-lang.org
5
+ class Slim < RegexLexer
6
+ include Indentation
7
+
8
+ title 'Slim'
9
+ desc 'The Slim template language'
10
+
11
+ tag 'slim'
12
+
13
+ filenames '*.slim'
14
+
15
+ # Ruby identifier characters
16
+ ruby_chars = /[\w\!\?\@\$]/
17
+
18
+ # Since you are allowed to wrap lines with a backslash, include \\\n in characters
19
+ dot = /(\\\n|.)/
20
+
21
+ def self.analyze_text(text)
22
+ return 1 if text.start_with? 'doctype'
23
+ return 1 if text =~ /(\*)(\{.+?\})/ # Contans a hash splat
24
+ end
25
+
26
+ def ruby
27
+ @ruby ||= Ruby.new(options)
28
+ end
29
+
30
+ def html
31
+ @html ||= HTML.new(options)
32
+ end
33
+
34
+ def filters
35
+ @filters ||= {
36
+ 'ruby' => ruby,
37
+ 'erb' => ERB.new(options),
38
+ 'javascript' => Javascript.new(options),
39
+ 'css' => CSS.new(options),
40
+ 'coffee' => Coffeescript.new(options),
41
+ 'markdown' => Markdown.new(options),
42
+ 'scss' => Scss.new(options),
43
+ 'sass' => Sass.new(options)
44
+ }
45
+ end
46
+
47
+ state :root do
48
+ rule /\s*\n/, Text
49
+ rule(/\s*/) { |m| token Text; indentation(m[0]) }
50
+ end
51
+
52
+ state :content do
53
+ mixin :css
54
+
55
+ rule /\/#{dot}*/, Comment, :indented_block
56
+
57
+ rule /(doctype)(\s+)(.*)/ do
58
+ groups Name::Namespace, Text::Whitespace, Text
59
+ pop!
60
+ end
61
+
62
+ # filters, shamelessly ripped from HAML
63
+ rule /(\w*):\s*\n/ do |m|
64
+ token Name::Decorator
65
+ pop!
66
+ starts_block :filter_block
67
+
68
+ filter_name = m[1].strip
69
+
70
+ @filter_lexer = filters[filter_name]
71
+ @filter_lexer.reset! unless @filter_lexer.nil?
72
+
73
+ puts " slim: filter #{filter_name.inspect} #{@filter_lexer.inspect}" if @debug
74
+ end
75
+
76
+ # Text
77
+ rule %r{[\|'](?=\s)} do
78
+ token Punctuation
79
+ pop!
80
+ starts_block :plain_block
81
+ goto :plain_block
82
+ end
83
+
84
+ rule /-|==|=/, Punctuation, :ruby_line
85
+
86
+ # Dynamic tags
87
+ rule /(\*)(#{ruby_chars}+\(.*?\))/ do |m|
88
+ token Punctuation, m[1]
89
+ delegate ruby, m[2]
90
+ push :tag
91
+ end
92
+
93
+ rule /(\*)(#{ruby_chars}+)/ do |m|
94
+ token Punctuation, m[1]
95
+ delegate ruby, m[2]
96
+ push :tag
97
+ end
98
+
99
+ # rule /<\w+(?=.*>)/, Keyword::Constant, :tag # Maybe do this, look ahead and stuff
100
+ rule %r{(</?[\w\s\=\'\"]+?/?>)} do |m| # Dirty html
101
+ delegate html, m[1]
102
+ pop!
103
+ end
104
+
105
+ # Ordinary slim tags
106
+ rule /\w+/, Name::Tag, :tag
107
+ end
108
+
109
+ state :tag do
110
+ mixin :css
111
+ mixin :indented_block
112
+ mixin :interpolation
113
+
114
+ # Whitespace control
115
+ rule /[<>]/, Punctuation
116
+
117
+ # Trim whitespace
118
+ rule /\s+?/, Text::Whitespace
119
+
120
+ # Splats, these two might be mergable?
121
+ rule /(\*)(#{ruby_chars}+)/ do |m|
122
+ token Punctuation, m[1]
123
+ delegate ruby, m[2]
124
+ end
125
+
126
+ rule /(\*)(\{#{dot}+?\})/ do |m|
127
+ token Punctuation, m[1]
128
+ delegate ruby, m[2]
129
+ end
130
+
131
+ # Attributes
132
+ rule /([\w\-]+)(\s*)(\=)/ do |m|
133
+ token Name::Attribute, m[1]
134
+ token Text::Whitespace, m[2]
135
+ token Punctuation, m[3]
136
+ push :html_attr
137
+ end
138
+
139
+ # Ruby value
140
+ rule /(\=)(#{dot}+)/ do |m|
141
+ token Punctuation, m[1]
142
+ # token Keyword::Constant, m[2]
143
+ delegate ruby, m[2]
144
+ end
145
+
146
+ rule /#{dot}+?/, Text
147
+
148
+ rule /\s*\n/, Text::Whitespace, :pop!
149
+ end
150
+
151
+ state :css do
152
+ rule(/\.\w+/) { token Name::Class; goto :tag }
153
+ rule(/#\w+/) { token Name::Function; goto :tag }
154
+ end
155
+
156
+ state :html_attr do
157
+ # Strings, double/single quoted
158
+ rule %r{\s*(['"])#{dot}*\1}, Literal::String, :pop!
159
+
160
+ # Ruby stuff
161
+ rule(/(#{ruby_chars}+\(.*?\))/) { |m| delegate ruby, m[1]; pop! }
162
+ rule(/(#{ruby_chars}+)/) { |m| delegate ruby, m[1]; pop! }
163
+
164
+ rule /\s+/, Text::Whitespace
165
+ end
166
+
167
+ state :ruby_line do
168
+ # Need at top
169
+ mixin :indented_block
170
+
171
+ rule(/,\s*\n/) { delegate ruby }
172
+ rule /[ ]\|[ \t]*\n/, Str::Escape
173
+ rule(/.*?(?=(,$| \|)?[ \t]*$)/) { delegate ruby }
174
+ end
175
+
176
+ state :filter_block do
177
+ rule /([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do
178
+ if @filter_lexer
179
+ delegate @filter_lexer
180
+ else
181
+ token Name::Decorator
182
+ end
183
+ end
184
+
185
+ mixin :interpolation
186
+ mixin :indented_block
187
+ end
188
+
189
+ state :plain_block do
190
+ mixin :interpolation
191
+
192
+ rule %r{(</?[\w\s\=\'\"]+?/?>)} do |m| # Dirty html
193
+ delegate html, m[1]
194
+ end
195
+
196
+ # rule /([^#\n]|#[^{\n]|(\\\\)*\\#\{)+/ do
197
+ rule /#{dot}+?/, Text
198
+
199
+ mixin :indented_block
200
+ end
201
+
202
+ state :interpolation do
203
+ rule /#[{]/, Str::Interpol, :ruby_interp
204
+ end
205
+
206
+ state :ruby_interp do
207
+ rule /[}]/, Str::Interpol, :pop!
208
+ mixin :ruby_interp_inner
209
+ end
210
+
211
+ state :ruby_interp_inner do
212
+ rule(/[{]/) { delegate ruby; push :ruby_interp_inner }
213
+ rule(/[}]/) { delegate ruby; pop! }
214
+ rule(/[^{}]+/) { delegate ruby }
215
+ end
216
+
217
+ state :indented_block do
218
+ rule(/(?<!\\)\n/) { token Text; reset_stack }
219
+ end
220
+ end
221
+ end
222
+ end
@@ -0,0 +1,114 @@
1
+ module Rugments
2
+ module Lexers
3
+ class Smalltalk < RegexLexer
4
+ title 'Smalltalk'
5
+ desc 'The Smalltalk programming language'
6
+
7
+ tag 'smalltalk'
8
+ aliases 'st', 'squeak'
9
+ filenames '*.st'
10
+ mimetypes 'text/x-smalltalk'
11
+
12
+ ops = %r{[-+*/\\~<>=|&!?,@%]}
13
+
14
+ state :root do
15
+ rule /(<)(\w+:)(.*?)(>)/ do
16
+ groups Punctuation, Keyword, Text, Punctuation
17
+ end
18
+
19
+ # mixin :squeak_fileout
20
+ mixin :whitespaces
21
+ mixin :method_definition
22
+ rule /([|])([\w\s]*)([|])/ do
23
+ groups Punctuation, Name::Variable, Punctuation
24
+ end
25
+ mixin :objects
26
+ rule /\^|:=|_/, Operator
27
+
28
+ rule /[)}\]]/, Punctuation, :after_object
29
+ rule /[({\[!]/, Punctuation
30
+ end
31
+
32
+ state :method_definition do
33
+ rule /([a-z]\w*:)(\s*)(\w+)/i do
34
+ groups Name::Function, Text, Name::Variable
35
+ end
36
+
37
+ rule /^(\s*)(\b[a-z]\w*\b)(\s*)$/i do
38
+ groups Text, Name::Function, Text
39
+ end
40
+
41
+ rule %r{^(\s*)(#{ops}+)(\s*)(\w+)(\s*)$} do
42
+ groups Text, Name::Function, Text, Name::Variable, Text
43
+ end
44
+ end
45
+
46
+ state :block_variables do
47
+ mixin :whitespaces
48
+ rule /(:)(\s*)(\w+)/ do
49
+ groups Operator, Text, Name::Variable
50
+ end
51
+
52
+ rule /[|]/, Punctuation, :pop!
53
+
54
+ rule(//) { pop! }
55
+ end
56
+
57
+ state :literals do
58
+ rule /'(''|.)*?'/m, Str, :after_object
59
+ rule /[$]./, Str::Char, :after_object
60
+ rule /#[(]/, Str::Symbol, :parenth
61
+ rule /(\d+r)?-?\d+(\.\d+)?(e-?\d+)?/,
62
+ Num, :after_object
63
+ rule /#("[^"]*"|#{ops}+|[\w:]+)/,
64
+ Str::Symbol, :after_object
65
+ end
66
+
67
+ state :parenth do
68
+ rule /[)]/ do
69
+ token Str::Symbol
70
+ goto :after_object
71
+ end
72
+
73
+ mixin :inner_parenth
74
+ end
75
+
76
+ state :inner_parenth do
77
+ rule /#[(]/, Str::Symbol, :inner_parenth
78
+ rule /[)]/, Str::Symbol, :pop!
79
+ mixin :whitespaces
80
+ mixin :literals
81
+ rule /(#{ops}|[\w:])+/, Str::Symbol
82
+ end
83
+
84
+ state :whitespaces do
85
+ rule /! !$/, Keyword # squeak chunk delimiter
86
+ rule /\s+/m, Text
87
+ rule /".*?"/m, Comment
88
+ end
89
+
90
+ state :objects do
91
+ rule /\[/, Punctuation, :block_variables
92
+ rule /(self|super|true|false|nil|thisContext)\b/,
93
+ Name::Builtin::Pseudo, :after_object
94
+ rule /[A-Z]\w*(?!:)\b/, Name::Class, :after_object
95
+ rule /[a-z]\w*(?!:)\b/, Name::Variable, :after_object
96
+ mixin :literals
97
+ end
98
+
99
+ state :after_object do
100
+ mixin :whitespaces
101
+ rule /(ifTrue|ifFalse|whileTrue|whileFalse|timesRepeat):/,
102
+ Name::Builtin, :pop!
103
+ rule /new(?!:)\b/, Name::Builtin
104
+ rule /:=|_/, Operator, :pop!
105
+ rule /[a-z]+\w*:/i, Name::Function, :pop!
106
+ rule /[a-z]+\w*/i, Name::Function
107
+ rule /#{ops}+/, Name::Function, :pop!
108
+ rule /[.]/, Punctuation, :pop!
109
+ rule /;/, Punctuation
110
+ rule(//) { pop! }
111
+ end
112
+ end
113
+ end
114
+ end