class Aio::Text::Context

Attributes

backup_line[R]
count_line[R]

Public Class Methods

new(*arr) click to toggle source
Calls superclass method
# File lib/aio/core/text/context.rb, line 12
def initialize(*arr)
  super
  self.each_with_index do |str, i|
    self[i] = Aio::Text::LineString.new(str.chomp)
  end
  @backup_line = nil
  @count_line = 0
end

Public Instance Methods

method_missing(mid, *arg, &block) click to toggle source
Calls superclass method
# File lib/aio/core/text/context.rb, line 204
def method_missing(mid, *arg, &block)
  print_error "#{mid} 方法未定义,请检查方法名拼写"
  puts caller[0]
  super
end
next() click to toggle source

到下一行

# File lib/aio/core/text/context.rb, line 22
def next
  @count_line += 1
end
readline_match_block(reg, single = false, &block) click to toggle source

对每行进行read, 判断是单步运行还是循环运行 修改了此处的backup_line 逻辑

# File lib/aio/core/text/context.rb, line 28
def readline_match_block(reg, single = false, &block)

  reg = Aio::Base::Toolkit::Regexp.safe(reg)

  first = true
  loop do 
    line_str = self[@count_line]

    if first
      @backup_line = @count_line
    end

    # 如果出界,有可能是因为循环导致
    # 跳出循环
    # 此处有问题,无法判断是否为最后一个,并跳出此模块
    if @backup_line > self.size and line_str.nil?
      @count_line = @backup_line
      if Aio::Base::Debug.mismatch?
        puts "[-] Can't match this line: "
        puts caller
        puts "  line_string: #{self[@backup_line]}"
        puts "  regexp: #{reg}"
      end
      raise OutLineError
    end

    if line_str.nil?
      @count_line = @backup_line
      break
    end

    first = false
    begin
      res = line_str.match_block(reg, self, @count_line) do |b|
        block.call(b) unless block.nil?
      end
    rescue IndexError => e
      print_error "IndexError: 请检查模块block提取信息名称"
      puts "caller"
      puts caller
      exit
    rescue NoMethodError
      if Aio::Base::Debug.module_debug?
        print_error "NoMethodError: 请检查模块block中useful是否定义正确"
        puts caller
      end
      exit
    rescue ArgumentError => e
      if Aio::Base::Debug.module_debug?
        puts "ArgumentError:"
        puts e.message
        puts caller
      end
    end

    @count_line += 1

    # 如果匹配到,跳出循环
    break if res

    # 如果只是单步运行,就返回
    break if single
  end
end
readline_match_block_loop(start, stop, &block) click to toggle source

单行循环 stop 为停止出,在停止处之前的每一行都将输出

# File lib/aio/core/text/context.rb, line 95
def readline_match_block_loop(start, stop, &block)
  stop = Aio::Base::Toolkit::Regexp.safe(stop)
  loop do 
    readline_match_block(start, true, &block)
    break if stop.match(self[@count_line])
    break if self[@count_line].nil?
  end
end
readline_range(start, stop, opt={:last=>false}, &block) click to toggle source

读取一个区间,并返回块 只会执行一次 stop 作为分裂符 opt 当last为false时,不会对stop一行输出 opt 当before为true时,只会分裂stop的前一行,count_line保留

# File lib/aio/core/text/context.rb, line 109
def readline_range(start, stop, opt={:last=>false}, &block)
  str_context = Context.new
  start = Aio::Base::Toolkit::Regexp.safe(start)
  stop = Aio::Base::Toolkit::Regexp.safe(stop)
  backup_line = @count_line

  loop do 
    line_str = self[@count_line]

    if line_str.nil?
      @count_line = backup_line
      raise OutLineError
    end

    if start =~ line_str
      str_context << line_str
      @count_line += 1
      break
    end
    @count_line += 1
  end

  loop do 
    line_str = self[@count_line]
    #raise OutLineError if line_str.nil?
    if stop =~ line_str or line_str.nil?
      str_context << line_str if opt[:last]
      @count_line += 1 unless opt[:before]
      break
    else
      str_context << line_str
    end
    @count_line += 1
  end

  block.call(str_context)
end
readline_range_if(start, condition, &block) click to toggle source

读取一个区间并返回块 在起始位置之后的行中,满足条件, 则放入同一区间。否则返回

# File lib/aio/core/text/context.rb, line 161
def readline_range_if(start, condition, &block)
  str_context = Context.new
  start = Aio::Base::Toolkit::Regexp.safe(start)
  condition = Aio::Base::Toolkit::Regexp.safe(condition)

  loop do
    line_str = self[@count_line]
    raise OutLineError if line_str.nil?
    if start =~ line_str
      str_context << line_str
      @count_line += 1
      break
    end
    @count_line += 1
  end

  loop do
    line_str = self[@count_line]
    if condition =~ line_str
      str_context << line_str
      @count_line += 1
    else
      break
    end
  end

  block.call(str_context)
end
readline_range_if_loop(start, condition, &block) click to toggle source
# File lib/aio/core/text/context.rb, line 190
def readline_range_if_loop(start, condition, &block)
  loop do
    begin
      readline_range_if(start, condition, &block)
    rescue OutLineError
      break
    end
  end
end
readline_range_loop(start, stop, opt={:last=>false}, &block) click to toggle source

当需要多次循环时使用 此方法用于循环更加安全

# File lib/aio/core/text/context.rb, line 149
def readline_range_loop(start, stop, opt={:last=>false}, &block)
  loop do 
    begin
      readline_range(start, stop, opt, &block)
    rescue OutLineError
      break
    end
  end
end