Attachment 'patch-RecentChanges-improved-diff-links-1.8-revised-again.diff'
Download 1 # HG changeset patch
2 # User Paul Boddie <paul@boddie.org.uk>
3 # Date 1375199606 -7200
4 # Node ID ede5548adf80d20217aa6f23abf55fbca6daa5a1
5 # Parent 98b529f91eec74e0888699f3698849f422964646
6 Provide links from RecentChanges to individual changes and spans of changes.
7
8 diff -r 98b529f91eec -r ede5548adf80 MoinMoin/macro/RecentChanges.py
9 --- a/MoinMoin/macro/RecentChanges.py Mon Nov 28 21:40:29 2011 +0100
10 +++ b/MoinMoin/macro/RecentChanges.py Tue Jul 30 17:53:26 2013 +0200
11 @@ -107,22 +107,109 @@
12
13 # print editor name or IP
14 d['editors'] = None
15 + d['editors_detailed'] = None
16 if request.cfg.show_names:
17 +
18 + # one line means only one revision
19 if len(lines) > 1:
20 counters = {}
21 - for idx in range(len(lines)):
22 - name = lines[idx].getEditor(request)
23 - if not name in counters:
24 - counters[name] = []
25 - counters[name].append(idx+1)
26 - poslist = [(v, k) for k, v in counters.items()]
27 - poslist.sort()
28 +
29 + # track the editor name and build suitable ranges
30 + current_name = None
31 + current_edit_rev = None
32 + current_idx = None
33 +
34 + # visit each line, recording the editor name, change number range
35 + # and revision number range
36 + for idx, edit_line in enumerate(lines):
37 +
38 + # get the edit details for the log line
39 + name = edit_line.getEditor(request)
40 + edit_rev = int(edit_line.rev)
41 + attachment = edit_line.action.startswith("ATT")
42 + must_start_range = current_edit_rev is None
43 +
44 + # record the editor and details
45 + if current_name != name or attachment or must_start_range:
46 +
47 + # already have a range of revisions to describe
48 + if not must_start_range:
49 + if not counters.has_key(current_name):
50 + counters[current_name] = []
51 +
52 + # do not include an attachment in the range
53 + # instead find the preceding page revision
54 + if attachment:
55 + start_edit_rev = max(1, last_edit_rev - 1)
56 + else:
57 + start_edit_rev = edit_rev
58 +
59 + # change numbers are 1-based
60 + counters[current_name].append((range(current_idx + 1, idx + 1), (start_edit_rev, current_edit_rev)))
61 +
62 + # add any attachment
63 + if attachment:
64 + if not counters.has_key(name):
65 + counters[name] = []
66 +
67 + # change numbers are 1-based
68 + counters[name].append((range(idx + 1, idx + 2), None))
69 +
70 + # start a new range only for genuine page revisions
71 + if attachment:
72 + current_edit_rev = None
73 + else:
74 + current_edit_rev = edit_rev
75 +
76 + current_name = name
77 + current_idx = idx
78 +
79 + # remember revisions to close ranges before attachments
80 + last_edit_rev = edit_rev
81 +
82 + # for the final change, get a diff to the revision before
83 + else:
84 + attachment = edit_line.action.startswith("ATT")
85 +
86 + # have a range of revisions to describe
87 + if not attachment:
88 + if not counters.has_key(current_name):
89 + counters[current_name] = []
90 +
91 + edit_rev = int(edit_line.rev)
92 + start_edit_rev = max(1, edit_rev - 1)
93 +
94 + # change numbers are 1-based
95 + # include the final number in the range
96 + counters[current_name].append((range(current_idx + 1, idx + 2), (start_edit_rev, current_edit_rev)))
97 +
98 + # get the editors in order
99 + editors = [(v, k) for k, v in counters.items()]
100 + editors.sort()
101 +
102 + # prepare a dictionary of editor details for display
103 d['editors'] = []
104 - for positions, name in poslist:
105 + d['editors_detailed'] = []
106 +
107 + for details, name in editors:
108 +
109 + # get the combined index list
110 + all_idx_list = []
111 + for idx_list, rev_range in details:
112 + all_idx_list += idx_list
113 +
114 + # make the editor summary
115 d['editors'].append("%s [%s]" % (
116 - name, util.rangelist(positions)))
117 + name, util.rangelist(all_idx_list)))
118 +
119 + # make the editor details for display
120 + d['editors_detailed'].append((
121 + name, page, details))
122 +
123 else:
124 - d['editors'] = [line.getEditor(request)]
125 + name = line.getEditor(request)
126 + d['editors'] = [name]
127 + d['editors_detailed'] = [(name, page, None)]
128
129 comments = []
130 for idx in range(len(lines)):
131 diff -r 98b529f91eec -r ede5548adf80 MoinMoin/theme/__init__.py
132 --- a/MoinMoin/theme/__init__.py Mon Nov 28 21:40:29 2011 +0100
133 +++ b/MoinMoin/theme/__init__.py Tue Jul 30 17:53:26 2013 +0200
134 @@ -8,7 +8,7 @@
135
136 from MoinMoin import i18n, wikiutil, config, version, caching
137 from MoinMoin.Page import Page
138 -from MoinMoin.util import pysupport
139 +from MoinMoin.util import pysupport, rangelist
140
141 modules = pysupport.getPackageModules(__file__)
142
143 @@ -1404,8 +1404,43 @@
144 html.append('<td class="rcicon2">%(info_html)s</td>\n' % d)
145
146 html.append('<td class="rceditor">')
147 - if d['editors']:
148 - html.append('<br>'.join(d['editors']))
149 + if d['editors_detailed']:
150 + notfirst = 0
151 + for name, page, details in d['editors_detailed']:
152 + if notfirst:
153 + html.append('<br>')
154 +
155 + html.append(name)
156 +
157 + if details is not None:
158 + html.append(" [")
159 + notfirstlink = 0
160 +
161 + for idx_list, rev_range in details:
162 + if notfirstlink:
163 + html.append(',')
164 +
165 + # handle attachments
166 + if rev_range is None:
167 + html.append("%s" % rangelist(idx_list))
168 + else:
169 + start_rev, end_rev = rev_range
170 + # handle pages with previous content
171 + if start_rev > 0:
172 + html.append(
173 + page.link_to_raw(self.request, "%s" % rangelist(idx_list),
174 + querystr={'action': 'diff', 'rev1': start_rev,
175 + 'rev2': end_rev}, rel='nofollow'))
176 +
177 + # handle initial edits of pages
178 + else:
179 + html.append(
180 + page.link_to_raw(self.request, "%s" % rangelist(idx_list),
181 + rel='nofollow'))
182 + notfirstlink = 1
183 + html.append("]")
184 +
185 + notfirst = 1
186 html.append('</td>\n')
187
188 html.append('<td class="rccomment">')
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.