minad-mimemagic 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'rexml/document'
4
+
5
+ def str2int(s)
6
+ return s.to_i(16) if s[0..1].downcase == '0x'
7
+ return s.to_i(8) if s[0..0].downcase == '0'
8
+ s.to_i(10)
9
+ end
10
+
11
+ def get_matches(parent)
12
+ parent.get_elements('match').map {|match|
13
+ if match.attributes['mask']
14
+ nil
15
+ else
16
+ type = match.attributes['type']
17
+ value = match.attributes['value']
18
+ offset = match.attributes['offset'].split(':').map {|x| x.to_i }
19
+ offset = offset.size == 2 ? offset[0]..offset[1] : offset[0]
20
+ case type
21
+ when 'string'
22
+ value.gsub!(/\\(x[\dA-Fa-f]{1,2}|0\d{1,3}|\d{1,3}|.)/) { eval("\"\\#{$1}\"") }
23
+ when 'big16'
24
+ value = str2int(value)
25
+ value = ((value >> 8).chr + (value & 0xFF).chr)
26
+ when 'big32'
27
+ value = str2int(value)
28
+ value = (((value >> 24) & 0xFF).chr + ((value >> 16) & 0xFF).chr + ((value >> 8) & 0xFF).chr + (value & 0xFF).chr)
29
+ when 'little16'
30
+ value = str2int(value)
31
+ value = ((value & 0xFF).chr + (value >> 8).chr)
32
+ when 'little32'
33
+ value = str2int(value)
34
+ value = ((value & 0xFF).chr + ((value >> 8) & 0xFF).chr + ((value >> 16) & 0xFF).chr + ((value >> 24) & 0xFF).chr)
35
+ when 'host16' # use little endian
36
+ value = str2int(value)
37
+ value = ((value & 0xFF).chr + (value >> 8).chr)
38
+ when 'host32' # use little endian
39
+ value = str2int(value)
40
+ value = ((value & 0xFF).chr + ((value >> 8) & 0xFF).chr + ((value >> 16) & 0xFF).chr + ((value >> 24) & 0xFF).chr)
41
+ when 'byte'
42
+ value = str2int(value)
43
+ value = value.chr
44
+ end
45
+ children = get_matches(match)
46
+ children.empty? ? [offset, value] : [offset, value, children]
47
+ end
48
+ }.compact
49
+ end
50
+
51
+ FILE = ARGV[0] || '/usr/share/mime/packages/freedesktop.org.xml'
52
+ file = File.new(FILE)
53
+ doc = REXML::Document.new(file)
54
+ extensions = {}
55
+ types = {}
56
+ magics = []
57
+ doc.each_element('mime-info/mime-type') do |mime|
58
+ type = mime.attributes['type']
59
+ subclass = mime.get_elements('sub-class-of').map{|x| x.attributes['type']}
60
+ exts = mime.get_elements('glob').map{|x| x.attributes['pattern'] =~ /^\*\.([^\[\]]+)$/ ? $1.downcase : nil }.compact
61
+ mime.get_elements('magic').each do |magic|
62
+ priority = magic.attributes['priority'].to_i
63
+ matches = get_matches(magic)
64
+ magics << [priority, type, matches]
65
+ end
66
+ if !exts.empty?
67
+ exts.each{|x|
68
+ extensions[x] = type if !extensions.include?(x)
69
+ }
70
+ types[type] = [exts,subclass]
71
+ end
72
+ end
73
+
74
+ magics = magics.sort {|a,b| b[0] <=> a[0] }.map {|x| [x[1], x[2]] }
75
+
76
+ puts "# Generated from #{FILE}"
77
+ puts "class MimeMagic"
78
+ puts " private"
79
+ puts " EXTENSIONS = {"
80
+ extensions.keys.sort.each do |key|
81
+ puts " '#{key}' => '#{extensions[key]}',"
82
+ end
83
+ puts " }"
84
+ puts " TYPES = {"
85
+ types.keys.sort.each do |key|
86
+ exts = types[key][0].sort.inspect
87
+ parents = types[key][1].sort.inspect
88
+ puts " '#{key}' => [#{exts}, #{parents}],"
89
+ end
90
+ puts " }"
91
+ puts " MAGIC = ["
92
+ magics.each do |type, matches|
93
+ puts " ['#{type}', #{matches.inspect}],"
94
+ end
95
+ puts " ]"
96
+ puts "end"
97
+
@@ -0,0 +1,31 @@
1
+ require 'mimemagic'
2
+
3
+ class TC_MimeMagic < Test::Unit::TestCase
4
+ def test_text?
5
+ assert MimeMagic.new('text/plain').text?
6
+ assert MimeMagic.new('text/html').text?
7
+ assert !MimeMagic.new('application/octet-stream').text?
8
+ assert !MimeMagic.new('image/png').text?
9
+ end
10
+
11
+ def test_child_of?
12
+ assert MimeMagic.new('text/html').child_of?('text/plain')
13
+ assert MimeMagic.new('text/x-java').child_of?('text/plain')
14
+ end
15
+
16
+ def test_extensions
17
+ assert_equal %w(htm html), MimeMagic.new('text/html').extensions
18
+ end
19
+
20
+ def test_by_extension
21
+ assert_equal 'text/html', MimeMagic.by_extension('html').to_s
22
+ assert_equal 'application/x-ruby', MimeMagic.by_extension('rb').to_s
23
+ assert_nil MimeMagic.by_extension('crazy')
24
+ assert_nil MimeMagic.by_extension('')
25
+ end
26
+
27
+ def test_by_magic
28
+ assert_equal 'application/x-executable', MimeMagic.by_magic(File.open('/bin/ls')).to_s
29
+ assert_equal 'application/x-sharedlib', MimeMagic.by_magic(File.open('/lib/libc.so.6')).to_s
30
+ end
31
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minad-mimemagic
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Mendler
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-09 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.3
24
+ version:
25
+ description:
26
+ email:
27
+ - mail@daniel-mendler.de
28
+ executables: []
29
+
30
+ extensions: []
31
+
32
+ extra_rdoc_files: []
33
+
34
+ files:
35
+ - lib/mimemagic.rb
36
+ - lib/mimemagic_tables.rb
37
+ - test/test_mimemagic.rb
38
+ - script/freedesktop.org.xml
39
+ - script/generate-mime.rb
40
+ - Rakefile
41
+ has_rdoc: true
42
+ homepage:
43
+ post_install_message:
44
+ rdoc_options:
45
+ - --main
46
+ - README.txt
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ requirements: []
62
+
63
+ rubyforge_project: mimemagic
64
+ rubygems_version: 1.2.0
65
+ signing_key:
66
+ specification_version: 2
67
+ summary: Mime detection by extension or content
68
+ test_files:
69
+ - test/test_mimemagic.rb