Class: Gherkin::GherkinLine

Inherits:
Object
  • Object
show all
Defined in:
lib/gherkin/gherkin_line.rb

Defined Under Namespace

Classes: Span

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(line_text, line_number) ⇒ GherkinLine

Returns a new instance of GherkinLine.



7
8
9
10
11
12
# File 'lib/gherkin/gherkin_line.rb', line 7

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

Instance Attribute Details

#indentObject (readonly)

Returns the value of attribute indent.



5
6
7
# File 'lib/gherkin/gherkin_line.rb', line 5

def indent
  @indent
end

#trimmed_line_textObject (readonly)

Returns the value of attribute trimmed_line_text.



5
6
7
# File 'lib/gherkin/gherkin_line.rb', line 5

def trimmed_line_text
  @trimmed_line_text
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/gherkin/gherkin_line.rb', line 26

def empty?
  @trimmed_line_text.empty?
end

#get_line_text(indent_to_remove) ⇒ Object



30
31
32
33
34
35
36
37
# File 'lib/gherkin/gherkin_line.rb', line 30

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) ⇒ Object



22
23
24
# File 'lib/gherkin/gherkin_line.rb', line 22

def get_rest_trimmed(length)
  @trimmed_line_text[length..-1].strip
end

#split_table_cells(row) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/gherkin/gherkin_line.rb', line 54

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) ⇒ Boolean

Returns:

  • (Boolean)


14
15
16
# File 'lib/gherkin/gherkin_line.rb', line 14

def start_with?(prefix)
  @trimmed_line_text.start_with?(prefix)
end

#start_with_title_keyword?(keyword) ⇒ Boolean

Returns:

  • (Boolean)


18
19
20
# File 'lib/gherkin/gherkin_line.rb', line 18

def start_with_title_keyword?(keyword)
  start_with?(keyword + ':') # The C# impl is more complicated. Find out why.
end

#table_cellsObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/gherkin/gherkin_line.rb', line 39

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

#tagsObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/gherkin/gherkin_line.rb', line 87

def tags
  uncommented_line = @trimmed_line_text.split(/\s#/,2)[0]
  column = @indent + 1
  items = uncommented_line.split('@')

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

    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
  end
  tags
end