public
Description: Tool to generate dot file based on wikipedia usage
Homepage:
Clone URL: git://github.com/schleyfox/wikimapper.git
wikimapper / wiki_log.rb
100644 93 lines (74 sloc) 2.309 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
require 'rubygems'
require 'mongrel'
require 'active_record'
 
$db_name = 'wiki_dot.db'
$dot_fn = 'wiki_map.tmp.dot'
$png_fn = 'wiki_map.tmp.png'
 
if !File.exists? $db_name
  require 'sqlite3'
  db = SQLite3::Database.new($db_name)
  db.execute %q{
CREATE TABLE lines(
id INTEGER PRIMARY KEY,
created_at DATETIME,
line TEXT);
}
  db.close
end
 
 
 
ActiveRecord::Base.establish_connection({ :adapter => 'sqlite3',
  :dbfile => $db_name})
 
class Line < ActiveRecord::Base
end
 
 
def stripdot(txt)
  CGI::unescape(txt).gsub('"', "''")
end
 
 
class WikiLoggerHandler < Mongrel::HttpHandler
  def process(request,response)
    response.start(200) do |head, out|
      head["Content-Type"] = "text/plain"
      vars = Mongrel::HttpRequest.query_parse(request.params['QUERY_STRING'])
 
      if vars['single']
        Line.new(:line => "\"#{stripdot vars['single']}\";").save
      else
        Line.new(
          :line => "\"#{stripdot vars['from']}\" -> \"#{stripdot vars['to']}\";").save
      end
    end
  end
end
 
class WikiMapDisplayHandler < Mongrel::HttpHandler
  def process(request,response)
    response.start(200) do |head, out|
      head["Content-Type"] = "image/png"
      vars = Mongrel::HttpRequest.query_parse(request.params['QUERY_STRING'])
 
      conds = []
      begin
        if vars['start'] and vars['end']
          start = DateTime.parse(vars['start'])
          endd = DateTime.parse(vars['end'])
          conds = {:created_at => start..endd}
        elsif vars['start']
          start = DateTime.parse(vars['start'])
          conds = ['created_at >= ?', start]
        elsif vars['end']
          endd = DateTime.parse(vars['end'])
          conds = ['created_at <= ?', endd]
        end
      rescue
        conds = []
      end
 
      File.open($dot_fn, 'w') do |f|
        f.write((["digraph wiki_map {"] +
        Line.find(:all, :conditions => conds).collect{|l|
        " #{l.line}"} + ["}"]).join("\n"))
      end
      `dot -Tpng #{$dot_fn} -o #{$png_fn}`
      out.write File.read($png_fn)
    end
  end
end
      
 
server = Mongrel::HttpServer.new("127.0.0.1", "9999")
server.register("/", WikiLoggerHandler.new)
server.register("/show", WikiMapDisplayHandler.new)
server.register("/favicon.ico", Mongrel::Error404Handler.new(""))
server.run.join