From 04e6a8133bce24d9f68acc66552d4ecb4eff4d6e Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Wed, 8 Jun 2011 09:17:20 -0500 Subject: [PATCH] Use same format as mime type lib --- lib/linguist/mime.rb | 41 ++++++++++----- lib/linguist/mimes.yml | 112 +++++++++-------------------------------- test/test_mime.rb | 1 + 3 files changed, 52 insertions(+), 102 deletions(-) diff --git a/lib/linguist/mime.rb b/lib/linguist/mime.rb index 38934754..6143030f 100644 --- a/lib/linguist/mime.rb +++ b/lib/linguist/mime.rb @@ -2,27 +2,42 @@ require 'mime/types' require 'yaml' # Register additional mime type extensions -mime_extensions = YAML.load_file(File.expand_path("../mimes.yml", __FILE__)) -mime_extensions.each do |mime_type, options| - mime = MIME::Types[mime_type].first || MIME::Type.new(mime_type) +File.read(File.expand_path("../mimes.yml", __FILE__)).lines.each do |line| + next unless line =~ %r{^ + #{MIME::Type::MEDIA_TYPE_RE} + (?:\s@([^\s]+))? + (?:\s:(#{MIME::Type::ENCODING_RE}))? + }x - (options['extensions'] || []).each { |ext| mime.extensions << ext } + mediatype = $1 + subtype = $2 + extensions = $3 + encoding = $4 - (options['exclude_extensions'] || []).each do |ext| - mime.extensions.delete(ext) + mime_type = MIME::Types["#{mediatype}/#{subtype}"].first || + MIME::Type.new("#{mediatype}/#{subtype}") - MIME::Types.instance_eval do - @__types__.instance_eval do - @extension_index[ext].delete(mime) + if extensions + extensions.split(/,/).each do |extension| + if extension =~ /^-(\w+)/ + extension = $1 + mime_type.extensions.delete(extension) + + MIME::Types.instance_eval do + @__types__.instance_eval do + @extension_index[extension].delete(mime_type) + end + end + else + mime_type.extensions << extension end end end - mime.binary = options['binary'] if options.key?('binary') - mime.encoding = options['encoding'] if options.key?('encoding') + mime_type.encoding = encoding - MIME::Types.add_type_variant(mime) - MIME::Types.index_extensions(mime) + MIME::Types.add_type_variant(mime_type) + MIME::Types.index_extensions(mime_type) end module Linguist diff --git a/lib/linguist/mimes.yml b/lib/linguist/mimes.yml index 6087ee4f..5a65dce5 100644 --- a/lib/linguist/mimes.yml +++ b/lib/linguist/mimes.yml @@ -1,92 +1,26 @@ # Additional types to add to MIME::Types +# +# @ : +# +# Follows same format as mime-types data file +# https://github.com/halostatue/mime-types/blob/master/lib/mime/types.rb.data -application/x-troff-ms: - encoding: 8bit +# TODO: Lookup actual types +application/octet-stream @a,blend,gem,graffle,ipa,lib,mcz,nib,o,odp,ods,odt,otf,ogv,pfx,pigx,plgx,pptx,psd,sib,spl,sqlite3,swc,ucode,xpi -application/netcdf: - encoding: 8bit - -application/x-pagemaker: - exclude_extensions: - - pm - -application/x-wais-source: - encoding: 8bit - -application/vnd.mozilla.xul+xml: - encoding: 8bit - -application/vnd.adobe.air-application-installer-package+zip: - extensions: - - air - -application/octet-stream: - extensions: - # TODO: Lookup actual content type for these extensions - - a - - blend - - gem - - graffle - - ipa - - lib - - mcz - - nib - - o - - odp - - ods - - odt - - otf - - ogv - - pfx - - pigx - - plgx - - pptx - - psd - - sib - - spl - - sqlite3 - - swc - - ucode - - xpi - -application/postscript: - encoding: base64 - -application/java-archive: - extensions: - - ear - - war - -application/x-chrome-extension: - extensions: - - crx - -application/x-shockwave-flash: - extensions: - - swf - -image/x-icns: - extensions: - - icns - -text/cache-manifest: - extensions: - - manifest - -application/ogg: - extensions: - - ogg - -application/x-silverlight-app: - extensions: - - xap - -application/xaml+xml: - encoding: 8bit - extensions: - - xaml - -application/x-ms-xbap: - encoding: 8bit - extensions: - - xbap +application/java-archive @ear,war +application/netcdf :8bit +application/ogg @ogg +application/postscript :base64 +application/vnd.adobe.air-application-installer-package+zip @air +application/vnd.mozilla.xul+xml :8bit +application/x-chrome-extension @crx +application/x-ms-xbap @xbap :8bit +application/x-pagemaker @-pm +application/x-shockwave-flash @swf +application/x-silverlight-app @xap +application/x-troff-ms :8bit +application/x-wais-source :8bit +application/xaml+xml @xaml :8bit +image/x-icns @icns +text/cache-manifest @manifest diff --git a/test/test_mime.rb b/test/test_mime.rb index 7c0e49ec..c010d260 100644 --- a/test/test_mime.rb +++ b/test/test_mime.rb @@ -120,6 +120,7 @@ class TestMime < Test::Unit::TestCase assert !Mime.binary?("application/xaml+xml") assert !Mime.binary?("application/xhtml+xml") assert !Mime.binary?("application/xml") + assert !Mime.binary?("text/cache-manifest") assert !Mime.binary?("text/css") assert !Mime.binary?("text/csv") assert !Mime.binary?("text/html")