Sha256: b40559c6c50ed52d522a6840c05dbd896fc37b7ba7751a9bfc88d3be8653d36f

Contents?: true

Size: 1.16 KB

Versions: 5

Compression:

Stored size: 1.16 KB

Contents

# frozen_string_literal: true

module Parser

  class Lexer::Dedenter
    def initialize(dedent_level)
      @dedent_level = dedent_level
      @at_line_begin = true
      @indent_level  = 0
    end

    def dedent(string)
      space_begin = space_end = offset = 0
      last_index  = string.length - 1
      string.chars.each_with_index do |char, index|
        if @at_line_begin
          if char == ?\n || @indent_level >= @dedent_level
            string.slice!(space_begin...space_end)
            offset += space_end - space_begin - 1
            @at_line_begin = false
            redo if char == ?\n
          end

          case char
          when ?\s
            @indent_level += 1
            space_end += 1
          when ?\t
            @indent_level += 8 - @indent_level % 8
            space_end += 1
          end
        elsif char == ?\n && index == last_index
          @at_line_begin = true
          @indent_level  = 0
          space_begin = space_end = index - offset + 1
        end
      end

      if @at_line_begin
        string.slice!(space_begin..space_end)
      end

      nil
    end

    def interrupt
      @at_line_begin = false
    end
  end

end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
parser-2.5.0.5 lib/parser/lexer/dedenter.rb
parser-2.5.0.3 lib/parser/lexer/dedenter.rb
parser-2.5.0.2 lib/parser/lexer/dedenter.rb
parser-2.5.0.1 lib/parser/lexer/dedenter.rb
parser-2.5.0.0 lib/parser/lexer/dedenter.rb