##
#
# squish.rb: Ruby library code conslidator
# ruby -rsquish -I lib/ -e 'require "mylib"; squished' > mylib.rb
#
##

module Kernel #:nodoc:all
	alias :oldRequire :require
	@@loaded_mods = []

	def require(moduleName)
		@@loaded_mods << moduleName if not @@loaded_mods.include?(moduleName)
		oldRequire(moduleName)
	end

	def squished
		$stdout.write( get_required_compiled )
	end
		
	def get_required
		@@loaded_mods.map do |m|
			found = nil
			$LOADED_FEATURES.each do |t|
				if (t.gsub(/\..{1,3}$/, '') == m)
					found = t
					break
				end
			end
			
			result = [m, nil, nil]
			if(found)
				$:.each do |d|
					if(File.exists?(File.join(d, found)))
						result = [ m, found, File.join(d, found) ]
						break
					end
				end
			end
	
			result
		end
	end
	
	def get_required_compiled
		buff = ""
		get_required.each do |r|
			next if not r[1]
			next if r[1] !~ /\.rb$/
			next if r[2] =~ /\/usr/
			data = ""
		
			comm = false	
			File.readlines(r[2]).each do |line|
				line.strip!
				next if line.empty?
				next if line[0,1] == "#"

				if(line =~ /^=begin/)
					comm = true
					next
				end
				
				if(line =~ /^=end/)
					comm = false
					next
				end
				
				next if comm

				data << line + "\n"
			end

			buff << "\t@@rb_codes['#{r[0]}'] = '" + [data.reverse].pack("m*").gsub(/\s+/, '')+ "'.unpack('m*')[0].reverse\n"
		end
		get_required_stub(buff)
	end
	
	def get_required_stub(codes)
		rblist = []
		get_required.each do |r|
			next if not r[1]
			next if r[1] !~ /\.rb$/
			next if r[2] =~ /\/usr/
			rblist << r[0]
		end
		
		# The raw ruby stub to include
		%Q|
module Kernel #:nodoc:all
	@@rb_loaded   = {}
	@@rb_codes    = {}
#{codes}
	alias :oldRequire :require
	def require(m)
		return true if @@rb_loaded[m]
		@@rb_loaded[m] = true
		if(@@rb_codes[m])
			eval( @@rb_codes[m] )
			return true
		end
		oldRequire(m)
	end
end
|
	end
end

