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

FileType

A simple filetype recognizer.

Copyright (c) 2006 by murphy (Kornelius Kalnbach) <murphy rubychan de>

License:LGPL / ask the author
Version:0.1 (2005-09-01)

Documentation

 # determine the type of the given
  lang = FileType[ARGV.first]

  # return :plaintext if the file type is unknown
  lang = FileType.fetch ARGV.first, :plaintext

  # try the shebang line, too
  lang = FileType.fetch ARGV.first, :plaintext, true

Methods

[]   fetch   shebang  

Constants

UnknownFileType = Class.new Exception
TypeFromExt = { 'rb' => :ruby, 'rbw' => :ruby, 'rake' => :ruby, 'mab' => :ruby, 'cpp' => :c, 'c' => :c, 'h' => :c, 'java' => :java, 'js' => :java_script, 'json' => :json, 'diff' => :diff, 'patch' => :diff, 'css' => :css, 'xml' => :xml, 'htm' => :html, 'html' => :html, 'xhtml' => :xhtml, 'raydebug' => :debug, 'rhtml' => :rhtml, 'html.erb' => :rhtml, 'ss' => :scheme, 'sch' => :scheme, 'yaml' => :yaml, 'yml' => :yaml, }
TypeFromShebang = /\b(?:ruby|perl|python|sh)\b/
TypeFromName = { 'Rakefile' => :ruby, 'Rantfile' => :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 35
35:     def [] filename, read_shebang = false
36:       name = File.basename filename
37:       ext = File.extname(name).sub(/^\./, '')  # from last dot, delete the leading dot
38:       ext2 = filename[/\.(.*)/, 1]  # from first dot
39: 
40:       type =
41:         TypeFromExt[ext.downcase] ||
42:         (TypeFromExt[ext2.downcase] if ext2) ||
43:         TypeFromName[name] ||
44:         TypeFromName[name.downcase]
45:       type ||= shebang(filename) if read_shebang
46: 
47:       type
48:     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 68
68:     def fetch filename, default = nil, read_shebang = false
69:       if default and block_given?
70:         warn 'block supersedes default value argument'
71:       end
72: 
73:       unless type = self[filename, read_shebang]
74:         return yield if block_given?
75:         return default if default
76:         raise UnknownFileType, 'Could not determine type of %p.' % filename
77:       end
78:       type
79:     end

[Source]

    # File lib/coderay/helpers/file_type.rb, line 50
50:     def shebang filename
51:       begin
52:         File.open filename, 'r' do |f|
53:           if first_line = f.gets
54:             if type = first_line[TypeFromShebang]
55:               type.to_sym
56:             end
57:           end
58:         end
59:       rescue IOError
60:         nil
61:       end
62:     end

[Validate]