Class: Gherkin::I18nLexer

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

Overview

The main entry point to lexing Gherkin source.

Constant Summary collapse

LANGUAGE_PATTERN =

:nodoc:

/language\s*:\s*(.*)/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parser, force_ruby) ⇒ I18nLexer

Returns a new instance of I18nLexer.



62
63
64
65
# File 'lib/gherkin/i18n_lexer.rb', line 62

def initialize(parser, force_ruby)
  @parser = parser
  @force_ruby = force_ruby
end

Instance Attribute Details

#i18n_languageObject (readonly)

Returns the value of attribute i18n_language.



11
12
13
# File 'lib/gherkin/i18n_lexer.rb', line 11

def i18n_language
  @i18n_language
end

Class Method Details

.cObject



46
47
48
49
# File 'lib/gherkin/i18n_lexer.rb', line 46

def c
  require 'gherkin/c_lexer'
  CLexer
end

.csharpObject



51
52
53
54
# File 'lib/gherkin/i18n_lexer.rb', line 51

def csharp
  require 'gherkin/csharp_lexer'
  CSharpLexer
end

.i18n_language(source) ⇒ Object



40
41
42
43
44
# File 'lib/gherkin/i18n_lexer.rb', line 40

def i18n_language(source)
  line_one = source.split(/\n/)[0]
  match = LANGUAGE_PATTERN.match(line_one)
  I18n.get(match ? match[1] : 'en').key
end

.lexer_class(i18n_lang, force_ruby) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/gherkin/i18n_lexer.rb', line 23

def lexer_class(i18n_lang, force_ruby)
  begin
    if force_ruby
      rb[i18n_lang]
    else
      begin
        c[i18n_lang]
      rescue NameError, LoadError => e
        warn("WARNING: #{e.message}. Reverting to Ruby lexer.")
        rb[i18n_lang]
      end
    end
  rescue LoadError => e
    raise I18nLexerNotFound, "No lexer was found for #{i18n_lang} (#{e.message}). Supported languages are listed in gherkin/i18n.yml."
  end
end

.new(parser, force_ruby) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/gherkin/i18n_lexer.rb', line 14

def new(parser, force_ruby)
  if !force_ruby && defined?(JRUBY_VERSION)
    require 'gherkin.jar'
    Java::Gherkin::I18nLexer.new(parser)
  else
    super
  end
end

.rbObject



56
57
58
59
# File 'lib/gherkin/i18n_lexer.rb', line 56

def rb
  require 'gherkin/rb_lexer'
  RbLexer
end

Instance Method Details

#scan(source) ⇒ Object



67
68
69
70
71
# File 'lib/gherkin/i18n_lexer.rb', line 67

def scan(source)
  @i18n_language = self.class.i18n_language(source) 
  delegate = self.class.lexer_class(@i18n_language, @force_ruby).new(@parser)
  delegate.scan(source)
end