64 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env ruby
 | |
| 
 | |
| require 'zip/zip'
 | |
| 
 | |
| class ZipList
 | |
|   def initialize(zipFileList)
 | |
|       @zipFileList = zipFileList
 | |
|   end
 | |
| 
 | |
|   def get_input_stream(entry, &aProc)
 | |
|     @zipFileList.each {
 | |
|       |zfName|
 | |
|       Zip::ZipFile.open(zfName) {
 | |
| 	|zf|
 | |
| 	begin
 | |
| 	  return zf.get_input_stream(entry, &aProc) 
 | |
| 	rescue Errno::ENOENT
 | |
| 	end
 | |
|       }
 | |
|     }
 | |
|     raise Errno::ENOENT,
 | |
|       "No matching entry found in zip files '#{@zipFileList.join(', ')}' "+
 | |
|       " for '#{entry}'"
 | |
|   end
 | |
| end
 | |
| 
 | |
| 
 | |
| module Kernel
 | |
|   alias :oldRequire :require
 | |
| 
 | |
|   def require(moduleName)
 | |
|     zip_require(moduleName) || oldRequire(moduleName)
 | |
|   end
 | |
| 
 | |
|   def zip_require(moduleName)
 | |
|     return false if already_loaded?(moduleName)
 | |
|     get_resource(ensure_rb_extension(moduleName)) { 
 | |
|       |zis| 
 | |
|       eval(zis.read); $" << moduleName 
 | |
|     }
 | |
|     return true
 | |
|   rescue Errno::ENOENT => ex
 | |
|     return false
 | |
|   end
 | |
| 
 | |
|   def get_resource(resourceName, &aProc)
 | |
|     zl = ZipList.new($:.grep(/\.zip$/))
 | |
|     zl.get_input_stream(resourceName, &aProc)
 | |
|   end
 | |
| 
 | |
|   def already_loaded?(moduleName)
 | |
|     moduleRE = Regexp.new("^"+moduleName+"(\.rb|\.so|\.dll|\.o)?$")
 | |
|     $".detect { |e| e =~ moduleRE } != nil
 | |
|   end
 | |
| 
 | |
|   def ensure_rb_extension(aString)
 | |
|     aString.sub(/(\.rb)?$/i, ".rb")
 | |
|   end
 | |
| end
 | |
| 
 | |
| # Copyright (C) 2002 Thomas Sondergaard
 | |
| # rubyzip is free software; you can redistribute it and/or
 | |
| # modify it under the terms of the ruby license.
 |