class Parser::Lexer::Dedenter

Public Class Methods

new(dedent_level) click to toggle source
# File lib/parser/lexer/dedenter.rb, line 4
def initialize(dedent_level)
  @dedent_level = dedent_level
  @at_line_begin = true
  @indent_level  = 0
end

Public Instance Methods

dedent(string) click to toggle source
# File lib/parser/lexer/dedenter.rb, line 10
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
interrupt() click to toggle source
# File lib/parser/lexer/dedenter.rb, line 44
def interrupt
  @at_line_begin = false
end