class Gherkin::GherkinLine
def empty?
def empty? @trimmed_line_text.empty? end
def get_line_text(indent_to_remove)
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
def get_rest_trimmed(length)
def get_rest_trimmed(length) @trimmed_line_text[length..-1].strip end
def initialize(line_text, line_number)
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
def split_table_cells(row)
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
def start_with?(prefix)
def start_with?(prefix) @trimmed_line_text.start_with?(prefix) end
def start_with_title_keyword?(keyword)
def start_with_title_keyword?(keyword) start_with?(keyword+':') # The C# impl is more complicated. Find out why. end
def table_cells
def table_cells cells = [] self.split_table_cells(@trimmed_line_text) do |item, column| txt_trimmed_left = item.gsub(/^[ \t\n\v\f\r\u0085\u00A0]*/, '') txt_trimmed = txt_trimmed_left.gsub(/[ \t\n\v\f\r\u0085\u00A0]*$/, '') cell_indent = item.length - txt_trimmed_left.length span = Span.new(@indent + column + cell_indent, txt_trimmed) cells.push(span) end cells end
def tags
def tags column = @indent + 1; items = @trimmed_line_text.strip.split('@') items = items[1..-1] # ignore before the first @ items.map do |item| length = item.length span = Span.new(column, '@' + item.strip) column += length + 1 span end end