A simple filetype recognizer.
# determine the type of the given lang = FileType[file_name] # return :text if the file type is unknown lang = FileType.fetch file_name, :text # try the shebang line, too lang = FileType.fetch file_name, :text, true
Try to determine the file type of the file.
filename
is a relative or absolute path to a file.
The file itself is only accessed when read_shebang
is set to
true. That means you can get filetypes from files that don’t exist.
# File lib/coderay/helpers/file_type.rb, line 29 def [] filename, read_shebang = false name = File.basename filename ext = File.extname(name).sub(%r^\./, '') # from last dot, delete the leading dot ext2 = filename.to_s[%r\.(.*)/, 1] # from first dot type = TypeFromExt[ext] || TypeFromExt[ext.downcase] || (TypeFromExt[ext2] if ext2) || (TypeFromExt[ext2.downcase] if ext2) || TypeFromName[name] || TypeFromName[name.downcase] type ||= shebang(filename) if read_shebang type end
This works like Hash#fetch.
If the filetype cannot be found, the default
value is
returned.
# File lib/coderay/helpers/file_type.rb, line 50 def fetch filename, default = nil, read_shebang = false if default && block_given? warn 'Block supersedes default value argument; use either.' end if type = self[filename, read_shebang] type else return yield if block_given? return default if default raise UnknownFileType, 'Could not determine type of %p.' % filename end end
# File lib/coderay/helpers/file_type.rb, line 66 def shebang filename return unless File.exist? filename File.open filename, 'r' do |f| if first_line = f.gets if type = first_line[TypeFromShebang] type.to_sym end end end end