class Decode::Languages

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

Constants

REFERENCE

Public Class Methods

all() click to toggle source
# File lib/decode/languages.rb, line 27
def self.all
        self.new.tap do |languages|
                languages.add(Language::Ruby.new)
        end
end
new() click to toggle source
# File lib/decode/languages.rb, line 33
def initialize
        @named = {}
        @extensions = {}
end

Public Instance Methods

add(language) click to toggle source
# 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) click to toggle source
# 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
freeze() click to toggle source
Calls superclass method
# File lib/decode/languages.rb, line 38
def freeze
        return unless frozen?
        
        @named.freeze
        @extensions.freeze
        
        super
end
parse_reference(text, default_language: nil) click to toggle source

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

# 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) click to toggle source
# File lib/decode/languages.rb, line 88
def reference_for(name, identifier)
        self.fetch(name).reference_for(identifier)
end
source_for(path) click to toggle source
# 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