Class: Gherkin::TokenMatcher

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

Constant Summary collapse

LANGUAGE_PATTERN =
/^\s*#\s*language\s*:\s*([a-zA-Z\-_]+)\s*$/

Instance Method Summary collapse

Constructor Details

#initialize(dialect_name = 'en') ⇒ TokenMatcher

Returns a new instance of TokenMatcher.



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

def initialize(dialect_name = 'en')
  @default_dialect_name = dialect_name
  change_dialect(dialect_name, nil)
  reset
end

Instance Method Details

#_match_DocStringSeparator(token, separator, is_open) ⇒ Object



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

def _match_DocStringSeparator(token, separator, is_open)
  return false unless token.line.start_with?(separator)

  content_type = nil
  if is_open
    content_type = token.line.get_rest_trimmed(separator.length)
    @active_doc_string_separator = separator
    @indent_to_remove = token.line.indent
  else
    @active_doc_string_separator = nil
    @indent_to_remove = 0
  end

  # TODO: Use the separator as keyword. That's needed for pretty printing.
  set_token_matched(token, :DocStringSeparator, content_type)
  true
end

#match_BackgroundLine(token) ⇒ Object



39
40
41
# File 'lib/gherkin/token_matcher.rb', line 39

def match_BackgroundLine(token)
  match_title_line(token, :BackgroundLine, @dialect.background_keywords)
end

#match_Comment(token) ⇒ Object



60
61
62
63
64
65
# File 'lib/gherkin/token_matcher.rb', line 60

def match_Comment(token)
  return false unless token.line.start_with?('#')
  text = token.line.get_line_text(0) #take the entire line, including leading space
  set_token_matched(token, :Comment, text, nil, 0)
  true
end

#match_DocStringSeparator(token) ⇒ Object



78
79
80
81
82
83
84
85
86
87
# File 'lib/gherkin/token_matcher.rb', line 78

def match_DocStringSeparator(token)
  if @active_doc_string_separator.nil?
    # open
    _match_DocStringSeparator(token, '"""', true) ||
    _match_DocStringSeparator(token, '```', true)
  else
    # close
    _match_DocStringSeparator(token, @active_doc_string_separator, false)
  end
end

#match_Empty(token) ⇒ Object



54
55
56
57
58
# File 'lib/gherkin/token_matcher.rb', line 54

def match_Empty(token)
  return false unless token.line.empty?
  set_token_matched(token, :Empty, nil, nil, 0)
  true
end

#match_EOF(token) ⇒ Object



107
108
109
110
111
# File 'lib/gherkin/token_matcher.rb', line 107

def match_EOF(token)
  return false unless token.eof?
  set_token_matched(token, :EOF)
  true
end

#match_ExamplesLine(token) ⇒ Object



43
44
45
# File 'lib/gherkin/token_matcher.rb', line 43

def match_ExamplesLine(token)
  match_title_line(token, :ExamplesLine, @dialect.examples_keywords)
end

#match_FeatureLine(token) ⇒ Object



27
28
29
# File 'lib/gherkin/token_matcher.rb', line 27

def match_FeatureLine(token)
  match_title_line(token, :FeatureLine, @dialect.feature_keywords)
end

#match_Language(token) ⇒ Object



67
68
69
70
71
72
73
74
75
76
# File 'lib/gherkin/token_matcher.rb', line 67

def match_Language(token)
  return false unless token.line.trimmed_line_text =~ LANGUAGE_PATTERN

  dialect_name = $1
  set_token_matched(token, :Language, dialect_name)

  change_dialect(dialect_name, token.location)

  true
end

#match_Other(token) ⇒ Object



113
114
115
116
117
# File 'lib/gherkin/token_matcher.rb', line 113

def match_Other(token)
  text = token.line.get_line_text(@indent_to_remove) # take the entire line, except removing DocString indents
  set_token_matched(token, :Other, unescape_docstring(text), nil, 0)
  true
end

#match_ScenarioLine(token) ⇒ Object



31
32
33
# File 'lib/gherkin/token_matcher.rb', line 31

def match_ScenarioLine(token)
  match_title_line(token, :ScenarioLine, @dialect.scenario_keywords)
end

#match_ScenarioOutlineLine(token) ⇒ Object



35
36
37
# File 'lib/gherkin/token_matcher.rb', line 35

def match_ScenarioOutlineLine(token)
  match_title_line(token, :ScenarioOutlineLine, @dialect.scenario_outline_keywords)
end

#match_StepLine(token) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/gherkin/token_matcher.rb', line 119

def match_StepLine(token)
  keywords = @dialect.given_keywords +
             @dialect.when_keywords +
             @dialect.then_keywords +
             @dialect.and_keywords +
             @dialect.but_keywords

  keyword = keywords.detect { |k| token.line.start_with?(k) }

  return false unless keyword

  title = token.line.get_rest_trimmed(keyword.length)
  set_token_matched(token, :StepLine, title, keyword)
  return true
end

#match_TableRow(token) ⇒ Object



47
48
49
50
51
52
# File 'lib/gherkin/token_matcher.rb', line 47

def match_TableRow(token)
  return false unless token.line.start_with?('|')
  # TODO: indent
  set_token_matched(token, :TableRow, nil, nil, nil, token.line.table_cells)
  true
end

#match_TagLine(token) ⇒ Object



20
21
22
23
24
25
# File 'lib/gherkin/token_matcher.rb', line 20

def match_TagLine(token)
  return false unless token.line.start_with?('@')

  set_token_matched(token, :TagLine, nil, nil, nil, token.line.tags)
  true
end

#resetObject



14
15
16
17
18
# File 'lib/gherkin/token_matcher.rb', line 14

def reset
  change_dialect(@default_dialect_name, nil) unless @dialect_name == @default_dialect_name
  @active_doc_string_separator = nil
  @indent_to_remove = 0
end