Module CodeRay::FileType
In: lib/coderay/helpers/file_type.rb

FileType

A simple filetype recognizer.

Usage

 # 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

Methods

[]   fetch   shebang  

Constants

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, }

Public Class methods

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.

[Source]

    # 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.

[Source]

    # 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

Protected Class methods

[Source]

    # File lib/coderay/helpers/file_type.rb, line 66
66:       def shebang filename
67:         return unless File.exist? filename
68:         File.open filename, 'r' do |f|
69:           if first_line = f.gets
70:             if type = first_line[TypeFromShebang]
71:               type.to_sym
72:             end
73:           end
74:         end
75:       end

[Validate]