Attachment 'TableOfAppendices-1.3.py'

Download

   1 # -*- coding: iso-8859-1 -*-
   2 """
   3     MoinMoin - TableOfAppendices Macro Version 1.3, 05.03.2015
   4 
   5 Inserts a table of appendicies (subpages) in the same format as a talbe of contents. If the subpage has a processing instruction #pragma alt-name, the value provided will be used as the link text in the appendices table.
   6 
   7 Usage: <<TableOfAppendices>>
   8 
   9 History:
  10 
  11 Version 1.3 - 05.03.2015: keep pragma for calling page and reset for subpages.
  12 
  13 Version 1.2 - 28.11.2012: added natual sorting and exclusion option for subpages.
  14 
  15 Version 1.1 - 30.10.2012: direct list construction, sorted list, aternative subpage naming.
  16 
  17 Version 1.0 - 19.12.2010: initial version.
  18 
  19 @copyright: 2010-2015 Ian Riley <ian@riley.asia>
  20  
  21 Based on:
  22     TableOfContents macro @copyright: 2007 MoinMoin:JohannesBerg
  23     PageList macro @copyright: 2001-2003 Juergen Hermann <jh@web.de>,
  24                                2003-2008 MoinMoin:ThomasWaldmann
  25                                2008 MoinMoin:ReimarBauer
  26                     
  27 @license: GNU GPL, see COPYING for details.
  28 """
  29 
  30 Dependencies = ["namespace"]
  31 
  32 import re
  33 from MoinMoin.Page import Page
  34 from MoinMoin import search, wikiutil
  35 
  36 def toInt(text):
  37     return int(text) if text.isdigit() else text
  38     
  39 def natKeys(text):
  40     return [ toInt(c) for c in re.split('(\d+)', text[1].lower()) ]
  41 
  42 def execute(macro, args):
  43     request = macro.request
  44     _ = request.getText 	
  45     
  46     saved_pragma = dict(request.pragma) # because pragma not reset by Page class  
  47     result = [] # this will return nothing if there are no subpages
  48     
  49     pname = macro.formatter.page.page_name
  50     subpnames = pname + u'/.+'
  51         
  52     altnames = []
  53     subpnames = re.compile(subpnames)
  54     pagelist = request.rootpage.getPageList(filter=subpnames.match)
  55     if pagelist: # only spend the time on this, if subpages exist
  56         fmt = macro.formatter.__class__(request)
  57         fmt._base_depth = macro.formatter._base_depth
  58         for pagename in pagelist:
  59             subpage = Page(request, pagename, formatter=fmt)
  60             subpage.request.pragma = {} # reset pragma
  61             pi = subpage.pi #rebuild pi including pragma for subpage
  62             altname = request.getPragma('alt-name')
  63             index = request.getPragma('index')
  64             if index != 'off':
  65                 if altname:
  66                     altnames.append([pagename, altname])
  67                 else:
  68                     altnames.append([pagename, pagename.replace(pname + '/', '')])
  69                 
  70         # sort text for display in lower case with natural sort for numerical parts       
  71         altnames = sorted(altnames, key=natKeys) 
  72 
  73         result = [
  74             '\n',
  75             macro.formatter.div(1, css_class="table-of-contents"),
  76             macro.formatter.paragraph(1, css_class="table-of-contents-heading"),
  77             macro.formatter.text(_('Appendices')),
  78             macro.formatter.paragraph(0),
  79             macro.formatter.number_list(1),
  80             ]
  81 
  82         for pagename, altname in altnames:
  83             result.extend([
  84                 '\n',
  85                 macro.formatter.listitem(1),
  86                 macro.formatter.pagelink(1, pagename),
  87                 macro.formatter.text(altname),
  88                 macro.formatter.anchorlink(0),
  89                 macro.formatter.listitem(0),
  90                 ])
  91         result.extend([
  92             macro.formatter.number_list(0),
  93             macro.formatter.div(0),
  94             ])
  95 
  96     request.pragma = dict(saved_pragma)	
  97     return ''.join(result)

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