Module | CodeRay::FileType |
In: |
lib/coderay/helpers/file_type.rb
|
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
UnknownFileType | = | Class.new Exception |
TypeFromExt | = | { 'c' => :c, 'cfc' => :xml, 'cfm' => :xml, 'clj' => :clojure, 'css' => :css, 'diff' => :diff, 'dpr' => :delphi, 'erb' => :erb, 'gemspec' => :ruby, 'groovy' => :groovy, 'gvy' => :groovy, 'h' => :c, 'haml' => :haml, 'htm' => :page, 'html' => :page, 'html.erb' => :erb, 'java' => :java, 'js' => :java_script, 'json' => :json, 'mab' => :ruby, 'pas' => :delphi, 'patch' => :diff, 'php' => :php, 'php3' => :php, 'php4' => :php, 'php5' => :php, 'prawn' => :ruby, 'py' => :python, 'py3' => :python, 'pyw' => :python, 'rake' => :ruby, 'raydebug' => :raydebug, 'rb' => :ruby, 'rbw' => :ruby, 'rhtml' => :erb, 'rjs' => :ruby, 'rpdf' => :ruby, 'ru' => :ruby, 'rxml' => :ruby, # 'sch' => :scheme, 'sql' => :sql, # 'ss' => :scheme, 'tmproj' => :xml, 'xhtml' => :page, 'xml' => :xml, 'yaml' => :yaml, 'yml' => :yaml, } |
TypeFromShebang | = | /\b(?:ruby|perl|python|sh)\b/ |
TypeFromName | = | { 'Capfile' => :ruby, 'Rakefile' => :ruby, 'Rantfile' => :ruby, 'Gemfile' => :ruby, } |
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 29: def [] filename, read_shebang = false 30: name = File.basename filename 31: ext = File.extname(name).sub(/^\./, '') # from last dot, delete the leading dot 32: ext2 = filename.to_s[/\.(.*)/, 1] # from first dot 33: 34: type = 35: TypeFromExt[ext] || 36: TypeFromExt[ext.downcase] || 37: (TypeFromExt[ext2] if ext2) || 38: (TypeFromExt[ext2.downcase] if ext2) || 39: TypeFromName[name] || 40: TypeFromName[name.downcase] 41: type ||= shebang(filename) if read_shebang 42: 43: type 44: 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 50: def fetch filename, default = nil, read_shebang = false 51: if default && block_given? 52: warn 'Block supersedes default value argument; use either.' 53: end 54: 55: if type = self[filename, read_shebang] 56: type 57: else 58: return yield if block_given? 59: return default if default 60: raise UnknownFileType, 'Could not determine type of %p.' % filename 61: end 62: end