class Gherkin::GherkinLine

Attributes

indent[R]
trimmed_line_text[R]

Public Class Methods

new(line_text, line_number) click to toggle source
# File lib/gherkin/gherkin_line.rb, line 4
def initialize(line_text, line_number)
  @line_text = line_text
  @line_number = line_number
  @trimmed_line_text = @line_text.lstrip
  @indent = @line_text.length - @trimmed_line_text.length
end

Public Instance Methods

empty?() click to toggle source
# File lib/gherkin/gherkin_line.rb, line 23
def empty?
  @trimmed_line_text.empty?
end
get_line_text(indent_to_remove) click to toggle source
# File lib/gherkin/gherkin_line.rb, line 27
def get_line_text(indent_to_remove)
  indent_to_remove ||= 0
  if indent_to_remove < 0 || indent_to_remove > indent
    @trimmed_line_text
  else
    @line_text[indent_to_remove..-1]
  end
end
get_rest_trimmed(length) click to toggle source
# File lib/gherkin/gherkin_line.rb, line 19
def get_rest_trimmed(length)
  @trimmed_line_text[length..-1].strip
end
split_table_cells(row) { |cell, start_col| ... } click to toggle source
# File lib/gherkin/gherkin_line.rb, line 51
def split_table_cells(row)
  col = 0
  start_col = col + 1
  cell = ''
  first_cell = true
  while col < row.length
    char = row[col]
    col += 1
    if char == '|'
      if first_cell
        # First cell (content before the first |) is skipped
        first_cell = false
      else
        yield cell, start_col
      end
      cell = ''
      start_col = col + 1
    elsif char == '\\'
      char = row[col]
      col += 1
      if char == 'n'
        cell += "\n"
      else
        cell += '\\' unless ['|', '\\'].include?(char)
        cell += char
      end
    else
      cell += char
    end
  end
  # Last cell (content after the last |) is skipped
end
start_with?(prefix) click to toggle source
# File lib/gherkin/gherkin_line.rb, line 11
def start_with?(prefix)
  @trimmed_line_text.start_with?(prefix)
end
start_with_title_keyword?(keyword) click to toggle source
# File lib/gherkin/gherkin_line.rb, line 15
def start_with_title_keyword?(keyword)
  start_with?(keyword+':') # The C# impl is more complicated. Find out why.
end
table_cells() click to toggle source
# File lib/gherkin/gherkin_line.rb, line 36
def table_cells
  cells = []

  self.split_table_cells(@trimmed_line_text) do |item, column|
    # Keeps new lines
    txt_trimmed_left = item.sub(/\A[ \t\v\f\r\u0085\u00A0]*/, '')
    txt_trimmed = txt_trimmed_left.sub(/[ \t\v\f\r\u0085\u00A0]*\z/, '')
    cell_indent = item.length - txt_trimmed_left.length
    span = Span.new(@indent + column + cell_indent, txt_trimmed)
    cells.push(span)
  end

  cells
end
tags() click to toggle source
# File lib/gherkin/gherkin_line.rb, line 84
def tags
  uncommented_line = @trimmed_line_text.split(/\s#/,2)[0]
  column = @indent + 1
  items = uncommented_line.split('@')

  tags = []
  items.each { |untrimmed|
    item = untrimmed.strip
    if item.length == 0
      next
    end

    unless item =~ /^\S+$/
      location = { line: @line_number, column: column }
      raise ParserException.new('A tag may not contain whitespace', location)
    end

    tags << Span.new(column, '@' + item)
    column += untrimmed.length + 1
  }
  tags
end