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.



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

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.



3
4
5
# File 'lib/gherkin/gherkin_line.rb', line 3

def indent
  @indent
end

#trimmed_line_textObject (readonly)

Returns the value of attribute trimmed_line_text.



3
4
5
# File 'lib/gherkin/gherkin_line.rb', line 3

def trimmed_line_text
  @trimmed_line_text
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/gherkin/gherkin_line.rb', line 24

def empty?
  @trimmed_line_text.empty?
end

#get_line_text(indent_to_remove) ⇒ Object



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

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



20
21
22
# File 'lib/gherkin/gherkin_line.rb', line 20

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

#split_table_cells(row) ⇒ Object



52
53
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
# File 'lib/gherkin/gherkin_line.rb', line 52

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)


12
13
14
# File 'lib/gherkin/gherkin_line.rb', line 12

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

#start_with_title_keyword?(keyword) ⇒ Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/gherkin/gherkin_line.rb', line 16

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

#table_cellsObject



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

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



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

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