minad-mimemagic 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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