Class: Decode::Languages

Inherits:
Object
  • Object
show all
Defined in:
lib/decode/languages.rb

Overview

A context for looking up languages based on file extension or name.

Constant Summary collapse

REFERENCE =
/\A(?<name>[a-z]+)?\s+(?<identifier>.*?)\z/

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLanguages

Returns a new instance of Languages.



33
34
35
36
# File 'lib/decode/languages.rb', line 33

def initialize
  @named = {}
  @extensions = {}
end

Class Method Details

.allObject



27
28
29
30
31
# File 'lib/decode/languages.rb', line 27

def self.all
  self.new.tap do |languages|
    languages.add(Language::Ruby)
  end
end

Instance Method Details

#add(language) ⇒ Object



47
48
49
50
51
52
53
54
55
# File 'lib/decode/languages.rb', line 47

def add(language)
  language.names.each do |name|
    @named[name] = language
  end
  
  language.extensions.each do |extension|
    @extensions[extension] = language
  end
end

#fetch(name) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/decode/languages.rb', line 57

def fetch(name)
  @named.fetch(name) do
    unless @named.frozen?
      @named[name] = Language::Generic.new(name)
    end
  end
end

#freezeObject



38
39
40
41
42
43
44
45
# File 'lib/decode/languages.rb', line 38

def freeze
  return unless frozen?
  
  @named.freeze
  @extensions.freeze
  
  super
end

#parse_reference(text, default_language: nil) ⇒ Object

Parse a language agnostic reference: e.g. ‘ruby MyModule::MyClass`



78
79
80
81
82
83
84
85
86
# File 'lib/decode/languages.rb', line 78

def parse_reference(text, default_language: nil)
  if match = REFERENCE.match(text)
    language = self.fetch(match[:name]) || default_language
    
    return language.reference_for(match[:identifier])
  elsif default_language
    return default_language.reference_for(text)
  end
end

#reference_for(name, identifier) ⇒ Object



88
89
90
# File 'lib/decode/languages.rb', line 88

def reference_for(name, identifier)
  self.fetch(name).reference_for(identifier)
end

#source_for(path) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/decode/languages.rb', line 65

def source_for(path)
  extension = File.extname(path)
  
  if language = @extensions[extension]
    Source.new(path, language)
  end
end