complete refactoring of zarchive and zdump
[zip-doc.git] / mongrel-web-gui.rb
blobcd747ec7150ac5aa1f5d1393e03c5fd4f482e40c
1 #!/usr/bin/ruby
2 # Web server for viewing zdump files.
3 # By Stian Haklev (shaklev@gmail.com), 2007
4 # Released under MIT and GPL licenses
6 # Currently in disarray, tried to get it to work with rubyscript2exe
7 # as a Mac .app.
9 %w(cgi rubygems mongrel zarchive htmlshrinker gui tk tk/root tk/frame tk/bindtag rubyscript2exe).each {|x| require x}
11 # from http://railsruby.blogspot.com/2006/07/url-escape-and-url-unescape.html
12 def url_escape(string)
13   string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
14     '%' + $1.unpack('H2' * $1.size).join('%').upcase
15   end.tr(' ', '+')
16 end
18 def url_unescape(string)
19   string.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
20     [$1.delete('%')].pack('H*')
21   end
22 end                           
23 GUI.new
24                        
25 dumpfile = File.join(RUBYSCRIPT2EXE.exedir, "..", 'Resources/archive')
26 extrafiles = File.join(RUBYSCRIPT2EXE.exedir, "..", 'Resources/extrafiles')
27 puts dumpfile
28 Archive = ZArchive.new(dumpfile)
29 Htmlshrink = HTMLShrinker.new(extrafiles)
30 Basename = ''
31 class SimpleHandler < Mongrel::HttpHandler
32   def process(req, resp)
33     t = Time.now                                    
34     url = url_unescape(req.params['PATH_INFO'][1..-1])
35     return if url =~ /(jpg|png|gif)$/
36     url = url.gsub("%7E", "~")
37     url = "#{Basename}/index.html" if url == "/"
38     url = Basename + url unless url[0..(Basename.size-1)] == Basename 
39     txt = Archive.get_article(url)
40     if txt.nil?
41       resp.write "Sorry, article not found" 
42     else
43       resp.write Htmlshrink.uncompress(txt)
44     end
45     puts "Served #{url} in #{Time.now - t} seconds."
46   end
47 end 
50 H = Mongrel::HttpServer.new("0.0.0.0", "2042")
51 H.register("/", SimpleHandler.new)
52 H.register("/files", Mongrel::DirHandler.new("."))
53 trap("INT"){ H.stop; TkRoot.destroy; exit(0) } 
54 H.run
56 puts "Webserver started, serving at http://localhost:2042/"
58 Tk.mainloop
59 H.join
60 s_thread.join