Attachment 'gallery2image-1.3.5-11.py'
Download 1 # -*- coding: iso-8859-1 -*-
2 """
3 MoinMoin - gallery2Image Action macro
4
5 PURPOSE::
6 This action macro is used to rotate, move to bak or to slide through the images from Gallery2
7
8 CALLING SEQUENCE::
9 called by Gallery2 POST Method
10
11 PROCEDURE::
12 see Gallery2
13
14 Please remove the version number from this file
15
16 RESTRICTIONS::
17 spaces in file names are not supported. I don't know how to escape them right. Probaly this does work in 1.3.5
18
19 slide show is best used with fastcgi if you have many images
20
21 MODIFICATION HISTORY::
22 Version 1.3.3.-1
23 @copyright: 2005 by Reimar Bauer (R.Bauer@fz-juelich.de)
24 @license: GNU GPL, see COPYING for details.
25 2005-06-24: 1.3.3.-2 feature reqeust of CraigJohnson added
26 os.path.join used to join platform independent pathes
27 os.unlink removed to get it more platform independend
28 2005-08-06: 1.3.5-3 RB VS mode added
29 by one step back or forward could be toggled through the selected slides
30 and the first and last one could be selected too
31 2005-08-07 1.3.5-4 RB bug fixed for cgi-bin call. formatting of tables adjusted
32 2005-08-13 1.3.5-5 RB code change from GET to POST
33 forms instead of link
34 toggle between webnail and image by click on image
35 alias (description) and exif_date added
36 this version needs Gallery2-1.3.5-7.py
37 2005-08-31 1.3.5-6 RB html code changed into a function :-)
38 some html bugs fixed too
39 instead of button text now images used (disabled buttons are grey color coded)
40 back link to callers page
41 whole page inserted into the common wiki page
42 code clean up.
43 2005-09-01 1.3.5-7 RB image paths changed to absoulte url
44 2005-10-29 1.3.5-8 RB the code of VS rewritten
45 for the slideshow changed to a javascript player learned from Ricocheting
46 image preloading for webnails and fullimages because webspeed could be slow
47 slide show is really fast by this
48 default duration is 1000msec
49 (runs under 1.5.0 too)
50 2005-11-01 1.3.5-9 RB output buttons changed to <SPAN id> text
51 to all javascript functions added the prefix gallery2
52 some fixes on javascript code
53 controls separated.
54 2005-11-12 1.3.5-10 RB alias text is displayed by innerHTML
55 bug fixed ' is allowed to use in alias text
56 wish of grey out buttons for first or last slide button added
57 span id's changed to a prefix of gallery2_
58 2005-11-25 1.3.5-11 RB bug fixed of selecting an index of a scalar value
59 (It's a python wonder that it has worked this way)
60
61
62 """
63 Dependencies = []
64 import os,string,Image,StringIO
65 from MoinMoin import config, wikiutil, version
66 from MoinMoin.PageEditor import PageEditor
67 from MoinMoin import user, util
68 from MoinMoin.Page import Page
69 from MoinMoin.action import AttachFile
70 from MoinMoin.formatter.text_html import Formatter
71 from MoinMoin.parser import wiki
72
73
74 def option_list(this_image,pagename,text,request):
75 txt = ''
76
77 for s in text:
78 name = AttachFile.getAttachUrl(pagename,s,request)
79 if name == this_image:
80 txt += '<option selected value="%(name)s">%(alias)s' % {
81 "name":name,
82 "alias":s}
83
84 else:
85 txt += '<option value="%(name)s">%(alias)s' % {
86 "name":name,
87 "alias":s}
88
89 return txt
90
91 def to_htmltext(text):
92
93 if text.find ("'"):
94 text = text.split("'")
95 text = '''.join(text)
96
97 return text
98
99 def html_js(this_image,counter):
100 html = '''
101 <HEAD>
102 <SCRIPT LANGUAGE="JavaScript">
103 <!-- Original: Ricocheting (ricocheting@hotmail.com) -->
104 <!-- Web Site: http://www.ricocheting.com -->
105
106 <!-- This script and many more are available free online at -->
107 <!-- The JavaScript Source!! http://javascript.internet.com -->
108
109 <!-- Modifications by Reimar Bauer <R.Bauer@fz-juelich.de> -->
110 <!-- 2005-10-29 -->
111 <!-- Many thanks to Ricocheting, it is much easier as my own one. I like it -->
112 <!-- Some code added and replaced for the MoinMoin:Gallery2 parser-->
113
114
115 <!-- Begin
116
117 var rotate_delay = 1000; // delay in milliseconds (5000 = 5 secs)
118 var current = %(counter)s;
119 var theImages = new Array();
120 var thewebImages = new Array();
121 var thefullImages = new Array();
122
123 function gallery2preload() {
124 var list = document.slideform.webnail_list.value;
125 var value = list.split(",");
126 var n = value.length;
127
128 for (i = 0; i < n-1; i++){
129 theImages[i] = new Image();
130 theImages[i].src = value[i];
131 }
132 thewebImages = theImages;
133
134 var list = document.slideform.full_list.value;
135 var value = list.split(",");
136 var n = value.length;
137
138 for (i = 0; i < n-1; i++){
139 thefullImages[i] = new Image();
140 thefullImages[i].src = value[i];
141 }
142
143 }
144
145 function gallery2getserver() {
146 var value = document.URL;
147 var text = value.split("/");
148 return text[0]+'//'+text[2];
149 }
150
151 function gallery2preload_finished() {
152 var url = gallery2getserver()+'/wiki/modern/img/star_on.png';
153 return url;
154 }
155
156 function gallery2add_comments() {
157 var alias_text = document.slideform.alias.value;
158 var exif_date_text = document.slideform.exif_date.value;
159 var index = document.slideform.slide.selectedIndex;
160 var alias = alias_text.split("!,!");
161 var exif = exif_date_text.split(",");
162 document.getElementById("gallery2_alias_text").innerHTML = alias[index];
163 document.getElementById("gallery2_exif_date_text").innerHTML = exif[index];
164 }
165
166 function gallery2next_slide() {
167 if (document.slideform.slide[current+1]) {
168 document.images.show.src = theImages[current+1].src;
169 document.slideform.slide.selectedIndex = ++current;
170 gallery2add_comments();
171 }
172 else gallery2first_slide();
173 document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/first.png" onclick="gallery2first_slide();" name="fs" title="first slide" >';
174 document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/last.png" onclick="gallery2last_slide();" name="fs" title="last slide" >';
175 }
176 function gallery2previous_slide() {
177 if (current-1 >= 0) {
178 document.images.show.src = theImages[current-1].src;
179 document.slideform.slide.selectedIndex = --current;
180 gallery2add_comments();
181
182 }
183 else gallery2last_slide();
184
185 document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/first.png" onclick="gallery2first_slide();" name="fs" title="first slide" >';
186 document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/last.png" onclick="gallery2last_slide();" name="fs" title="last slide" >';
187 }
188 function gallery2first_slide() {
189 current = 0;
190 document.images.show.src = theImages[0].src;
191 document.slideform.slide.selectedIndex = 0;
192 gallery2add_comments();
193 document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/first_disabled.png" title="first slide" >';
194 document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/last.png" onclick="gallery2last_slide();" name="fs" title="last slide" >';
195 }
196 function gallery2last_slide() {
197 current = document.slideform.slide.length-1;
198 document.images.show.src = theImages[current].src;
199 document.slideform.slide.selectedIndex = current;
200 gallery2add_comments();
201 document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/first.png" onclick="gallery2first_slide();" name="fs" title="first slide" >';
202 document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/last_disabled.png" title="last slide" >';
203 }
204
205 function gallery2switch_images() {
206 if (document.slideform.flag.value == "webnail") {
207 var list = document.slideform.full_list.value;
208 var name = document.slideform.full_name.value;
209 document.slideform.flag.value = "fullscreen";
210 theImages = thefullImages;
211 } else {
212 var list = document.slideform.webnail_list.value;
213 var name = document.slideform.webnail_name.value;
214 document.slideform.flag.value = "webnail";
215 theImages = thewebImages;
216 }
217
218 var value = list.split(",");
219 var alias = name.split(",");
220
221 var n = value.length;
222
223 for (i = 0; i < n-1; i++){
224 document.slideform.slide[i].value=value[i];
225 document.slideform.slide[i].text=alias[i];
226 }
227 document.images.show.src = theImages[current].src;
228 }
229
230 function gallery2ap(text) {
231 document.slideform.slidebutton.value = (text == "Stop") ? "Start" : "Stop";
232 gallery2rotate();
233 }
234
235 function gallery2change() {
236 current = document.slideform.slide.selectedIndex;
237 document.images.show.src = theImages[current].src;
238 gallery2add_comments();
239 document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/first.png" onclick="gallery2first_slide();" name="fs" title="first slide" >';
240 document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/last.png" onclick="gallery2last_slide();" name="fs" title="last slide" >';
241 }
242
243 function gallery2rotate() {
244 if (document.slideform.slidebutton.value == "Stop") {
245 current = (current == document.slideform.slide.length-1) ? 0 : current+1;
246 document.images.show.src = theImages[current].src;
247 document.slideform.slide.selectedIndex = current;
248 gallery2add_comments();
249 document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/first.png" onclick="gallery2first_slide();" name="fs" title="first slide" >';
250 document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/modern/img/last.png" onclick="gallery2last_slide();" name="fs" title="last slide" >';
251 rotate_delay = document.slideform.duration.value;
252 window.setTimeout("gallery2rotate()", rotate_delay);
253 }
254 }
255 // End -->
256 </script>
257 </HEAD> '''% {
258 'counter':counter}
259
260 return html
261
262 def html_show_image(request,pagename,url_wiki_page,full,alias,exif_date,target,idx):
263
264 option_webnail = option_list(AttachFile.getAttachUrl(pagename,target[idx],request),pagename,target,request)
265
266 this_full_list = ''
267 for s in full:
268 this_full_list += AttachFile.getAttachUrl(pagename,s,request)+','
269
270 this_webnail_list = ''
271 for s in target:
272 this_webnail_list += AttachFile.getAttachUrl(pagename,s,request)+','
273
274 html = '''
275 <body onLoad="gallery2preload();">
276
277
278 <left>
279 <form name=slideform method="POST">
280 <input type="hidden" name="full_list" value='%(this_full_list)s'>
281 <input type="hidden" name="full_name" value='%(this_full_name)s'>
282 <input type="hidden" name="flag" value="webnail">
283 <input type="hidden" name="webnail_list" value='%(this_webnail_list)s'>
284 <input type="hidden" name="webnail_name" value='%(this_webnail_name)s'>
285 <input type="hidden" name="alias" value='%(this_alias_list)s'>
286 <input type="hidden" name="exif_date" value='%(this_exif_date_list)s'>
287 <BR>
288 <table><tr><td bgcolor="#C0C0C0"><strong>Slide: </strong></td>
289 <td bgcolor="#C0C0C0">
290 <select name="slide" onChange="gallery2change();" >
291 %(option_webnails)s
292 </select>
293 </td>
294 <td bgcolor="#C0C0C0">
295 <input type="button" name="slidebutton" onClick="gallery2ap(this.value);" value="Start" title="AutoPlay">
296 </td>
297 <td bgcolor="#C0C0C0">
298 <strong>Duration: </strong>
299 </td>
300 <td bgcolor="#C0C0C0">
301 <input type="input" name="duration" value="1000" size="5" title="Duration">
302 </td>
303 <td bgcolor="#C0C0C0" align="left" >
304 <P><SPAN id="gallery2_preloadstatus"></SPAN></P>
305 </td>
306
307 </tr>
308 </table>
309 <BR>
310 <table align="center" cellspacing=1 cellpadding=4 bgcolor="#000000">
311 <tr>
312 <td align="center" bgcolor="white">
313 </td>
314 </tr>
315 <tr>
316
317 <td align="center" bgcolor="#C0C0C0">
318 <SPAN id="gallery2_first_slide"><img src="%(server)s/wiki/modern/img/first.png" onclick="gallery2first_slide();" name="fs" title="first slide" ></SPAN>
319 <img src="%(server)s/wiki/modern/img/previous.png" onclick="gallery2previous_slide();" title="previous slide" >
320 <img src="%(server)s/wiki/modern/img/next.png" onClick="gallery2next_slide();" title="next slide" >
321 <SPAN id="gallery2_last_slide"><img src="%(server)s/wiki/modern/img/last.png" onClick="gallery2last_slide();" title="last slide" ></SPAN>
322 <input type="image" value="submit" src="%(server)s/wiki/modern/img/back.png" title="return to %(pagename)s">
323 </td>
324 </tr>
325 <tr>
326 <td align="center" bgcolor="white"">
327 <img src="%(this_image)s" name="show" onClick="gallery2switch_images();">
328 </td>
329 </tr>
330 <tr valign="center">
331 <td bgcolor="#C0C0C0" align="left">
332 <P><SPAN id="gallery2_alias_text">%(this_alias_text)s</SPAN></P>
333 </td></tr>
334 <tr valign="center">
335 <td bgcolor="#C0C0C0" align="left">
336 <P><SPAN id="gallery2_exif_date_text">%(this_exif_date_text)s</SPAN></P>
337 </td>
338 </tr>
339 <tr>
340 <td align="center" bgcolor="white">
341 </td>
342 </tr>
343 </table>
344 <BR>
345 <table>
346 <tr>
347 <td bgcolor="#C0C0C0" align="left" >
348 <P><SPAN id="gallery2_status">%(comment)s</SPAN></P>
349 </td>
350 </tr>
351 </table>
352 </form>
353 </center>
354 ''' % {
355 "server" : 'http://'+request.server_name+':' + str(request.server_port),
356 "base_url" : request.getScriptname(),
357
358 "this_full_list" : this_full_list,
359 "this_full_name" : string.join(full,','),
360 "this_webnail_list" : this_webnail_list,
361 "this_webnail_name" : string.join(target,','),
362
363 "this_alias_text": to_htmltext(alias[idx]),
364 "this_alias_list" : to_htmltext(string.join(alias,'!,!')),
365 "this_exif_date_text": exif_date[idx],
366 "this_exif_date_list" :string.join(exif_date,','),
367
368 "this_image" : AttachFile.getAttachUrl(pagename,target[idx],request),
369 "url_wiki_page" : url_wiki_page,
370 "comment" : "Click on the image for the next higher/lower resolution",
371 "pagename" : pagename,
372 "option_webnails" : option_webnail
373 }
374
375 return html
376
377 def to_wikiname(request,text):
378
379 #taken from test_parser_wiki
380 page = Page(request, 'ThisPageDoesNotExistsAndWillNeverBeReally')
381 page.formatter = Formatter(request)
382 request.formatter = page.formatter
383 page.formatter.setPage(page)
384 page.hilite_re = None
385
386 out=StringIO.StringIO()
387 request.redirect(out)
388 wikiizer = wiki.Parser(text.strip(),request)
389 wikiizer.format(page.formatter)
390 result = out.getvalue()
391 request.redirect()
392 del out
393
394 if version.release < '1.5.0' :
395 return result.strip()
396 else:
397 result = result.strip()
398 result = result.replace('<a id="line-1"></a><p>','')
399 result = result.replace('</p>','')
400 return result
401
402
403 action_name = __name__.split('.')[-1]
404
405 def execute(pagename, request):
406 """ Main dispatcher for the 'Gallery' action.
407 """
408 _ = request.getText
409
410 request.formatter = Formatter(request)
411 attachment_path = AttachFile.getAttachDir(request,pagename)
412 if request.form['do'][0] == 'VS' :
413 web = {}
414 images = string.split(request.form['target'][0],',')
415 target = images[0]
416 images = (images[1:])
417
418 full_image = string.split(request.form['full'][0],',')
419 full_target = full_image[0]
420 full_image = (full_image[1:])
421
422 all_description = string.split(request.form['alias'][0],'!,!')
423 this_description = all_description[0]
424 all_description = (all_description[1:])
425
426
427 #until javascript miracle of expanded childs is solved this is not used
428 #i = 0
429 #for txt in all_description:
430 # all_description[i] = to_wikiname(request,txt)
431 # i += 1
432
433 all_exif_date = string.split(request.form['exif_date'][0],',')
434 this_exif_date = all_exif_date[0]
435 all_exif_date = (all_exif_date[1:])
436
437 z = 0
438 for img in images :
439 if target == img :
440 idx = z
441
442 z += 1
443 n = len(images)
444
445 ######## url_wiki_page #############################################################
446 text = pagename
447 url = pagename
448 url_wiki_page = wikiutil.link_tag(request, url, text = text,
449 formatter = request.formatter)
450
451 ############################################################################
452
453 attachment_path = AttachFile.getAttachDir(request,pagename)
454
455 web['src'] = AttachFile.getAttachUrl(pagename,target,request)
456 web['title'] = target
457 #web['width']="1024"
458
459 image_link=request.formatter.image(**web)
460
461 request.http_headers()
462
463 request.setContentLanguage(request.lang)
464
465 wikiutil.send_title(request, pagename,
466 pagename=pagename)
467 request.write(html_js(AttachFile.getAttachUrl(pagename,target,request),idx))
468 request.write(request.formatter.startContent("content"))
469
470 html = html_show_image(request,pagename,url_wiki_page,full_image,all_description,all_exif_date,images,idx)
471
472 request.write(html)
473 request.write(request.formatter.endContent())
474 wikiutil.send_footer(request, pagename)
475 msg = None
476
477
478 elif request.form['do'][0] == 'PS' :
479 msg = None
480
481 elif request.form['do'][0] == 'BS' :
482 msg = "gone back" #None
483
484 elif request.user.may.delete(pagename):
485 # only users which are allowed to delete should use this tool
486
487 target=request.form['target'][0]
488 file, ext = os.path.splitext(target)
489
490 if ext == '.gif' or ext == '.png' :
491 img_type = 'PNG'
492 thumbfile = "thumbnail_%(file)s.png" % {"file" : file}
493 webnail = "webnail_%(file)s.png" % {"file" : file}
494 else:
495 img_type="JPEG"
496 thumbfile="thumbnail_%(file)s.jpg" % {"file" : file}
497 webnail="webnail_%(file)s.jpg" % {"file" : file}
498
499 thumb = os.path.join(attachment_path,thumbfile)
500 webf = os.path.join(attachment_path,webnail)
501 infile = os.path.join(attachment_path,target)
502
503 msg = None
504 if version.release < '1.5.0' :
505 if action_name in request.cfg.excluded_actions:
506 msg = _('File attachments are not allowed in this wiki!')
507
508 elif request.form['do'][0] == 'RM' :
509 if os.path.exists(infile + '.bak') :
510 os.unlink("%(file)s.bak" % {"file" : infile})
511 os.link(infile,"%(file)s.bak" % {"file" : infile})
512 os.unlink(infile)
513 os.unlink(webf)
514 os.unlink(thumb)
515 msg = _('%(target)s deleted, backup in place' % {
516 'target':target})
517
518 elif request.form['do'][0] == 'RL' :
519 im = Image.open(infile)
520 #os.unlink(infile)
521 im.rotate(90).save(infile,img_type)
522 nim = Image.open(infile)
523 nim.thumbnail((640,640), Image.ANTIALIAS)
524 #os.unlink(webf)
525 nim.save(webf, img_type)
526 nim.thumbnail((128, 128), Image.ANTIALIAS)
527 #os.unlink(thumb)
528 nim.save(thumb, img_type)
529 msg= _('%(target)s rotated to left 90 degrees' % {
530 'target':target})
531
532 elif request.form['do'][0] == 'RR' :
533 im = Image.open(infile)
534 #os.unlink(infile)
535 im.rotate(270).save(infile,img_type)
536
537 nim = Image.open(infile)
538 nim.thumbnail((640,640), Image.ANTIALIAS)
539 #os.unlink(webf)
540 nim.save(webf, img_type)
541 nim.thumbnail((128, 128), Image.ANTIALIAS)
542 #os.unlink(thumb)
543 nim.save(thumb, img_type)
544 msg= _('%(target)s rotated to right 90 degrees' % {
545 'target':target})
546
547 else:
548 msg = _('action not implemented: %s') % (request.form['do'][0],)
549 else:
550 msg = _('Your are not allowed to change images on this page: %s') % (pagename,)
551
552 if msg:
553 AttachFile.error_msg(pagename, request, msg)
554
555 return()
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.