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