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.



18
19
20
21
# File 'lib/decode/languages.rb', line 18

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

Class Method Details

.allObject



12
13
14
15
16
# File 'lib/decode/languages.rb', line 12

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

Instance Method Details

#add(language) ⇒ Object



32
33
34
35
36
37
38
39
40
# File 'lib/decode/languages.rb', line 32

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



42
43
44
45
46
47
48
# File 'lib/decode/languages.rb', line 42

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

#freezeObject



23
24
25
26
27
28
29
30
# File 'lib/decode/languages.rb', line 23

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`



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

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



73
74
75
# File 'lib/decode/languages.rb', line 73

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

#source_for(path) ⇒ Object



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

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