mime-types-mini 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/benchmark/content_type_lookup.rb +32 -0
- data/ext/MimeTypeMiniDatabase/MimeTypes.gperf +1976 -0
- data/ext/MimeTypeMiniDatabase/MimeTypes.h +10097 -0
- data/ext/MimeTypeMiniDatabase/MimeTypes.trenni +13 -12
- data/ext/MimeTypeMiniDatabase/MimeTypesMiniDatabase.c +54 -2
- data/ext/MimeTypeMiniDatabase/Rakefile +18 -19
- data/lib/mime/types.rb +18 -0
- data/lib/mime/types/mini/version.rb +1 -1
- metadata +5 -1
@@ -1,13 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
},
|
12
|
-
<?r end ?>
|
1
|
+
%language=ANSI-C
|
2
|
+
%define slot-name content_type
|
3
|
+
%define hash-function-name mime_type_hash
|
4
|
+
%define lookup-function-name lookup_mime_type_by_content_type
|
5
|
+
%enum
|
6
|
+
%switch=4
|
7
|
+
struct MimeType {
|
8
|
+
const char * content_type;
|
9
|
+
const char * encoding;
|
10
|
+
const char * extensions;
|
13
11
|
};
|
12
|
+
%%<?r mime_types.each do |mime_type|
|
13
|
+
content_type, encoding, extensions = mime_type.values_at('content-type', 'encoding', 'extensions') ?>
|
14
|
+
#{content_type}, #{encoding.inspect}, #{extensions_struct(extensions)}<?r end ?>
|
@@ -2,16 +2,17 @@
|
|
2
2
|
#include "ruby.h"
|
3
3
|
|
4
4
|
#include "Extensions.h"
|
5
|
+
#include "MimeTypes.h"
|
5
6
|
|
6
7
|
VALUE MimeTypesMiniDatabase = Qnil;
|
7
8
|
|
8
9
|
void Init_MimeTypesMiniDatabase();
|
9
10
|
|
10
11
|
static VALUE method_content_type_for_extension(VALUE self, VALUE extension) {
|
11
|
-
|
12
|
+
long len = RSTRING_LEN(extension);
|
12
13
|
char* str = RSTRING_PTR(extension);
|
13
14
|
|
14
|
-
const struct ContentTypeExtension * result = lookup_content_type_by_extension(str, len);
|
15
|
+
const struct ContentTypeExtension * result = lookup_content_type_by_extension(str, (unsigned)len);
|
15
16
|
|
16
17
|
if (result) {
|
17
18
|
return rb_str_new_cstr(result->content_type);
|
@@ -20,12 +21,63 @@ static VALUE method_content_type_for_extension(VALUE self, VALUE extension) {
|
|
20
21
|
}
|
21
22
|
}
|
22
23
|
|
24
|
+
VALUE MimeType = Qnil;
|
25
|
+
|
26
|
+
static VALUE method_mime_type_for_content_type(VALUE self, VALUE content_type) {
|
27
|
+
long len = RSTRING_LEN(content_type);
|
28
|
+
char* str = RSTRING_PTR(content_type);
|
29
|
+
|
30
|
+
const struct MimeType * result = lookup_mime_type_by_content_type(str, (unsigned)len);
|
31
|
+
|
32
|
+
if (result) {
|
33
|
+
VALUE args[3] = {
|
34
|
+
rb_str_new_cstr(result->content_type),
|
35
|
+
rb_str_new_cstr(result->encoding),
|
36
|
+
Qnil,
|
37
|
+
};
|
38
|
+
|
39
|
+
if (result->extensions) {
|
40
|
+
args[2] = rb_str_split(
|
41
|
+
rb_str_new_cstr(result->extensions),
|
42
|
+
" "
|
43
|
+
);
|
44
|
+
}
|
45
|
+
|
46
|
+
return rb_class_new_instance(3, args, MimeType);
|
47
|
+
} else {
|
48
|
+
return Qnil;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
static ID id_content_type, id_encoding, id_extensions;
|
53
|
+
|
54
|
+
static VALUE MimeType_initialize(VALUE self, VALUE content_type, VALUE encoding, VALUE extensions) {
|
55
|
+
rb_ivar_set(self, id_content_type, content_type);
|
56
|
+
rb_ivar_set(self, id_encoding, encoding);
|
57
|
+
rb_ivar_set(self, id_extensions, extensions);
|
58
|
+
|
59
|
+
return self;
|
60
|
+
}
|
61
|
+
|
23
62
|
void Init_MimeTypesMiniDatabase() {
|
63
|
+
id_content_type = rb_intern("@content_type");
|
64
|
+
id_encoding = rb_intern("@encoding");
|
65
|
+
id_extensions = rb_intern("@extensions");
|
66
|
+
|
24
67
|
VALUE Mime = rb_define_module("Mime");
|
68
|
+
|
69
|
+
MimeType = rb_define_class_under(Mime, "Type", rb_cObject);
|
70
|
+
rb_define_attr(MimeType, "content_type", 1, 0);
|
71
|
+
rb_define_attr(MimeType, "encoding", 1, 0);
|
72
|
+
rb_define_attr(MimeType, "extensions", 1, 0);
|
73
|
+
rb_define_method(MimeType, "initialize", MimeType_initialize, 3);
|
74
|
+
|
25
75
|
VALUE MimeTypes = rb_define_module_under(Mime, "Types");
|
76
|
+
|
26
77
|
VALUE MimeTypesMini = rb_define_module_under(MimeTypes, "Mini");
|
27
78
|
|
28
79
|
MimeTypesMiniDatabase = rb_define_module_under(MimeTypesMini, "Database");
|
29
80
|
|
30
81
|
rb_define_module_function(MimeTypesMiniDatabase, "content_type_for_extension", method_content_type_for_extension, 1);
|
82
|
+
rb_define_module_function(MimeTypesMiniDatabase, "mime_type_for_content_type", method_mime_type_for_content_type, 1);
|
31
83
|
}
|
@@ -4,18 +4,6 @@ require 'trenni'
|
|
4
4
|
require 'json'
|
5
5
|
require 'ostruct'
|
6
6
|
|
7
|
-
class TemplateState < Struct.new(:mime_types)
|
8
|
-
NULL = 'NULL'
|
9
|
-
|
10
|
-
def extensions_struct(extensions)
|
11
|
-
if extensions
|
12
|
-
'(const char*[]){' + (extensions.collect(&:inspect) + [0]).join(', ') + '}'
|
13
|
-
else
|
14
|
-
0
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
7
|
task :load_mime_types do
|
20
8
|
mime_types_json_path = File.join(MIME::Types::Data::PATH, "mime-types.json")
|
21
9
|
@mime_types = JSON::load(File.open mime_types_json_path)
|
@@ -45,17 +33,28 @@ task :generate_extensions => :generate_extensions_hashtable do
|
|
45
33
|
sh 'gperf', '-CD', '-t', 'Extensions.gperf', '--output-file', 'Extensions.h'
|
46
34
|
end
|
47
35
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
36
|
+
class TemplateState < Struct.new(:mime_types)
|
37
|
+
def extensions_struct(extensions)
|
38
|
+
if extensions
|
39
|
+
extensions.join(' ').inspect
|
40
|
+
else
|
41
|
+
0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
task :generate_mime_types_hashtable => :load_mime_types do
|
52
47
|
template_path = File.expand_path("MimeTypes.trenni", __dir__)
|
53
48
|
template = Trenni::Template.load_file(template_path)
|
54
49
|
|
55
|
-
template_state = TemplateState.new(mime_types)
|
50
|
+
template_state = TemplateState.new(@mime_types)
|
56
51
|
result = template.to_string(template_state)
|
57
52
|
|
58
|
-
File.write("MimeTypes.
|
53
|
+
File.write("MimeTypes.gperf", result)
|
54
|
+
end
|
55
|
+
|
56
|
+
task :generate_mime_types => :generate_mime_types_hashtable do
|
57
|
+
sh 'gperf', '-C', '-t', 'MimeTypes.gperf', '--output-file', 'MimeTypes.h'
|
59
58
|
end
|
60
59
|
|
61
|
-
task :default => :
|
60
|
+
task :default => [:generate_extensions, :generate_mime_types]
|
data/lib/mime/types.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
module MIME
|
3
|
+
module Types
|
4
|
+
def self.type_for(filename)
|
5
|
+
# Return mime types
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.[](content_type)
|
9
|
+
# Return mime types
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.content_type_for(extension)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.extensions_for(content_type)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mime-types-mini
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Williams
|
@@ -62,13 +62,17 @@ extra_rdoc_files: []
|
|
62
62
|
files:
|
63
63
|
- Gemfile
|
64
64
|
- Rakefile
|
65
|
+
- benchmark/content_type_lookup.rb
|
65
66
|
- ext/MimeTypeMiniDatabase/Extensions.gperf
|
66
67
|
- ext/MimeTypeMiniDatabase/Extensions.h
|
67
68
|
- ext/MimeTypeMiniDatabase/Extensions.trenni
|
69
|
+
- ext/MimeTypeMiniDatabase/MimeTypes.gperf
|
70
|
+
- ext/MimeTypeMiniDatabase/MimeTypes.h
|
68
71
|
- ext/MimeTypeMiniDatabase/MimeTypes.trenni
|
69
72
|
- ext/MimeTypeMiniDatabase/MimeTypesMiniDatabase.c
|
70
73
|
- ext/MimeTypeMiniDatabase/Rakefile
|
71
74
|
- ext/MimeTypeMiniDatabase/extconf.rb
|
75
|
+
- lib/mime/types.rb
|
72
76
|
- lib/mime/types/mini.rb
|
73
77
|
- lib/mime/types/mini/version.rb
|
74
78
|
- mime-types-mini.gemspec
|