annotate svgsitemap/middleware.py @ 17:94d9eccce1d7

prevent edge width breaking when new edges are added
author Jeff Hammel <jhammel@mozilla.com>
date Sun, 02 Jan 2011 20:25:44 -0800
parents f50b4e4ad764
children 2aeac6508dc3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 """
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2 request dispatcher
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5 __all__ = ['MapserverMiddleware', 'SVGSiteMap']
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7 import os
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
8 import urlparse
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
9 from fnmatch import fnmatch
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10 from pygraphviz import AGraph
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
11 from webob import Request, Response, exc
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
13 class MapserverMiddleware(object):
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 """silly middleware to serve just the svg"""
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15 def __init__(self, app, svgmap, path='/map'):
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
16 self.app = app
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17 self.svgmap = svgmap
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 self.path = path
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 def __call__(self, environ, start_response):
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21 request = Request(environ)
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
22 if request.path_info == self.path or not self.path:
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
23 if not os.path.exists(self.svgmap):
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
24 res = exc.HTTPNotFound()
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
25 return res(environ, start_response)
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
26 content = file(self.svgmap).read()
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
27 res = Response(content_type='image/svg+xml', body=content)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
28 return res(environ, start_response)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
29 return self.app(environ, start_response)
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
30
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
31
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
32 class SVGSiteMap(object):
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
33
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
34 ### class level variables
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
35 defaults = { 'name': '',
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
36 'hosts': '',
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
37 'external_referers': True,
2
30d03e830354 compute line widths
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
38 'maxwidth': 5,
11
1ff7b363e89e hike up minimum edge width a bit
Jeff Hammel <jhammel@mozilla.com>
parents: 10
diff changeset
39 'minwidth': '0.1',
15
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
40 'maxlength': 60,
8
1d16bde33eee take out some image too ::sigh::
Jeff Hammel <jhammel@mozilla.com>
parents: 7
diff changeset
41 'excluded': '*.css *.js */static/* /css/* *.ico /backgrounds/* *.png *.jpg',
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
42
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
43 # input/output
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
44 'file': None, # graphviz file
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
45 'output': None, # .svg file
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
46
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
47 # graph attributes
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
48 'bgcolor': 'black',
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
49 'fontcolor': 'white',
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 'fontname': 'Helvetica',
15
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
51 'fontsize': '80.0',
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 'nodecolor': 'aqua',
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
53 'edgecolor': 'lime',
5
65acb32e8dc3 dont use boxes
Jeff Hammel <jhammel@mozilla.com>
parents: 4
diff changeset
54 'shape': 'plaintext',
15
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
55 'len': '1.0',
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
56 'arrowsize': '0.5',
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 }
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 def __init__(self, app, **kw):
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
60
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
61 # boilerplate
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 self.app = app
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 self.edges = {}
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
64 self.max = 0
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
65
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
66 # set attrs from defaults
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67 for key in self.defaults:
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 setattr(self, key, kw.get(key, self.defaults[key]))
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
69
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
70 # sanity checks + data fixing
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
71 assert self.output, "Please give an output file"
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72 assert self.file, "Cannot save file!"
2
30d03e830354 compute line widths
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
73 self.maxwidth = float(self.maxwidth)
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
74 if isinstance(self.excluded, basestring):
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
75 self.excluded = self.excluded.split()
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
76 if self.hosts:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
77 self.hosts = self.hosts.split()
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
78 else:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
79 self.hosts = []
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
80 if isinstance(self.external_referers, basestring):
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
81 self.external_referers = self.external_referers.lower() == 'true'
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
82
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
83 # open the graph
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
84 if os.path.exists(self.file):
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
85 self.graph = AGraph(self.file, name=self.name, splines=False, directed=True)
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
86 for edge in self.graph.edges():
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
87 if self.exclude(edge[0], edge[1]):
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
88 self.graph.remove_edge(edge[0], edge[1])
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
89 continue
15
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
90 if edge.attr['tooltip']:
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
91 count = int(edge.attr['tooltip'].split(':', 1)[0].strip())
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
92 else:
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
93 label = edge.attr['label']
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
94 count = int(label)
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
95 self.label(edge, count)
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
96 self.edges[(edge[0], edge[1])] = count
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
97 if count > self.max:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
98 self.max = count
10
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
99 self.remove_orphans()
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
100 self.set_widths()
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
101 else:
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
102 self.graph = AGraph(name=self.name, splines=False, directed=True)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
103
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
104 # make it pretty
2
30d03e830354 compute line widths
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
105 self.graph.graph_attr['name'] = self.name
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
106 self.graph.graph_attr['label'] = self.name
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
107 self.graph.graph_attr['fontname'] = self.fontname
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
108 self.graph.graph_attr['fontcolor'] = self.fontcolor
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
109 self.graph.graph_attr['bgcolor'] = self.bgcolor
16
f50b4e4ad764 just use no overlap and dont try to be fancy
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
110 self.graph.graph_attr['overlap'] = 'false'
f50b4e4ad764 just use no overlap and dont try to be fancy
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
111 self.graph.graph_attr['sep'] = '0'
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
112 self.graph.node_attr['color'] = self.nodecolor
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
113 self.graph.node_attr['fontcolor'] = self.fontcolor
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
114 self.graph.node_attr['fontname'] = self.fontname
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
115 self.graph.node_attr['fontsize'] = self.fontsize
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
116 self.graph.node_attr['shape'] = self.shape
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
117 self.graph.edge_attr['color'] = self.edgecolor
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
118 self.graph.edge_attr['fontcolor'] = self.fontcolor
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
119 self.graph.edge_attr['fontname'] = self.fontname
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
120 self.graph.edge_attr['fontsize'] = self.fontsize
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
121 self.graph.edge_attr['len'] = self.len
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
122 self.graph.edge_attr['arrowsize'] = self.arrowsize
9
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
123
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
124 if self.edges:
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
125 self.save()
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
126
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
127 def __call__(self, environ, start_response):
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
128 request = Request(environ)
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
129 if request.referer:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
130
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
131 # parse the URLs
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
132 parsed_referer = urlparse.urlsplit(request.referer)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
133 parsed_referee = urlparse.urlsplit(request.url)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
134 islocal = False
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
135
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
136 # see if its local or not
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
137 localhosts = self.hosts[:]
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
138 if parsed_referee.hostname not in localhosts:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
139 localhosts.append(parsed_referee.hostname)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
140 for host in localhosts:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
141 if parsed_referer.hostname == host or parsed_referer.hostname.endswith('.' + host):
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
142 islocal = True
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
143 break
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
144
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
145 # make the connection
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
146 if islocal:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
147 self.add(parsed_referer.path, parsed_referee.path)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
148 else:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
149 if self.external_referers:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
150 self.add(request.referer, parsed_referee.path)
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
151
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
152 return self.app(environ, start_response)
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
153
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
154 def add(self, from_url, to_url):
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
155 """add a conncection in the graph"""
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
156
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
157 if from_url == to_url:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
158 return # don't do self-references
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
159 if self.exclude(from_url, to_url):
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
160 return # ignore certain urls
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
161
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
162 if (from_url, to_url) in self.edges:
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
163 count = self.edges[(from_url, to_url)]
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
164 count += 1
1
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
165 if count > self.max:
084088505eea almost working
Jeff Hammel <jhammel@mozilla.com>
parents: 0
diff changeset
166 self.max = count
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
167 self.edges[(from_url, to_url)] = count
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
168 edge = self.graph.get_edge(from_url, to_url)
15
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
169 self.label(edge, count)
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
170 else:
17
94d9eccce1d7 prevent edge width breaking when new edges are added
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
171 count = 1
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
172 self.edges[(from_url, to_url)] = 1
15
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
173 labeltooltip = '1: %s -> %s' % (from_url, to_url)
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
174 self.graph.add_edge(from_url, to_url, label='', tooltip=labeltooltip, href='#')
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
175
17
94d9eccce1d7 prevent edge width breaking when new edges are added
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
176 if count > self.max:
94d9eccce1d7 prevent edge width breaking when new edges are added
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
177 self.max = count
94d9eccce1d7 prevent edge width breaking when new edges are added
Jeff Hammel <jhammel@mozilla.com>
parents: 16
diff changeset
178
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
179 if self.maxwidth:
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
180 self.set_widths()
2
30d03e830354 compute line widths
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
181
0
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
182 for url in from_url, to_url:
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
183 node = self.graph.get_node(url)
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
184 node.attr['label'] = url
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
185 node.attr['href'] = url
7a60bacc6a22 initial commit
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
186
9
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
187 self.save()
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
188
15
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
189 def label(self, edge, count):
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
190 edge.attr['label'] = ''
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
191 edge.attr['tooltip'] = '%d: %s -> %s' % (count, edge[0], edge[1])
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
192 edge.attr['labeltooltip'] = edge.attr['tooltip']
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
193 edge.attr['href'] = '#'
61038b4e7425 initial version with acceptable formatting
Jeff Hammel <jhammel@mozilla.com>
parents: 13
diff changeset
194
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
195 def exclude(self, *urls):
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
196 """tell whether the edge is excluded"""
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
197 for pattern in self.excluded:
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
198 for url in urls:
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
199 if fnmatch(url, pattern):
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
200 return True
7
145a4d85b37d exclude long urls for now ::sigh::
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
201 for url in urls:
145a4d85b37d exclude long urls for now ::sigh::
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
202 if len(url) > self.maxlength:
145a4d85b37d exclude long urls for now ::sigh::
Jeff Hammel <jhammel@mozilla.com>
parents: 6
diff changeset
203 return True
6
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
204 return False
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
205
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
206 def set_widths(self):
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
207 if self.maxwidth:
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
208 for edge in self.graph.edges():
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
209 count = self.edges[(edge[0], edge[1])]
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
210 width = self.maxwidth * count / self.max
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
211 if not width:
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
212 width = self.minwidth
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
213 edge.attr['style'] = 'setlinewidth(%s)' % width
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
214
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
215 else:
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
216 for edge in self.graph.edges():
a88a670c92d0 dont display things that you dont want
Jeff Hammel <jhammel@mozilla.com>
parents: 5
diff changeset
217 edge.attr['style'] = ''
9
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
218
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
219 def save(self):
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
220 if self.file:
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
221 self.graph.write(self.file)
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
222 if self.output:
aa4eab6dc994 * dont set node width, height; * move save() to its own function
Jeff Hammel <jhammel@mozilla.com>
parents: 8
diff changeset
223 self.graph.draw(self.output, prog='neato')
10
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
224
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
225 def remove_orphans(self):
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
226 flag = True
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
227 while flag:
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
228 flag = False
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
229 for node in self.graph.nodes():
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
230 if not self.graph.neighbors(node) or self.exclude(node):
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
231 flag = True
1329127709de remove orphans in a unique function
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
232 self.graph.remove_node(node)