Sha256: 7e3a417b833c97eba62ef079e24da7694625797dd05742c2f2be4154cf3edeaa

Contents?: true

Size: 1.8 KB

Versions: 28

Compression:

Stored size: 1.8 KB

Contents

module Redcar
  class EditView

    class AlignAssignmentCommand < Redcar::DocumentCommand
      def execute
        operators = /(\|{0,2}[+-\/%*!]?={1,3}[>~]?)/
        relevant_line_pattern = /^([^=]+?)#{operators}(.*$)/o

        #fix the selection. this command operates on whole lines
        start_offset, end_offset = offsets_for_whole_lines(doc.cursor_offset, doc.selection_offset)

        doc.set_selection_range(start_offset, end_offset)

        doc.replace_selection do |old_text|

          #get max left-hand and right-hand sides in 1 pass
          lengths = old_text.lines.map do |line|
            [line =~ operators || -1, $1 && $1.size || -1]
          end
          lhs_len = lengths.reduce(0){|memo, len| len.first > memo ? len.first : memo}
          rhs_len = lengths.reduce(0){|memo, len| len.last > memo ? len.last : memo}

          #now replace the first token of the relevant lines
          old_text.lines.map do |line|
            line.chomp!
            if line =~ relevant_line_pattern
              "%-#{lhs_len}s%#{rhs_len}s %s" % [$1, $2, $3.strip]
            else
              line
            end
          end.join("\n")
        end
      end

      def offsets_for_whole_lines(start_offset, end_offset)
        #are the selections in the right order?
        if start_offset > end_offset
          end_offset, start_offset = start_offset, end_offset
        end

        start_index = doc.line_at_offset(start_offset)
        end_index = doc.line_at_offset(end_offset)

        #is the selection of the last line empty?
        if end_offset == doc.offset_at_line(end_index)
          end_index -= 1
        end

        start_offset = doc.offset_at_line(start_index)
        end_offset = doc.offset_at_inner_end_of_line(end_index)
        return [start_offset, end_offset]
      end
    end
  end
end

Version data entries

28 entries across 28 versions & 2 rubygems

Version Path
redcar-dev-0.12.17dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.16dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.15dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.14dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.13dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.12dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.11dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.10dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.9dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.8dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.7dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.6dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.4dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.3dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.1dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.0dev-java plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-0.11 plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-0.11.0dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-0.10 plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-0.9.2 plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb