public
Created

gem install ruby_indentation

  • Download Gist
ruby_indentation.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
require 'coderay'
require 'set'
 
module RubyIndentation
VERSION = '0.2.0'
 
def self.[](buffer)
opening_and_modifier_tokens = %w[if unless until while].to_set
opening_tokens = %w[begin case class def for module do {].to_set
closing_tokens = %w[end }].to_set
separator = [';', :operator]
indent = 0
 
# parse each token
buffer_tokens = [separator] + CodeRay.scan(buffer, :ruby).each_slice(2).select{|_, kind|
kind != :space
}
 
buffer_tokens.each_cons(2){ |(*old_pair), (token, kind)|
if kind == :keyword || kind == :operator
# modifiers cause trouble, so
# fix it in 9/10 cases
if opening_tokens.include?(token) ||
opening_and_modifier_tokens.include?(token) &&
( old_pair == separator || old_pair == ['=', :operator ] )
indent += 1
elsif closing_tokens.include?(token)
indent -= 1
end
end
}
# return a good value
indent < 0 ? 0 : indent
end
end
 
# J-_-L

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.