0
|
1 """
|
|
2 request dispatcher
|
|
3 """
|
|
4
|
|
5 __all__ = ['MapserverMiddleware', 'SVGSiteMap']
|
|
6
|
|
7 import os
|
|
8 from pygraphviz import AGraph
|
|
9 from webob import Request, exc
|
|
10
|
|
11 class MapserverMiddleware(object):
|
|
12 """silly middleware to serve just the svg"""
|
|
13 def __init__(self, app, svgmap, path='/map'):
|
|
14 self.app
|
|
15 self.svgmap = svgmap
|
|
16 self.path = path
|
|
17
|
|
18 def __call__(self, environ, start_response):
|
|
19 request = Request(environ)
|
|
20 if request.path_info == self.path or not self.path:
|
|
21 content = file(self.svgmap).read()
|
|
22 return Response(content_type='image/svg+xml', body=content)
|
|
23 return app(environ, start_response)
|
|
24
|
|
25
|
|
26 class SVGSiteMap(object):
|
|
27
|
|
28 ### class level variables
|
|
29 defaults = { 'app': None,
|
|
30 'name': 'k0s.org',
|
|
31 'file': None,
|
|
32 'output': None,
|
|
33 'bgcolor': 'black',
|
|
34 'fontcolor': 'white',
|
|
35 'fontname': 'Helvetica',
|
|
36 'nodecolor': 'aqua',
|
|
37 'edgecolor': 'lime',
|
|
38 'shape': 'box'
|
|
39 }
|
|
40
|
|
41 def __init__(self, app, **kw):
|
|
42 self.app = app
|
|
43 self.edges = {}
|
|
44 for key in self.defaults:
|
|
45 setattr(self, key, kw.get(key, self.defaults[key]))
|
|
46 assert self.output, "Please give an output file"
|
|
47 assert self.file, "Cannot save file!"
|
|
48 if os.path.exists(self.file):
|
|
49 self.graph = AGraph(self.file, directed=True)
|
|
50 for edge in self.graph.edges():
|
|
51 self.edges[(edge[0], edge[1])] = int(edge.attr['label'])
|
|
52 else:
|
|
53 self.graph = AGraph(directed=True)
|
|
54 self.graph.graph_attr['title'] = self.name
|
|
55 self.graph.graph_attr['label'] = self.name
|
|
56 self.graph.graph_attr['fontname'] = self.fontname
|
|
57 self.graph.graph_attr['fontcolor'] = self.fontcolor
|
|
58 self.graph.graph_attr['bgcolor'] = self.bgcolor
|
|
59 self.graph.node_attr['color'] = self.nodecolor
|
|
60 self.graph.node_attr['fontcolor'] = self.fontcolor
|
|
61 self.graph.node_attr[
|
|
62 self.graph.node_attr['shape'] = self.shape
|
|
63 self.graph.edge_attr['color'] = self.edgecolor
|
|
64 self.graph.edge_attr['fontcolor'] = self.fontcolor
|
|
65
|
|
66 ### methods dealing with HTTP
|
|
67 def __call__(self, environ, start_response):
|
|
68 request = Request(environ)
|
|
69 import pdb; pdb.set_trace()
|
|
70 return self.app(environ, start_response)
|
|
71
|
|
72 def add(self, from_url, to_url):
|
|
73 if (from_url, to_url) in self.edges:
|
|
74 count = self.edges[(from_url, to_url)]
|
|
75 count += 1
|
|
76 self.edges[(from_url, to_url)] = count
|
|
77 edge = self.graph.get_edge(from_url, to_url)
|
|
78 edge.attr['label'] = str(count)
|
|
79 else:
|
|
80 self.edges[(from_url, to_url)] = 1
|
|
81 self.graph.add_edge(from_url, to_url, label='1')
|
|
82
|
|
83 for url in from_url, to_url:
|
|
84 node = self.graph.get_node(url)
|
|
85 node.attr['label'] = url
|
|
86 node.attr['href'] = url
|
|
87
|
|
88 if self.file:
|
|
89 self.graph.write(self.file)
|
|
90 if self.output:
|
|
91 self.graph.draw(self.output, prog='dot')
|