78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env ruby
 | 
						|
# Vendors the MIME type config from the mime-db list
 | 
						|
# usage: script/vendor-mimes
 | 
						|
 | 
						|
require 'colorator'
 | 
						|
require 'json'
 | 
						|
require 'open-uri'
 | 
						|
 | 
						|
# ---- Helpers ----
 | 
						|
 | 
						|
{
 | 
						|
  :info    => :cyan,
 | 
						|
  :success => :green,
 | 
						|
  :error   => :red,
 | 
						|
}.each do |type, color|
 | 
						|
  define_method("log_#{type}") do |msg|
 | 
						|
    puts "  #{msg}".send(color)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
# ----
 | 
						|
 | 
						|
json = begin
 | 
						|
  log_info "Reading remote data.."
 | 
						|
  URI.open("https://raw.githubusercontent.com/jshttp/mime-db/master/db.json").read
 | 
						|
rescue StandardError => e
 | 
						|
  log_error "Error reading remote data!"
 | 
						|
  log_error e.message
 | 
						|
  log_error "Aborting."
 | 
						|
  exit 1
 | 
						|
end
 | 
						|
 | 
						|
log_info "Parsing remote data.."
 | 
						|
data = JSON.parse(json)
 | 
						|
data.reject! { |mime, meta| meta["extensions"].nil? || meta["extensions"].empty? }
 | 
						|
 | 
						|
log_info "Generating interim mime data-hashes.."
 | 
						|
mimes = {}
 | 
						|
charset_data = {}
 | 
						|
data.each do |mime, meta|
 | 
						|
  # Normalize extensions and mime-types
 | 
						|
  mime = mime.downcase.strip
 | 
						|
  extensions = meta["extensions"].map { |e| e.downcase.strip }.compact
 | 
						|
 | 
						|
  # If a given extension is listed multiple times, prefer the first one listed
 | 
						|
  extensions.reject! { |extension| mimes.values.flatten.include?(extension) }
 | 
						|
 | 
						|
  next if extensions.empty?
 | 
						|
  mimes[mime] = [] if mimes[mime].nil?
 | 
						|
  mimes[mime].concat extensions
 | 
						|
 | 
						|
  # Extract mime-types with "charset" metadata
 | 
						|
  charset_data[mime] = meta["charset"] if meta.key?("charset")
 | 
						|
 | 
						|
  # Assign `UTF-8` charset for mime-types under the `text` domain if not already assigned upstream
 | 
						|
  charset_data[mime] ||= "UTF-8" if mime.start_with?("text/")
 | 
						|
end
 | 
						|
 | 
						|
log_info "Formatting primary hash and writing to file.."
 | 
						|
strlen = mimes.keys.max_by(&:length).length
 | 
						|
output = ""
 | 
						|
output << "# Woah there. Do not edit this file directly.\n"
 | 
						|
output << "# This file is generated automatically by script/vendor-mimes.\n\n"
 | 
						|
mimes = mimes.sort_by { |k,v| k }
 | 
						|
output << mimes.map { |mime,extensions| "#{mime.ljust(strlen)} #{extensions.sort.join(" ")}" }.join("\n")
 | 
						|
 | 
						|
config = File.expand_path "../lib/jekyll/mime.types", __dir__
 | 
						|
File.write(config, output)
 | 
						|
log_info "Done! See: #{config.inspect.white}"
 | 
						|
 | 
						|
# --- Generate JSON file from charset_data ----
 | 
						|
puts
 | 
						|
 | 
						|
log_info "Dumping mimetype-charset mapping as JSON.."
 | 
						|
json_file = File.expand_path "../lib/jekyll/commands/serve/mime_types_charset.json", __dir__
 | 
						|
File.write(json_file, JSON.pretty_generate(charset_data) + "\n")
 | 
						|
log_success "and done! See: #{json_file.inspect.white}"
 |