Sha256: 7baf439a9dcb4308142fa959b9a41b5df562266670ceb2b45b33c4561a8bbe3e

Contents?: true

Size: 1.7 KB

Versions: 19

Compression:

Stored size: 1.7 KB

Contents

module Redcar
  class EditView

    class AlignAssignmentCommand < Redcar::DocumentCommand
      OPERATORS = /(\|{0,2}[+-\/%*!&]?={1,3}[>~]?)/
      RELEVANT_LINE_PATTERN = /^([^=]+?)#{OPERATORS}(.*$)/o
      
      def execute
        doc.expand_selection_to_full_lines
        doc.replace_selection(&AlignAssignmentCommand.method(:align))
      end
      
      def self.align(text)
        # get max left-hand and right-hand sides in 1 pass
        lengths = 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
        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

      def adjust_selection_to_full_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)
        
        doc.set_selection_range(start_offset, end_offset)
      end
    end
  end
end

Version data entries

19 entries across 19 versions & 2 rubygems

Version Path
redcar-0.13 plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.13.5dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.13.4dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.13.3dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.13.2dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.13.1dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-0.12.1 plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.13.0dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-0.12 plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.27dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.26dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.25dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.24dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.23dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.22dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.21dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.20dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.19dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb
redcar-dev-0.12.18dev plugins/edit_view/lib/edit_view/commands/align_assignment_command.rb