[Gnucash-changes] r12054 - meta - Add TOC trac-wiki-macro.
Joshua Sled
jsled at cvs.gnucash.org
Sat Nov 26 17:47:06 EST 2005
Author: jsled
Date: 2005-11-26 17:47:05 -0500 (Sat, 26 Nov 2005)
New Revision: 12054
Trac: http://svn.gnucash.org/trac/changeset/12054
Added:
meta/TOC.py
meta/wiki-macros/
Log:
Add TOC trac-wiki-macro.
Added: meta/TOC.py
===================================================================
--- meta/TOC.py 2005-11-26 20:52:22 UTC (rev 12053)
+++ meta/TOC.py 2005-11-26 22:47:05 UTC (rev 12054)
@@ -0,0 +1,119 @@
+# vim: expandtab tabstop=4
+from StringIO import StringIO
+import re
+import string
+from trac.util import escape
+
+rules_re = re.compile(r"""(?P<heading>^\s*(?P<hdepth>=+)\s(?P<header>.*)\s(?P=hdepth)\s*$)""")
+anchor_re = re.compile('[^\w\d]+')
+
+def parse_toc(env, out, page, body, max_depth = 999, min_depth = 1):
+ current_depth = min_depth
+ in_pre = False
+ first_li = True
+ seen_anchors = []
+
+ for line in body.splitlines():
+ line = escape(line)
+
+ # Skip over wiki-escaped code, e.g. code examples (Steven N.
+ # Severinghaus <sns at severinghaus.org>)
+ if in_pre:
+ if line == '}}}':
+ in_pre = False
+ else:
+ continue
+ if line == '{{{':
+ in_pre = True
+ continue
+
+ match = rules_re.match(line)
+ if match:
+ header = match.group('header')
+ new_depth = len(match.group('hdepth'))
+ if new_depth < min_depth:
+ continue
+ elif new_depth < current_depth:
+ while new_depth < current_depth:
+ current_depth -= 1
+ if current_depth < max_depth:
+ out.write("</ol>")
+ out.write("<li>")
+ elif new_depth >= current_depth:
+ i = current_depth
+ while new_depth > i or first_li :
+ i += 1
+ first_li = False
+ if current_depth <= max_depth:
+ out.write("<ol>")
+ current_depth = new_depth
+ out.write("<li>")
+ default_anchor = anchor = anchor_re.sub("", header)
+ anchor_n = 1
+ while anchor in seen_anchors:
+ anchor = default_anchor + str(anchor_n)
+ anchor_n += 1
+ seen_anchors.append(anchor)
+ link = page + "#" + anchor
+ if current_depth <= max_depth:
+ out.write('<a href="%s">%s</a></li>\n' % (env.href.wiki(link), header))
+ while current_depth >= min_depth and not first_li:
+ if current_depth <= max_depth:
+ out.write("</ol>\n")
+ current_depth -= 1
+
+def execute(hdf, args, env):
+ db = env.get_db_cnx()
+ if not args:
+ args = ''
+ pre_pages = re.split('\s*,\s*', args)
+ # Options
+ inline = False
+ heading = 'Table of Contents'
+ pages = []
+ root = ''
+ params = { }
+ # Global options
+ for page in pre_pages:
+ if page == 'inline':
+ inline = True
+ elif page == 'noheading':
+ heading = None
+ elif page[:8] == 'heading=':
+ heading = page[8:]
+ elif page == '':
+ continue
+ elif page[:6] == 'depth=':
+ params['max_depth'] = int(page[6:])
+ elif page[:5] == 'root=':
+ root = page[5:]
+ else:
+ pages.append(page)
+ # Has the user supplied a list of pages?
+ if not pages:
+ pages.append(hdf.getValue("args.page", "WikiStart"))
+ root = ''
+ params['min_depth'] = 1 # Skip page title
+ out = StringIO()
+ if not inline:
+ out.write("<div class='wiki-toc'>\n")
+ if heading:
+ out.write("<h4>%s</h4>\n" % heading)
+ for page in pages:
+ # Override arguments
+ if page[:6] == 'depth=':
+ params['max_depth'] = int(page[6:])
+ elif page[:5] == 'root=':
+ root = page[5:]
+ else:
+ page = root + page
+ cursor = db.cursor()
+ cursor.execute("SELECT text FROM wiki WHERE name='%s' ORDER BY version desc LIMIT 1" % page)
+ row = cursor.fetchone()
+ if row:
+ parse_toc(env, out, page, row[0], **params)
+ else:
+ out.write('<div class="system-message"><strong>Error: Page %s does not exist</strong></div>' % page)
+ if not inline:
+ out.write("</div>\n")
+ return out.getvalue()
More information about the gnucash-changes
mailing list