module CodeRay::FileType

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

Constants

TypeFromExt
TypeFromName
TypeFromShebang
UnknownFileType

Public Class Methods

[](filename, read_shebang = false) click to toggle source

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
fetch(filename, default = nil, read_shebang = false) { || ... } click to toggle source

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

Protected Class Methods

shebang(filename) click to toggle source
# 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