module RubyIndentation

Constants

VERSION

Public Class Methods

[](buffer) click to toggle source
# File lib/ruby_indentation.rb, line 7
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