Module: CodeRay::FileType

Defined in:
lib/coderay/helpers/file_type.rb

Overview

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

Constant Summary collapse

UnknownFileType =
Class.new Exception
TypeFromExt =
{
  'c'         => :c,
  'cfc'       => :xml,
  'cfm'       => :xml,
  'clj'       => :clojure,
  'css'       => :css,
  'diff'      => :diff,
  'dpr'       => :delphi,
  'erb'       => :erb,
  'gemspec'   => :ruby,
  'go'        => :go, 
  'groovy'    => :groovy,
  'gvy'       => :groovy,
  'h'         => :c,
  'haml'      => :haml,
  'htm'       => :html,
  'html'      => :html,
  'html.erb'  => :erb,
  'java'      => :java,
  'js'        => :java_script,
  'json'      => :json,
  'lua'       => :lua,
  'mab'       => :ruby,
  'pas'       => :delphi,
  'patch'     => :diff,
  'phtml'     => :php,
  '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,  # config.ru
  'rxml'      => :ruby,
  'sass'      => :sass,
  'sql'       => :sql,
  'taskpaper' => :taskpaper,
  'template'  => :json,  # AWS CloudFormation template
  'tmproj'    => :xml,
  'xaml'      => :xml,
  'xhtml'     => :html,
  'xml'       => :xml,
  'yaml'      => :yaml,
  'yml'       => :yaml,
}
TypeFromShebang =
/\b(?:ruby|perl|python|sh)\b/
TypeFromName =
{
  'Capfile'  => :ruby,
  'Rakefile' => :ruby,
  'Rantfile' => :ruby,
  'Gemfile'  => :ruby,
  'Guardfile' => :ruby,
  'Vagrantfile' => :ruby,
  'Appraisals' => :ruby
}

Class Method Summary collapse

Class Method Details

.[](filename, read_shebang = false) ⇒ Object

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.



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/coderay/helpers/file_type.rb', line 29

def [] filename, read_shebang = false
  name = File.basename filename
  ext = File.extname(name).sub(/^\./, '')  # from last dot, delete the leading dot
  ext2 = filename.to_s[/\.(.*)/, 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 ||= type_from_shebang(filename) if read_shebang
  
  type
end

.fetch(filename, default = nil, read_shebang = false) ⇒ Object

This works like Hash#fetch.

If the filetype cannot be found, the default value is returned.



50
51
52
53
54
55
56
57
58
59
60
61
62
# 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