class Gherkin::TokenMatcher

Constants

LANGUAGE_PATTERN

Public Class Methods

new(dialect_name = 'en') click to toggle source
# 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

Public Instance Methods

_match_DocStringSeparator(token, separator, is_open) click to toggle source
# File lib/gherkin/token_matcher.rb, line 90
def _match_DocStringSeparator(token, separator, is_open)
  return false unless token.line.start_with?(separator)

  media_type = nil
  if is_open
    media_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

  set_token_matched(token, :DocStringSeparator, media_type, separator)
  true
end
match_BackgroundLine(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 40
def match_BackgroundLine(token)
  match_title_line(token, :BackgroundLine, @dialect.background_keywords)
end
match_Comment(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 61
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) click to toggle source
# File lib/gherkin/token_matcher.rb, line 79
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_EOF(token) click to toggle source
# 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_Empty(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 55
def match_Empty(token)
  return false unless token.line.empty?
  set_token_matched(token, :Empty, nil, nil, 0)
  true
end
match_ExamplesLine(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 44
def match_ExamplesLine(token)
  match_title_line(token, :ExamplesLine, @dialect.examples_keywords)
end
match_FeatureLine(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 27
def match_FeatureLine(token)
  match_title_line(token, :FeatureLine, @dialect.feature_keywords)
end
match_Language(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 68
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) click to toggle source
# 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_RuleLine(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 31
def match_RuleLine(token)
  match_title_line(token, :RuleLine, @dialect.rule_keywords)
end
match_ScenarioLine(token) click to toggle source
# File lib/gherkin/token_matcher.rb, line 35
def match_ScenarioLine(token)
  match_title_line(token, :ScenarioLine, @dialect.scenario_keywords) ||
      match_title_line(token, :ScenarioLine, @dialect.scenario_outline_keywords)
end
match_StepLine(token) click to toggle source
# 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) click to toggle source
# File lib/gherkin/token_matcher.rb, line 48
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) click to toggle source
# 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
reset() click to toggle source
# 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

Private Instance Methods

change_dialect(dialect_name, location) click to toggle source
# File lib/gherkin/token_matcher.rb, line 137
def change_dialect(dialect_name, location)
  dialect = Dialect.for(dialect_name)
  raise NoSuchLanguageException.new(dialect_name, location) if dialect.nil?

  @dialect_name = dialect_name
  @dialect = dialect
end
match_title_line(token, token_type, keywords) click to toggle source
# File lib/gherkin/token_matcher.rb, line 145
def match_title_line(token, token_type, keywords)
  keyword = keywords.detect { |k| token.line.start_with_title_keyword?(k) }

  return false unless keyword

  title = token.line.get_rest_trimmed(keyword.length + ':'.length)
  set_token_matched(token, token_type, title, keyword)
  true
end
set_token_matched(token, matched_type, text = nil, keyword = nil, indent = nil, items = []) click to toggle source
# File lib/gherkin/token_matcher.rb, line 155
def set_token_matched(token, matched_type, text = nil, keyword = nil, indent = nil, items = [])
  token.matched_type = matched_type
  token.matched_text = text && text.chomp
  token.matched_keyword = keyword
  token.matched_indent = indent || (token.line && token.line.indent) || 0
  token.matched_items = items
  token.location[:column] = token.matched_indent + 1
  token.matched_gherkin_dialect = @dialect_name
end
unescape_docstring(text) click to toggle source
# File lib/gherkin/token_matcher.rb, line 165
def unescape_docstring(text)
  if @active_doc_string_separator == "\"\"\""
    text.gsub("\\\"\\\"\\\"", "\"\"\"")
  elsif @active_doc_string_separator == "```"
    text.gsub("\\`\\`\\`", "```")
  else
    text
  end
end