require'middleman/server'require"thor"require"thor/group"require'rack/test'moduleMiddlemanmoduleThorActionsdeftilt_template(source,*args,&block)config=args.last.is_a?(Hash)?args.pop:{}destination=args.first||sourcesource=File.expand_path(find_in_source_paths(source.to_s))context=instance_eval('binding')@@rack_test||=::Rack::Test::Session.new(::Rack::MockSession.new(Middleman::Server))create_filedestination,nil,configdo# The default render just requests the page over Rack and writes the responserequest_path=destination.sub(/^#{Middleman::Server.build_dir}/,"")@@rack_test.get(request_path)@@rack_test.last_response.bodyendendendclassBuilder<Thor::GroupincludeThor::ActionsincludeMiddleman::ThorActionsclass_option:relative,:type=>:boolean,:aliases=>"-r",:default=>false,:desc=>'Override the config.rb file and force relative urls'definitialize(*args)superMiddleman::Server.newifoptions.has_key?("relative")&&options["relative"]Middleman::Server.activate:relative_assetsendenddefsource_paths@source_paths||=[Middleman::Server.public,Middleman::Server.views]enddefbuild_static_filesactionDirectory.new(self,Middleman::Server.public,:public,Middleman::Server.build_dir,{:force=>true})enddefbuild_dynamic_filesactionDirectory.new(self,Middleman::Server.views,:dynamic,Middleman::Server.build_dir,{:force=>true})end@@hooks={}defself.after_run(name,&block)@@hooks[name]=blockenddefrun_hooks@@hooks.eachdo|name,proc|instance_eval(&proc)endendendclassDirectory<::Thor::Actions::EmptyDirectoryattr_reader:sourcedefinitialize(base,source,mode,destination=nil,config={},&block)@mode=mode@source=File.expand_path(base.find_in_source_paths(source.to_s))@block=blocksuper(base,destination,{:recursive=>true}.merge(config))enddefinvoke!base.empty_directorygiven_destination,configexecute!enddefrevoke!execute!endprotecteddefhandle_directory(lookup)lookup=File.join(lookup,'*')Dir[lookup].sort.eachdo|file_source|ifFile.directory?(file_source)handle_directory(file_source)nextendnextiffile_source.include?('layout')nextunlessfile_source.split('/').select{|p|p[0,1]=='_'}.empty?file_extension=File.extname(file_source)file_destination=File.join(given_destination,file_source.gsub(source,'.'))file_destination.gsub!('/./','/')handled_by_tilt=::Tilt.mappings.keys.include?(file_extension.gsub(/^\./,""))ifhandled_by_tilt||(file_extension==".js")new_file_extension=(file_extension==".js")?".js":""nextif@mode==:dynamic&&file_source.split('/').last.split('.').length<3file_destination.gsub!(file_extension,new_file_extension)destination=base.tilt_template(file_source,file_destination,config,&@block)elsedestination=base.copy_file(file_source,file_destination,config,&@block)endendenddefexecute!handle_directory(source)endendend