Attachment 'Slideshow.py'

Download

   1 # -*- coding: iso-8859-1 -*-
   2 """
   3     MoinMoin - Slideshow action
   4 
   5     Usage - Allows treatment of a wiki page as a set of slides.  Displays a
   6             single slide at a time, along with a navigation aid.
   7 
   8             A slide show page looks like this:
   9 
  10                 general introduction or comments
  11                 = Slide 1 title =
  12                 Slide 1 contents
  13                 = Slide 2 title =
  14                 Slide 2 contents
  15                 ...
  16                 = Final slide title =
  17                 Final slide contents
  18 
  19             The slideshow action takes a parameter 'slidenumber', which is
  20             the (1-based) number of the slide to display.  The display uses
  21             the large screen 'projection' media.
  22 
  23             This action adds two sets of navigation aids for the slides:
  24             1) some javascript, so that mouse clicks or space bar move to the
  25                next page
  26             2) a navigation footer, similar to the [[Navigation]] macro
  27 
  28     History
  29     1.0 2005-03-25 First version
  30     1.1 2005-03-30 Revised thanks to some comments from NirSoffer.
  31                    Parse H1 tags instead of using the [[Slide]] macro.
  32                    Improve navigation.
  33                            
  34     @copyright: 2005 Jim Clark
  35     @license: GNU GPL, see COPYING for details.
  36 """
  37 
  38 import re
  39 from MoinMoin import config, wikiutil
  40 from MoinMoin.Page import Page
  41 from MoinMoin.parser.wiki import Parser
  42 from MoinMoin.formatter.text_html import Formatter
  43 
  44 header_re = r"^(?P<heading>\s*(?P<hmarker>=)\s(?P<htext>.*)\s(?P=hmarker))$"
  45 
  46 class slideshow:
  47     script_template = """
  48 <script type="text/javascript"><!--
  49 function firstSlide() {window.location="%s"}
  50 function prevSlide() {window.location="%s"}
  51 function nextSlide() {window.location="%s"}
  52 function lastSlide() {window.location="%s"}
  53 function handleKey(e) {
  54     var key;
  55     if (e == null) {key = event.keyCode} //IE
  56     else {if (e.altKey || e.ctrlKey) {return true} key = e.which} // Mozilla
  57     switch(key) {
  58         case 49: firstSlide(); break //'1'
  59         case 32: nextSlide(); break  //space
  60         case 60: prevSlide(); break  //'<'
  61         case 62: nextSlide(); break  //'>'
  62         default:
  63     }
  64 }
  65 document.onkeypress = handleKey
  66 //-->
  67 </script>"""
  68 
  69     def __init__(self, pagename, request):
  70         self.pagename = pagename
  71         try:
  72             self.slidenumber = int(request.form.get('slidenumber', [1])[0])
  73         except ValueError:
  74             self.slidenumber = 1
  75         request.formatter = Formatter(request)
  76         request.page = Page(request, pagename)
  77         request.formatter.page = request.page
  78         self.request = request
  79         self.page = self.request.page
  80         self.formatter = self.request.formatter
  81         self.body = self.page.get_raw_body()
  82         self._parseslides()
  83 
  84     def _parseslides(self):
  85         """ Parse slide content from the base page.  slideinfo is a tuple
  86         of (title, startcharacter, endcharacter) representing each slide.
  87         The slides are separated by H1 markers.
  88         """
  89         self.slideinfo = []
  90         title = ""
  91         h_pattern = re.compile(header_re, re.MULTILINE)
  92         laststart = 0
  93         for match in h_pattern.finditer(self.body):
  94             if laststart:
  95                 self.slideinfo.append((title, laststart, match.start()))
  96             title = match.group('htext').strip()
  97             laststart = match.start()
  98         if laststart:
  99             self.slideinfo.append((title, laststart, len(self.body)))
 100 
 101 
 102     def slideurl(self, slidenumber):
 103         """ Return a url for a link to another slide based on this page
 104         """
 105         return "%s/%s?action=Slideshow&slidenumber=%d" % \
 106                (self.request.getScriptname(), self.pagename, slidenumber)
 107 
 108     def navigationscript(self):
 109         """ Return a section of javascript for capturing mouse button and
 110         keyboard events and using for slide navigation.
 111         """
 112         urls = (self.slideurl(1),
 113                 self.slideurl(self.slidenumber - 1),
 114                 self.slideurl(self.slidenumber + 1),
 115                 self.slideurl(len(self.slideinfo) - 1))
 116         return (self.script_template % urls)
 117 
 118             
 119     def _makeslidelink(self, i, text=None):
 120         """ Return a URL link to slide number 'i'.  The url title will be the
 121         slide number and the title attribute will be the slide title.
 122         """
 123         if text == None:
 124             text = str(i)
 125         if i == self.slidenumber:
 126             return text
 127         else:
 128             return self.page.link_to(self.request, text=text, \
 129                          querystr='action=Slideshow&slidenumber=%d' % i, \
 130                          attrs='title="%s"' % self.slideinfo[i-1][0])
 131         
 132     def navigationtable(self):
 133         """ Return an HTML table for navigating between slides
 134         """
 135 
 136         # setup a start and end range around the current slide - up to 20
 137         # slides will be displayed
 138         slidestart = 1
 139         slideend = len(self.slideinfo)
 140         if slideend > 20:
 141             if self.slidenumber > 10:
 142                 slideend = min(self.slidenumber + 10, slideend)
 143                 slidestart = slideend - 19           
 144             else:
 145                 slideend = 20
 146         
 147         # Links to the parent page, and the first and previous slides
 148         items = []
 149         items.append(self.page.link_to(self.request, text='^',
 150                      attrs='title="Stop Slideshow"'))
 151         items.append(self._makeslidelink(1, '|<'))
 152         items.append(self._makeslidelink(max(self.slidenumber - 1, 1), '<<'))
 153 
 154         # Numbered slide links
 155         for i in range(slidestart, slideend + 1):
 156             items.append(self._makeslidelink(i))
 157 
 158         # Links to the next and last slides
 159         items.append(self._makeslidelink(min(self.slidenumber + 1,
 160                                              len(self.slideinfo)), '>>'))
 161         items.append(self._makeslidelink(len(self.slideinfo), '>|'))
 162         
 163         return self.formatter.table(1, {'tableclass': 'navigation'}) + \
 164                self.formatter.table_row(1) + \
 165                self.formatter.table_cell(1) + \
 166                "  ".join(items) + \
 167                self.formatter.table_cell(0) + \
 168                self.formatter.table_row(0) + \
 169                self.formatter.table(0)
 170 
 171     def render(self):
 172         """ Render a slide from a page """
 173         request = self.request
 174 
 175         # Non-existant slide requested.
 176         if self.slidenumber < 0 or self.slidenumber > len(self.slideinfo):
 177             request.http_headers()
 178             request.page.send_page(request, msg='End of slides') 
 179             return
 180         
 181         request.http_headers()
 182         request.setContentLanguage(request.lang)
 183         
 184         # Send the header in 'projection' mode - for large print and no headings
 185         # Q. Would it be better to use the slide title instead of the overall
 186         # page title?
 187         wikiutil.send_title(request, self.page.split_title(request, force=1),
 188                             print_mode=1, media='projection')
 189 
 190         # Extract the requested slide, and write it as a page in its own right,
 191         # along with the navigation aids
 192         request.write(self.navigationscript())
 193         request.write(request.formatter.startContent("content"))
 194         title, start, end = self.slideinfo[self.slidenumber - 1]
 195         parser = Parser(self.body[start:end], request)
 196         parser.format(request.formatter)
 197         request.write(self.navigationtable())
 198         request.write(request.formatter.endContent())
 199         wikiutil.send_footer(request, self.pagename, print_mode=1)
 200 
 201 def execute(pagename, request):
 202     slideshow(pagename, request).render()

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.