Mercurial > hg > svgsitemap
comparison svgsitemap/middleware.py @ 0:7a60bacc6a22
initial commit
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Mon, 27 Dec 2010 22:09:09 -0800 |
| parents | |
| children | 084088505eea |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:7a60bacc6a22 |
|---|---|
| 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') |
