Show More
@@ -9,11 +9,12 b' from pylons import url, app_globals as g' | |||
|
9 | 9 | from pylons.i18n.translation import _, ungettext |
|
10 | 10 | from vcs.utils.annotate import annotate_highlight |
|
11 | 11 | from webhelpers.html import literal, HTML, escape |
|
12 | from webhelpers.html.tools import * | |
|
12 | 13 | from webhelpers.html.builder import make_tag |
|
13 | 14 | from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \ |
|
14 | 15 | end_form, file, form, hidden, image, javascript_link, link_to, link_to_if, \ |
|
15 | 16 | link_to_unless, ol, required_legend, select, stylesheet_link, submit, text, \ |
|
16 | password, textarea, title, ul, xml_declaration | |
|
17 | password, textarea, title, ul, xml_declaration, radio | |
|
17 | 18 | from webhelpers.html.tools import auto_link, button_to, highlight, js_obfuscate, \ |
|
18 | 19 | mail_to, strip_links, strip_tags, tag_re |
|
19 | 20 | from webhelpers.number import format_byte_size, format_bit_size |
@@ -21,10 +22,10 b' from webhelpers.pylonslib import Flash a' | |||
|
21 | 22 | from webhelpers.pylonslib.secure_form import secure_form |
|
22 | 23 | from webhelpers.text import chop_at, collapse, convert_accented_entities, \ |
|
23 | 24 | convert_misc_entities, lchop, plural, rchop, remove_formatting, \ |
|
24 | replace_whitespace, urlify, truncate | |
|
25 | replace_whitespace, urlify, truncate, wrap_paragraphs | |
|
25 | 26 | |
|
26 | 27 | |
|
27 | #Custom helper here :) | |
|
28 | #Custom helpers here :) | |
|
28 | 29 | class _Link(object): |
|
29 | 30 | ''' |
|
30 | 31 | Make a url based on label and url with help of url_for |
@@ -38,6 +39,7 b' class _Link(object):' | |||
|
38 | 39 | link_fn = link_to(label, url(*url_, **urlargs)) |
|
39 | 40 | return link_fn |
|
40 | 41 | |
|
42 | link = _Link() | |
|
41 | 43 | |
|
42 | 44 | class _GetError(object): |
|
43 | 45 | |
@@ -46,18 +48,104 b' class _GetError(object):' | |||
|
46 | 48 | if form_errors and form_errors.has_key(field_name): |
|
47 | 49 | return literal(tmpl % form_errors.get(field_name)) |
|
48 | 50 | |
|
51 | get_error = _GetError() | |
|
52 | ||
|
53 | def recursive_replace(str, replace=' '): | |
|
54 | """ | |
|
55 | Recursive replace of given sign to just one instance | |
|
56 | @param str: given string | |
|
57 | @param replace:char to find and replace multiple instances | |
|
58 | ||
|
59 | Examples:: | |
|
60 | >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-') | |
|
61 | 'Mighty-Mighty-Bo-sstones' | |
|
62 | """ | |
|
63 | ||
|
64 | if str.find(replace * 2) == -1: | |
|
65 | return str | |
|
66 | else: | |
|
67 | str = str.replace(replace * 2, replace) | |
|
68 | return recursive_replace(str, replace) | |
|
69 | ||
|
70 | class _ToolTip(object): | |
|
71 | ||
|
72 | def __call__(self, tooltip_title, trim_at=50): | |
|
73 | """ | |
|
74 | Special function just to wrap our text into nice formatted autowrapped | |
|
75 | text | |
|
76 | @param tooltip_title: | |
|
77 | """ | |
|
78 | ||
|
79 | return literal(wrap_paragraphs(tooltip_title, trim_at)\ | |
|
80 | .replace('\n', '<br/>')) | |
|
81 | ||
|
82 | def activate(self): | |
|
83 | """ | |
|
84 | Adds tooltip mechanism to the given Html all tooltips have to have | |
|
85 | set class tooltip and set attribute tooltip_title. | |
|
86 | Then a tooltip will be generated based on that | |
|
87 | All with yui js tooltip | |
|
88 | """ | |
|
89 | ||
|
90 | js = ''' | |
|
91 | YAHOO.util.Event.onDOMReady(function(){ | |
|
92 | function toolTipsId(){ | |
|
93 | var ids = []; | |
|
94 | var tts = YAHOO.util.Dom.getElementsByClassName('tooltip'); | |
|
95 | ||
|
96 | for (var i = 0; i < tts.length; i++) { | |
|
97 | //if element doesn not have and id autgenerate one for tooltip | |
|
98 | ||
|
99 | if (!tts[i].id){ | |
|
100 | tts[i].id='tt'+i*100; | |
|
101 | } | |
|
102 | ids.push(tts[i].id); | |
|
103 | } | |
|
104 | return ids | |
|
105 | }; | |
|
106 | var myToolTips = new YAHOO.widget.Tooltip("tooltip", { | |
|
107 | context: toolTipsId(), | |
|
108 | monitorresize:false, | |
|
109 | xyoffset :[0,0], | |
|
110 | autodismissdelay:300000, | |
|
111 | hidedelay:5, | |
|
112 | showdelay:20, | |
|
113 | }); | |
|
114 | ||
|
115 | //Mouse subscribe optional arguments | |
|
116 | myToolTips.contextMouseOverEvent.subscribe( | |
|
117 | function(type, args) { | |
|
118 | var context = args[0]; | |
|
119 | return true; | |
|
120 | }); | |
|
121 | ||
|
122 | // Set the text for the tooltip just before we display it. Lazy method | |
|
123 | myToolTips.contextTriggerEvent.subscribe( | |
|
124 | function(type, args) { | |
|
125 | var context = args[0]; | |
|
126 | var txt = context.getAttribute('tooltip_title'); | |
|
127 | this.cfg.setProperty("text", txt); | |
|
128 | }); | |
|
129 | }); | |
|
130 | ''' | |
|
131 | return literal(js) | |
|
132 | ||
|
133 | tooltip = _ToolTip() | |
|
134 | ||
|
49 | 135 | class _FilesBreadCrumbs(object): |
|
50 | 136 | |
|
51 | 137 | def __call__(self, repo_name, rev, paths): |
|
52 | 138 | url_l = [link_to(repo_name, url('files_home', repo_name=repo_name, revision=rev, f_path=''))] |
|
53 | paths_l = paths.split('/') | |
|
139 | paths_l = paths.split(' / ') | |
|
54 | 140 | |
|
55 | 141 | for cnt, p in enumerate(paths_l, 1): |
|
56 | 142 | if p != '': |
|
57 | url_l.append(link_to(p, url('files_home', repo_name=repo_name, revision=rev, f_path='/'.join(paths_l[:cnt])))) | |
|
143 | url_l.append(link_to(p, url('files_home', repo_name=repo_name, revision=rev, f_path=' / '.join(paths_l[:cnt])))) | |
|
58 | 144 | |
|
59 | 145 | return literal(' / '.join(url_l)) |
|
60 | 146 | |
|
147 | files_breadcrumbs = _FilesBreadCrumbs() | |
|
148 | ||
|
61 | 149 | def pygmentize(filenode, **kwargs): |
|
62 | 150 | """ |
|
63 | 151 | pygmentize function using pygments |
@@ -81,32 +169,28 b' def pygmentize_annotation(filenode, **kw' | |||
|
81 | 169 | else: |
|
82 | 170 | color_dict[cs] = gen_color() |
|
83 | 171 | col = color_dict[cs] |
|
84 | return "color: rgb(%s) ! important;" % (','.join(col)) | |
|
172 | return "color: rgb(%s) ! important;" % (', '.join(col)) | |
|
85 | 173 | |
|
86 | 174 | def url_func(changeset): |
|
87 | return '%s\n' % (link_to('r%s:%s' % (changeset.revision, changeset.raw_id), | |
|
88 | url('changeset_home', repo_name='test', revision=changeset.raw_id), | |
|
89 | title=_('author') + ':%s - %s' % (changeset.author, changeset.message,), | |
|
90 | style=get_color_string(changeset.raw_id))) | |
|
91 | ||
|
175 | tooltip_html = "<div style='font-size:0.8em'><b>Author:</b> %s<br/><b>Date:</b> %s</b><br/><b>Message:</b> %s<br/></div>" | |
|
176 | ||
|
177 | tooltip_html = tooltip_html % (changeset.author, | |
|
178 | changeset.date, | |
|
179 | tooltip(changeset.message)) | |
|
180 | lnk_format = 'r%s:%s' % (changeset.revision, | |
|
181 | changeset.raw_id) | |
|
182 | uri = link_to( | |
|
183 | lnk_format, | |
|
184 | url('changeset_home', repo_name='test', | |
|
185 | revision=changeset.raw_id), | |
|
186 | style=get_color_string(changeset.raw_id), | |
|
187 | class_='tooltip', | |
|
188 | tooltip_title=tooltip_html | |
|
189 | ) | |
|
190 | ||
|
191 | uri += '\n' | |
|
192 | return uri | |
|
92 | 193 | return literal(annotate_highlight(filenode, url_func, **kwargs)) |
|
93 | ||
|
94 | def recursive_replace(str, replace=' '): | |
|
95 | """ | |
|
96 | Recursive replace of given sign to just one instance | |
|
97 | @param str: given string | |
|
98 | @param replace:char to find and replace multiple instances | |
|
99 | ||
|
100 | Examples:: | |
|
101 | >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-') | |
|
102 | 'Mighty-Mighty-Bo-sstones' | |
|
103 | """ | |
|
104 | ||
|
105 | if str.find(replace * 2) == -1: | |
|
106 | return str | |
|
107 | else: | |
|
108 | str = str.replace(replace * 2, replace) | |
|
109 | return recursive_replace(str, replace) | |
|
110 | 194 | |
|
111 | 195 | def repo_name_slug(value): |
|
112 | 196 | """ |
@@ -117,8 +201,5 b' def repo_name_slug(value):' | |||
|
117 | 201 | slug = slug.replace(c, '-') |
|
118 | 202 | slug = recursive_replace(slug, '-') |
|
119 | 203 | return slug |
|
120 | ||
|
121 | files_breadcrumbs = _FilesBreadCrumbs() | |
|
122 | link = _Link() | |
|
204 | ||
|
123 | 205 | flash = _Flash() |
|
124 | get_error = _GetError() |
@@ -143,7 +143,8 b' from vcs.utils.lazy import LazyProperty' | |||
|
143 | 143 | class EmptyChangeset(BaseChangeset): |
|
144 | 144 | |
|
145 | 145 | revision = -1 |
|
146 | ||
|
146 | message = '' | |
|
147 | ||
|
147 | 148 | @LazyProperty |
|
148 | 149 | def raw_id(self): |
|
149 | 150 | """ |
@@ -148,6 +148,7 b' class HgModel(object):' | |||
|
148 | 148 | tmp_d['contact'] = repo.contact |
|
149 | 149 | tmp_d['contact_sort'] = tmp_d['contact'] |
|
150 | 150 | tmp_d['repo_archives'] = list(repo._get_archives()) |
|
151 | tmp_d['last_msg'] = tip.message | |
|
151 | 152 | |
|
152 | 153 | yield tmp_d |
|
153 | 154 |
@@ -156,6 +156,31 b' table tr.parity1 {' | |||
|
156 | 156 | .error-message{ |
|
157 | 157 | color:#CC3300; |
|
158 | 158 | } |
|
159 | /**** Tooltip ****/ | |
|
160 | .yui-overlay, | |
|
161 | .yui-panel-container { | |
|
162 | visibility:hidden; | |
|
163 | position:absolute; | |
|
164 | z-index: 2; | |
|
165 | } | |
|
166 | ||
|
167 | .yui-tt { | |
|
168 | visibility:hidden; | |
|
169 | position:absolute; | |
|
170 | color:#666666; | |
|
171 | background-color:#FFFFFF; | |
|
172 | font-family:arial,helvetica,verdana,sans-serif; | |
|
173 | padding:8px; | |
|
174 | border:2px solid #556CB5; | |
|
175 | font:100% sans-serif; | |
|
176 | width:auto; | |
|
177 | } | |
|
178 | ||
|
179 | .yui-tt-shadow { | |
|
180 | display: none; | |
|
181 | } | |
|
182 | /** end of Tooltip **/ | |
|
183 | ||
|
159 | 184 | |
|
160 | 185 | div#main { |
|
161 | 186 | padding: 5px; |
@@ -28,6 +28,7 b'' | |||
|
28 | 28 | </div> |
|
29 | 29 | <div id="main"> |
|
30 | 30 | ${next.main()} |
|
31 | <script>${h.tooltip.activate()}</script> | |
|
31 | 32 | </div> |
|
32 | 33 | <div class="page-footer"> |
|
33 | 34 | Hg App ${c.hg_app_version} © 2010 by Marcin Kuzminski |
@@ -140,6 +141,7 b' def is_current(selected):' | |||
|
140 | 141 | |
|
141 | 142 | <%def name="js()"> |
|
142 | 143 | <script type="text/javascript" src="/js/yui/utilities/utilities.js"></script> |
|
144 | <script type="text/javascript" src="/js/yui/container/container-min.js"></script> | |
|
143 | 145 | </%def> |
|
144 | 146 | |
|
145 | 147 | <!-- DEFINITION OF FORM ERROR FETCHER --> |
@@ -35,10 +35,14 b' from pylons_app.lib import filters' | |||
|
35 | 35 | </tr> |
|
36 | 36 | %for cnt,repo in enumerate(c.repos_list): |
|
37 | 37 | <tr class="parity${cnt%2}"> |
|
38 | <td>${h.link(repo['name'],h.url('summary_home',repo_name=repo['name']))}</td> | |
|
38 | <td>${h.link_to(repo['name'], | |
|
39 | h.url('summary_home',repo_name=repo['name']))}</td> | |
|
39 | 40 | <td title="${repo['description']}">${h.truncate(repo['description'],60)}</td> |
|
40 | 41 | <td>${repo['last_change']|n,filters.age}</td> |
|
41 |
<td>${h.link_to('r%s:%s' % (repo['rev'],repo['tip']), |
|
|
42 | <td>${h.link_to('r%s:%s' % (repo['rev'],repo['tip']), | |
|
43 | h.url('changeset_home',repo_name=repo['name'],revision=repo['tip']), | |
|
44 | class_="tooltip", | |
|
45 | tooltip_title=h.tooltip(repo['last_msg']))}</td> | |
|
42 | 46 | <td title="${repo['contact']}">${repo['contact']|n,filters.person}</td> |
|
43 | 47 | <td> |
|
44 | 48 | <a title="${_('Subscribe to %s rss feed')%repo['name']}" class="rss_logo" href="${h.url('rss_feed_home',repo_name=repo['name'])}"></a> |
General Comments 0
You need to be logged in to leave comments.
Login now