Attachment 'gallery2image-1.6.0-16.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       
  59        Version 1.5.4-13  2006-08-02 based on 1.3.5-10                    
  60        FlorianFesti: changed some calls to more readable code                           
  61        ReimarBauer:  PEP 8
  62                      fixed of selecting an index of a scalar value
  63                      switch of release number to MoinMoin Version 1.5
  64                      duplicated call of html tag body and head removed
  65                      optional static path
  66                      table style changed
  67                      
  68        2006-08-11 1.5.4-14 RB bug fixed webf and thumbf changed to tmp. prefix always                
  69 
  70        2006-08-11 1.6.0-15 RB ported to 1.6.0 alpha version
  71        2008-02-06 1.6.0-16 RB bug fix for url_prefix_static  
  72 
  73 """
  74 Dependencies = []
  75 import os, Image, StringIO, string, sys
  76 from MoinMoin import config, wikiutil, version
  77 from MoinMoin.PageEditor import PageEditor
  78 from MoinMoin import user, util
  79 from MoinMoin.Page import Page
  80 from MoinMoin.action import AttachFile
  81 from MoinMoin.formatter.text_html import Formatter
  82 from MoinMoin.parser import text_moin_wiki
  83 from MoinMoin.util import filesys
  84 
  85 def get_path_url(request, pagename, attachment_path):
  86     url_prefix = request.cfg.url_prefix_static
  87     url_prefix = url_prefix.replace('/','')
  88     
  89     if hasattr(request.cfg, 'document_root'):
  90 
  91         static_path = "%(dir)s/tmp/Gallery2%(wiki_name)s/%(pagename)s" % {
  92               "wiki_name": request.getScriptname(),
  93               "pagename": pagename,
  94               "dir": request.cfg.document_root,
  95               }
  96         static_url = "%(prefix)s/tmp/Gallery2%(wiki_name)s/%(pagename)s/" % {
  97               "prefix": url_prefix,
  98               "wiki_name": request.getScriptname(),
  99               "pagename": pagename,
 100               }
 101     else:
 102         static_path = attachment_path
 103         static_url = AttachFile.getAttachUrl(pagename, '', request)
 104 
 105     static_url = string.replace(static_url,'//','/')  
 106     
 107     return static_path, static_url
 108 
 109 def option_list(this_image, pagename, text, request):
 110     txt = ''
 111 
 112     for s in text:
 113         name = AttachFile.getAttachUrl(pagename, s, request)
 114         if name == this_image:
 115             txt += '<option selected value="%(name)s">%(alias)s' % {
 116                 "name": this_image,
 117                 "alias": s.replace('tmp.','')}
 118         else:
 119             txt += '<option value="%(name)s">%(alias)s' % {
 120                 "name": this_image,
 121                 "alias": s.replace('tmp.','')}
 122 
 123     return txt
 124 
 125 def to_htmltext(text):
 126 
 127     if text.find ("'"):
 128         text = text.split("'")
 129         text = '&#39;'.join(text)
 130 
 131     return text
 132 
 133 def html_js(this_image, counter):
 134    html = '''
 135 <SCRIPT LANGUAGE="JavaScript">
 136 <!-- Original:  Ricocheting (ricocheting@hotmail.com) -->
 137 <!-- Web Site:  http://www.ricocheting.com -->
 138 
 139 <!-- This script and many more are available free online at -->
 140 <!-- The JavaScript Source!! http://javascript.internet.com -->
 141 
 142 <!-- Modifications by Reimar Bauer <R.Bauer@fz-juelich.de> -->
 143 <!-- 2005-10-29 -->
 144 <!-- Many thanks to Ricocheting, it is much easier as my own one. I like it -->
 145 <!-- Some code added and replaced for the MoinMoin:Gallery2 parser-->
 146 
 147 
 148 <!-- Begin 
 149 
 150 var rotate_delay = 1000; // delay in milliseconds (5000 = 5 secs)
 151 var current = %(counter)s;
 152 var theImages = new Array();
 153 var thewebImages =  new Array();
 154 var thefullImages =  new Array();
 155 
 156 function gallery2preload() {
 157    var list = document.slideform.webnail_list.value;
 158    var value = list.split(","); 
 159    var n = value.length;
 160    
 161    for (i = 0; i <  n-1; i++){
 162        theImages[i] = new Image();
 163        theImages[i].src = value[i];
 164    }   
 165    thewebImages = theImages;
 166    
 167    var list = document.slideform.full_list.value;
 168    var value = list.split(","); 
 169    var n = value.length;
 170    
 171    for (i = 0; i <  n-1; i++){
 172        thefullImages[i] = new Image();
 173        thefullImages[i].src = value[i];
 174    }
 175   
 176 } 
 177 
 178 function gallery2getserver() {
 179      var value = document.URL;
 180      var text = value.split("/");
 181      return text[0]+'//'+text[2];
 182 }     
 183 
 184 function gallery2preload_finished() {
 185     var url = gallery2getserver()+'/wiki/img/star_on.png';
 186     return url;
 187 }
 188 
 189 function gallery2add_comments() {
 190   var alias_text = document.slideform.alias.value;
 191   var exif_date_text = document.slideform.exif_date.value;
 192   var index = document.slideform.slide.selectedIndex;
 193   var alias = alias_text.split("!,!");
 194   var exif = exif_date_text.split(",");
 195   document.getElementById("gallery2_alias_text").innerHTML = alias[index];
 196   document.getElementById("gallery2_exif_date_text").innerHTML = exif[index];
 197 }
 198 
 199 function gallery2next_slide() {
 200    if (document.slideform.slide[current+1]) {
 201       document.images.show.src = theImages[current+1].src;
 202       document.slideform.slide.selectedIndex = ++current;
 203       gallery2add_comments();
 204    }
 205    else gallery2first_slide();
 206    document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/first.png" onclick="gallery2first_slide();" name="fs"  title="first slide" >';
 207    document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/last.png" onclick="gallery2last_slide();" name="fs"  title="last slide" >';
 208 }
 209 function gallery2previous_slide() {
 210    if (current-1 >= 0) {
 211       document.images.show.src = theImages[current-1].src;  
 212       document.slideform.slide.selectedIndex = --current;
 213       gallery2add_comments(); 
 214      
 215    }
 216    else gallery2last_slide();
 217    
 218    document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/first.png" onclick="gallery2first_slide();" name="fs"  title="first slide" >';
 219    document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/last.png" onclick="gallery2last_slide();" name="fs"  title="last slide" >';
 220 }
 221 function gallery2first_slide() {
 222    current = 0;
 223    document.images.show.src = theImages[0].src;  
 224    document.slideform.slide.selectedIndex = 0;
 225    gallery2add_comments();
 226    document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/first_disabled.png" title="first slide" >';
 227    document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/last.png" onclick="gallery2last_slide();" name="fs"  title="last slide" >';
 228 }
 229 function gallery2last_slide() {
 230    current = document.slideform.slide.length-1;
 231    document.images.show.src = theImages[current].src; 
 232    document.slideform.slide.selectedIndex = current;
 233    gallery2add_comments();
 234    document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/first.png" onclick="gallery2first_slide();" name="fs"  title="first slide" >';
 235    document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/last_disabled.png"  title="last slide" >';
 236 }
 237 
 238 function gallery2switch_images() {
 239    if (document.slideform.flag.value == "webnail") {
 240       var list = document.slideform.full_list.value;
 241       var name = document.slideform.full_name.value;
 242       document.slideform.flag.value = "fullscreen";
 243       theImages = thefullImages;
 244    } else {
 245      var list = document.slideform.webnail_list.value;
 246      var name = document.slideform.webnail_name.value;
 247      document.slideform.flag.value = "webnail";
 248      theImages = thewebImages;
 249    }
 250 
 251    var value = list.split(",");
 252    var alias = name.split(",");
 253 
 254    var n = value.length;
 255 
 256    for (i = 0; i <  n-1; i++){
 257       var al = alias[i];
 258       var al = al.replace("tmp.","");
 259       document.slideform.slide[i].value=value[i];
 260       document.slideform.slide[i].text=al;
 261    }
 262    document.images.show.src = theImages[current].src; 
 263 }
 264 
 265 function gallery2ap(text) {
 266    document.slideform.slidebutton.value = (text == "Stop") ? "Start" : "Stop";
 267    gallery2rotate();
 268 }
 269 
 270 function gallery2change() {
 271    current = document.slideform.slide.selectedIndex;
 272    document.images.show.src = theImages[current].src; 
 273    gallery2add_comments(); 
 274    document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/first.png" onclick="gallery2first_slide();" name="fs"  title="first slide" >';
 275    document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/last.png" onclick="gallery2last_slide();" name="fs"  title="last slide" >';
 276 }
 277 
 278 function gallery2rotate() {
 279    if (document.slideform.slidebutton.value == "Stop") {
 280       current = (current == document.slideform.slide.length-1) ? 0 : current+1;
 281       document.images.show.src = theImages[current].src; 
 282       document.slideform.slide.selectedIndex = current;
 283       gallery2add_comments(); 
 284       document.getElementById("gallery2_first_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/first.png" onclick="gallery2first_slide();" name="fs"  title="first slide" >';
 285       document.getElementById("gallery2_last_slide").innerHTML = '<img src="'+gallery2getserver()+'/wiki/img/last.png" onclick="gallery2last_slide();" name="fs"  title="last slide" >';
 286       rotate_delay = document.slideform.duration.value;
 287       window.setTimeout("gallery2rotate()", rotate_delay);
 288    }
 289 }
 290 //  End -->
 291 </script> ''' % {
 292   'counter': counter}
 293 
 294    return html
 295 
 296 def html_show_image(request, pagename, url_wiki_page, full, alias, exif_date, target, idx):
 297     attachment_path = AttachFile.getAttachDir(request, pagename)
 298     static_path, static_url = get_path_url(request, pagename, attachment_path )
 299 
 300     option_webnail = option_list(static_url + target[idx], pagename, target, request)
 301     static_path, static_url = get_path_url(request, pagename, attachment_path)
 302     
 303     inner_table_style = ' style="border-style:none; margin:10px;"'
 304     
 305     this_full_list = ''
 306     for s in full:
 307         this_full_list += AttachFile.getAttachUrl(pagename, s, request) + ','
 308 
 309     this_webnail_list = ''
 310     for s in target:
 311         this_webnail_list += static_url + s + ','
 312 
 313             
 314     html = '''
 315 <form name=slideform method="POST">
 316    <input type="hidden" name="full_list" value='%(this_full_list)s'>
 317    <input type="hidden" name="full_name" value='%(this_full_name)s'>
 318    <input type="hidden" name="flag" value="webnail">
 319    <input type="hidden" name="webnail_list" value='%(this_webnail_list)s'>
 320    <input type="hidden" name="webnail_name" value='%(this_webnail_name)s'>
 321    <input type="hidden" name="alias" value='%(this_alias_list)s'>
 322    <input type="hidden" name="exif_date" value='%(this_exif_date_list)s'>
 323    <BR>
 324    <table%(tablestyle)s>
 325     <tr>
 326      <td style="border-style:none" bgcolor="#C0C0C0"><strong>Slide: </strong></td>
 327      <td style="border-style:none" bgcolor="#C0C0C0">
 328        <select name="slide" onChange="gallery2change();" >
 329          %(option_webnails)s
 330        </select>
 331      </td>
 332      <td style="border-style:none" bgcolor="#C0C0C0">
 333       <input type="button" name="slidebutton" onClick="gallery2ap(this.value);" value="Start" title="AutoPlay">
 334      </td>
 335      <td style="border-style:none" bgcolor="#C0C0C0">
 336       <strong>Duration: </strong>
 337      </td>
 338      <td style="border-style:none" bgcolor="#C0C0C0">
 339       <input type="input" name="duration"  value="1000" size="5" title="Duration">
 340      </td>
 341    </tr>
 342    <tr>
 343      <td style="border-style:none" colspan="5" align="center" bgcolor="#C0C0C0">
 344      <SPAN id="gallery2_first_slide"><img src="%(server)s/wiki/img/first.png" onclick="gallery2first_slide();" name="fs"  title="first slide" ></SPAN>
 345      <img src="%(server)s/wiki/img/previous.png" onclick="gallery2previous_slide();"  title="previous slide" >
 346      <img src="%(server)s/wiki/img/next.png" onClick="gallery2next_slide();"  title="next slide" >
 347      <SPAN id="gallery2_last_slide"><img src="%(server)s/wiki/img/last.png" onClick="gallery2last_slide();"  title="last slide" ></SPAN>
 348      <input type="image" value="submit" src="%(server)s/wiki/img/back.png" title="return to %(pagename)s">
 349      </td>
 350    </tr>
 351    <tr>
 352     <td style="border-style:none" colspan="5" align="center" bgcolor="#C0C0C0">
 353      <img src="%(server)s/%(this_image)s" name="show" onClick="gallery2switch_images();">
 354     </td>
 355    </tr>
 356    <tr valign="center">
 357     <td style="border-style:none"colspan="5" bgcolor="#C0C0C0" align="left">
 358      <P><SPAN id="gallery2_alias_text">%(this_alias_text)s</SPAN></P>
 359     </td></tr>
 360    <tr valign="center">
 361     <td style="border-style:none" colspan="5" bgcolor="#C0C0C0" align="left">  
 362      <P><SPAN id="gallery2_exif_date_text">%(this_exif_date_text)s</SPAN></P>
 363     </td>
 364   </tr>
 365   <tr>
 366    <td style="border-style:none" colspan="5" bgcolor="#C0C0C0" align="left" >  
 367     <P><SPAN id="gallery2_status">%(comment)s</SPAN></P> 
 368    </td>
 369   
 370   </tr>
 371 </table>
 372 </form>
 373 ''' % {
 374 "server": request.getQualifiedURL(),
 375 "base_url": request.getScriptname(),
 376 "this_full_list": this_full_list,
 377 "this_full_name": string.join(full, ','),
 378 "this_webnail_list": this_webnail_list,
 379 "this_webnail_name": string.join(target, ','),
 380 "this_target": full[idx],
 381 
 382 "this_alias_text": to_htmltext(alias[idx]),
 383 "this_alias_list": to_htmltext(string.join(alias, '!,!')),
 384 "this_exif_date_text": exif_date[idx],
 385 "this_exif_date_list": string.join(exif_date, ','),
 386 
 387 "this_image": static_url + target[idx], # AttachFile.getAttachUrl(pagename, target[idx], request),
 388 "url_wiki_page": url_wiki_page,
 389 "comment": "Click on the image for the next higher/lower resolution",
 390 "pagename": pagename,
 391 "tablestyle": inner_table_style,
 392 "option_webnails": option_webnail,
 393 
 394 }
 395 
 396     return html
 397     
 398 
 399 def to_wikiname(request, text):
 400 
 401     #taken from test_parser_wiki
 402     page = Page(request, 'ThisPageDoesNotExistsAndWillNeverBeReally')
 403     page.formatter = Formatter(request)
 404     request.formatter = page.formatter
 405     page.formatter.setPage(page)
 406     page.hilite_re = None
 407 
 408     out = StringIO.StringIO()
 409     request.redirect(out)
 410     wikiizer = wiki.Parser(text.strip(), request)
 411     wikiizer.format(page.formatter)
 412     result = out.getvalue()
 413     request.redirect()
 414     del out
 415 
 416     if version.release < '1.5.0':
 417        return result.strip()
 418     else:
 419        result = result.strip()
 420        result = result.replace('<a id="line-1"></a><p>', '')
 421        result = result.replace('</p>', '')
 422        return result
 423 
 424 
 425 action_name = __name__.split('.')[-1]
 426 
 427 def execute(pagename, request):
 428     """ Main dispatcher for the 'Gallery' action.
 429     """
 430     _ = request.getText
 431 
 432     request.formatter = Formatter(request)
 433     attachment_path = AttachFile.getAttachDir(request, pagename)
 434     command = request.form.get('do', ['none'])[0]
 435 
 436     if command == 'VS':
 437         web = {}
 438         images = request.form.get('target', [''])[0]
 439         images = images.split(',')
 440         target = images[0]
 441         images = (images[1:])
 442 
 443         full_image = request.form.get('full', [''])[0]
 444         full_image = full_image.split(',')
 445         full_target = full_image[0]
 446         full_image = (full_image[1:])
 447 
 448         all_description = request.form.get('alias', [''])[0]
 449         all_description = all_description.split('!,!')
 450         this_description = all_description[0]
 451         all_description = (all_description[1:])
 452 
 453         all_exif_date = request.form.get('exif_date', [''])[0]
 454         all_exif_date = all_exif_date.split(',')
 455         this_exif_date = all_exif_date[0]
 456         all_exif_date = (all_exif_date[1:])
 457 
 458         # XXX Check that all lists have same length
 459 
 460         z = 0
 461         for img in images:
 462             if target == img:
 463                idx = z
 464 
 465             z += 1
 466         n = len(images)
 467 
 468         ######## url_wiki_page #############################################################
 469         text = pagename
 470         url = pagename
 471         url_wiki_page = wikiutil.link_tag(request, url, text=text,
 472                                           formatter=request.formatter)
 473 
 474         ############################################################################			 
 475 
 476         attachment_path = AttachFile.getAttachDir(request, pagename)
 477 
 478         static_path, static_url = get_path_url(request, pagename, attachment_path )
 479 
 480         web['src'] = static_url+target #AttachFile.getAttachUrl(pagename, target, request)
 481         web['title'] = target
 482         #web['width']="1024"
 483 
 484         image_link = request.formatter.image(**web)
 485 
 486         request.http_headers()
 487 
 488         request.setContentLanguage(request.lang)
 489 
 490         request.theme.send_title(pagename,
 491                                  pagename=pagename,
 492                                  body_onload="gallery2preload();",
 493                                  html_head=html_js(AttachFile.getAttachUrl(pagename, target, request), idx))
 494 
 495         request.write(request.formatter.startContent("content"))
 496         html = html_show_image(request, pagename, url_wiki_page, full_image, all_description, all_exif_date, images, idx)
 497         request.write(html)
 498         request.write(request.formatter.endContent())
 499         request.theme.send_footer(pagename)
 500         msg = None
 501 
 502     elif command == 'PS':
 503         msg = None
 504 
 505     elif command == 'BS':
 506         msg = "gone back" #None
 507 
 508     elif request.user.may.delete(pagename):
 509        # only users which are allowed to delete should use this tool
 510 
 511         target = request.form.get('target', [''])[0]
 512         file, ext = os.path.splitext(target)
 513 
 514         if ext == '.gif'  or  ext == '.png':
 515             img_type = 'PNG'
 516             thumbfile = "tmp.thumbnail_%(file)s.png" % {"file": file}
 517             webnail = "tmp.webnail_%(file)s.png" % {"file": file}
 518         else:
 519             img_type = "JPEG"
 520             thumbfile = "tmp.thumbnail_%(file)s.jpg"  % {"file": file}
 521             webnail = "tmp.webnail_%(file)s.jpg"  % {"file": file}
 522 
 523         static_path, static_url = get_path_url(request, pagename, attachment_path )
 524 
 525         thumb = os.path.join(static_path, thumbfile)
 526         webf = os.path.join(static_path, webnail)
 527         infile = os.path.join(attachment_path, target)
 528 
 529         msg = None
 530         if version.release < '1.5.0':
 531             if action_name in request.cfg.excluded_actions:
 532                 msg = _('File attachments are not allowed in this wiki!')
 533 
 534         elif command == 'RM':
 535             if os.path.exists(infile + '.bak'):
 536                os.unlink("%(file)s.bak" % {"file": infile})
 537             filesys.rename(infile, "%(file)s.bak" % {"file": infile})
 538             msg = _('%(target)s deleted, backup in place' % {
 539                   'target':target})
 540 
 541         elif command == 'RL':
 542             im = Image.open(infile)
 543             os.remove(infile)
 544             im.rotate(90).save(infile, img_type)
 545             nim = Image.open(infile)
 546             nim.thumbnail((640, 640), Image.ANTIALIAS)
 547             os.remove(webf)
 548             nim.save(webf, img_type)
 549             nim.thumbnail((128, 128), Image.ANTIALIAS)
 550             os.remove(thumb)
 551             nim.save(thumb, img_type)
 552             msg = _('%(target)s rotated to left 90 degrees' % {
 553                   'target':target})
 554 
 555         elif command == 'RR':
 556             im = Image.open(infile)
 557             os.remove(infile)
 558             im.rotate(270).save(infile, img_type)
 559 
 560             nim = Image.open(infile)
 561             nim.thumbnail((640, 640), Image.ANTIALIAS)
 562             os.remove(webf)
 563             nim.save(webf, img_type)
 564             nim.thumbnail((128, 128), Image.ANTIALIAS)
 565             os.remove(thumb)
 566             nim.save(thumb, img_type)
 567             msg = _('%(target)s rotated to right 90 degrees' % {
 568                   'target':target})
 569         else:
 570             msg = _('action not implemented: %s') % (command, )
 571     else:
 572         msg = _('Your are not allowed to change images on this page: %s') % (pagename,)
 573 
 574     if msg:
 575         AttachFile.error_msg(pagename, request, msg)
 576 
 577     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.
  • [get | view] (2011-04-14 07:28:03, 4.7 KB) [[attachment:CreateNewPage.py]]
  • [get | view] (2011-04-14 07:26:24, 4.2 KB) [[attachment:CreateNewPage1.6.py]]
  • [get | view] (2006-09-10 21:29:29, 40.4 KB) [[attachment:CreatePdfDocument2_0_3.py]]
  • [get | view] (2006-09-12 06:05:06, 40.5 KB) [[attachment:CreatePdfDocument2_0_4.py]]
  • [get | view] (2006-09-12 12:00:09, 40.6 KB) [[attachment:CreatePdfDocument2_0_5.py]]
  • [get | view] (2006-11-14 21:56:11, 43.5 KB) [[attachment:CreatePdfDocument2_0_6.py]]
  • [get | view] (2006-11-15 17:00:47, 43.8 KB) [[attachment:CreatePdfDocument2_0_7.py]]
  • [get | view] (2006-11-16 22:06:18, 43.8 KB) [[attachment:CreatePdfDocument2_0_8.py]]
  • [get | view] (2006-12-17 15:54:21, 43.6 KB) [[attachment:CreatePdfDocument2_0_9.py]]
  • [get | view] (2007-08-20 09:10:23, 67.2 KB) [[attachment:CreatePdfDocument2_1_0.py]]
  • [get | view] (2007-08-21 07:39:49, 67.1 KB) [[attachment:CreatePdfDocument2_1_1.py]]
  • [get | view] (2007-09-11 19:16:37, 67.3 KB) [[attachment:CreatePdfDocument2_1_2.py]]
  • [get | view] (2007-09-18 20:17:58, 68.1 KB) [[attachment:CreatePdfDocument2_1_3.py]]
  • [get | view] (2007-09-21 13:32:54, 71.1 KB) [[attachment:CreatePdfDocument2_1_4.py]]
  • [get | view] (2007-09-23 20:56:30, 73.4 KB) [[attachment:CreatePdfDocument2_1_5.py]]
  • [get | view] (2007-09-25 20:54:48, 74.5 KB) [[attachment:CreatePdfDocument2_2_0.py]]
  • [get | view] (2008-06-23 21:08:49, 77.0 KB) [[attachment:CreatePdfDocument2_3_0.py]]
  • [get | view] (2008-06-26 19:25:07, 81.0 KB) [[attachment:CreatePdfDocument2_3_1.py]]
  • [get | view] (2008-07-06 05:50:38, 83.1 KB) [[attachment:CreatePdfDocument2_3_2.py]]
  • [get | view] (2008-07-09 17:42:02, 83.3 KB) [[attachment:CreatePdfDocument2_3_3.py]]
  • [get | view] (2008-09-07 11:11:01, 83.5 KB) [[attachment:CreatePdfDocument2_3_4.py]]
  • [get | view] (2009-01-11 15:53:09, 84.3 KB) [[attachment:CreatePdfDocument2_3_5.py]]
  • [get | view] (2009-02-16 06:52:06, 84.2 KB) [[attachment:CreatePdfDocument2_3_6.py]]
  • [get | view] (2010-01-29 11:53:21, 82.8 KB) [[attachment:CreatePdfDocument2_4_0.py]]
  • [get | view] (2010-01-31 14:10:03, 84.6 KB) [[attachment:CreatePdfDocument2_4_1.py]]
  • [get | view] (2010-09-18 16:23:23, 85.6 KB) [[attachment:CreatePdfDocument2_4_2.py]]
  • [get | view] (2006-06-16 20:56:53, 4.9 KB) [[attachment:FlashManager.py-1.5.3-1]]
  • [get | view] (2003-12-07 18:15:53, 3.9 KB) [[attachment:HTML2MoinMoin.py]]
  • [get | view] (2005-10-16 08:24:35, 4.9 KB) [[attachment:HelpOn-1.3.5-4.py]]
  • [get | view] (2006-02-03 19:21:04, 4.9 KB) [[attachment:HelpOn-1.5.1-5.py]]
  • [get | view] (2006-07-04 10:45:22, 4.8 KB) [[attachment:HelpOn-1.5.4-6.py]]
  • [get | view] (2006-07-04 22:39:14, 4.8 KB) [[attachment:HelpOn-1.6.0-7.py]]
  • [get | view] (2006-07-06 13:50:17, 4.0 KB) [[attachment:HelpOn-1.6.0-8.py]]
  • [get | view] (2008-01-10 17:43:24, 4.8 KB) [[attachment:HelpOn-1.6.0-9.py]]
  • [get | view] (2008-08-19 14:44:54, 5.0 KB) [[attachment:HelpOn-1.7.1-10.py]]
  • [get | view] (2005-02-20 18:28:34, 10.8 KB) [[attachment:IRSS.py]]
  • [get | view] (2005-03-09 22:46:23, 2.9 KB) [[attachment:ImportHtml-1.2.py]]
  • [get | view] (2003-12-07 18:15:53, 2.8 KB) [[attachment:ImportHtml.py]]
  • [get | view] (2003-12-07 18:15:53, 1.8 KB) [[attachment:IrcChat.py]]
  • [get | view] (2008-06-09 11:27:20, 4.4 KB) [[attachment:MoinCrypt.py]]
  • [get | view] (2010-11-29 12:08:27, 7.5 KB) [[attachment:PageActions.py]]
  • [get | view] (2006-08-07 15:12:19, 0.5 KB) [[attachment:PermanentLink.py]]
  • [get | view] (2003-12-07 18:15:53, 6.3 KB) [[attachment:PhoneDial.py]]
  • [get | view] (2005-04-17 14:21:47, 3.6 KB) [[attachment:RecommendPage-1.3.4-1.py]]
  • [get | view] (2005-04-19 18:21:52, 5.5 KB) [[attachment:RecommendPage-1.3.4-2.py]]
  • [get | view] (2005-05-02 19:53:09, 5.6 KB) [[attachment:RecommendPage-1.3.4-3.py]]
  • [get | view] (2005-09-03 07:33:35, 6.3 KB) [[attachment:RecommendPage-1.3.4-4.py]]
  • [get | view] (2005-09-05 17:44:03, 6.9 KB) [[attachment:RecommendPage-1.3.5-5.py]]
  • [get | view] (2005-09-07 16:42:26, 7.5 KB) [[attachment:RecommendPage-1.3.5-6.py]]
  • [get | view] (2005-09-08 16:06:28, 7.7 KB) [[attachment:RecommendPage-1.3.5-7.py]]
  • [get | view] (2005-11-01 11:31:51, 9.0 KB) [[attachment:RecommendPage-1.3.5-8.py]]
  • [get | view] (2006-02-03 19:40:51, 8.3 KB) [[attachment:RecommendPage-1.5.1-9.py]]
  • [get | view] (2008-01-11 09:14:35, 6.8 KB) [[attachment:RecommendPage-1.6.0-10.py]]
  • [get | view] (2008-08-19 14:44:59, 6.9 KB) [[attachment:RecommendPage-1.7.1-11.py]]
  • [get | view] (2008-06-09 11:27:40, 1.7 KB) [[attachment:ShowActions.py]]
  • [get | view] (2008-06-09 10:34:02, 5.3 KB) [[attachment:ShowDecrypted.py]]
  • [get | view] (2005-03-30 21:17:28, 7.7 KB) [[attachment:Slideshow.py]]
  • [get | view] (2004-02-02 20:48:31, 2.0 KB) [[attachment:SubscribeUser.py]]
  • [get | view] (2007-01-26 17:08:30, 2.2 KB) [[attachment:Subscribers-1.6.0.py]]
  • [get | view] (2003-12-07 18:15:53, 1.8 KB) [[attachment:Subscribers.py]]
  • [get | view] (2006-03-18 23:16:51, 0.8 KB) [[attachment:UserPreferences.py]]
  • [get | view] (2004-01-05 09:56:25, 8.1 KB) [[attachment:VisualSiteMap.py]]
  • [get | view] (2015-08-30 21:04:23, 11.1 KB) [[attachment:VisualSiteMap_1.10.py]]
  • [get | view] (2004-10-08 10:59:16, 9.3 KB) [[attachment:VisualSiteMap_1.2.py]]
  • [get | view] (2005-03-16 01:30:09, 9.8 KB) [[attachment:VisualSiteMap_1.3.py]]
  • [get | view] (2014-08-19 01:34:10, 10.8 KB) [[attachment:VisualSiteMap_1.9.py]]
  • [get | view] (2007-08-18 18:52:55, 1.0 KB) [[attachment:backlink.py]]
  • [get | view] (2007-03-15 05:53:49, 23.5 KB) [[attachment:findandreplace0.1Beta.py]]
  • [get | view] (2005-03-27 20:32:10, 3.6 KB) [[attachment:gallery2image-1.3.3-1.py]]
  • [get | view] (2005-08-03 20:14:56, 4.0 KB) [[attachment:gallery2image-1.3.3-2.py]]
  • [get | view] (2005-11-13 18:10:26, 20.7 KB) [[attachment:gallery2image-1.3.5-10.py]]
  • [get | view] (2005-11-25 22:03:50, 20.8 KB) [[attachment:gallery2image-1.3.5-11.py]]
  • [get | view] (2005-08-08 17:23:43, 8.4 KB) [[attachment:gallery2image-1.3.5-4.py]]
  • [get | view] (2005-08-13 15:15:45, 13.7 KB) [[attachment:gallery2image-1.3.5-5.py]]
  • [get | view] (2005-08-31 22:05:22, 15.5 KB) [[attachment:gallery2image-1.3.5-6.py]]
  • [get | view] (2005-10-29 20:23:50, 15.9 KB) [[attachment:gallery2image-1.3.5-8.py]]
  • [get | view] (2005-11-01 11:31:24, 17.6 KB) [[attachment:gallery2image-1.3.5-9.py]]
  • [get | view] (2006-01-27 20:52:32, 20.9 KB) [[attachment:gallery2image-1.5.1-12.py]]
  • [get | view] (2006-08-06 09:01:01, 22.1 KB) [[attachment:gallery2image-1.5.4-13.py]]
  • [get | view] (2006-08-11 18:21:40, 22.2 KB) [[attachment:gallery2image-1.5.4-14.py]]
  • [get | view] (2006-11-16 20:23:27, 22.6 KB) [[attachment:gallery2image-1.5.6-16.py]]
  • [get | view] (2006-08-11 18:30:22, 22.2 KB) [[attachment:gallery2image-1.6.0-15.py]]
  • [get | view] (2008-02-06 10:13:45, 22.3 KB) [[attachment:gallery2image-1.6.0-16.py]]
  • [get | view] (2008-05-20 15:51:09, 22.4 KB) [[attachment:gallery2image-1.6.3-17.py]]
  • [get | view] (2006-09-06 06:19:48, 1.3 KB) [[attachment:getmmap.py]]
  • [get | view] (2004-07-18 09:48:00, 1.5 KB) [[attachment:localnames.py]]
  • [get | view] (2005-03-25 15:02:31, 2.6 KB) [[attachment:newpageonly.py]]
  • [get | view] (2005-03-30 09:02:00, 3.5 KB) [[attachment:newpageonly_20050330.py]]
  • [get | view] (2006-06-06 19:12:27, 9.7 KB) [[attachment:pdf.py]]
  • [get | view] (2006-08-30 10:51:51, 36.0 KB) [[attachment:pdf2_0_0.py]]
  • [get | view] (2006-08-30 13:57:36, 36.5 KB) [[attachment:pdf2_0_1.py]]
  • [get | view] (2006-02-04 04:25:29, 1.0 KB) [[attachment:sisterindex.py]]
  • [get | view] (2004-10-28 07:33:10, 0.7 KB) [[attachment:xml.py]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.