""" MoinMoin - LinkedFrom Macro Modified from the OrphanedPages Macro by Jürgen Hermann and the PartialInclude Macro written by Seth Shikora. by Charles Crichton, Oxford University Computing Laboratory (2003) Charles.Crichton (in the domain of) comlab.ox.ac.uk I must say thanks to all those who have contributed to the MoinMoin markets - keep up the good work. Copyright (c) 2001 by Jürgen Hermann <jh@web.de> All rights reserved, see COPYING for details. Usage: [[LinkedFrom]] - List all the pages that statically link to the current page. [[LinkedFrom(regexp)]] - Only lists the linking pages that match the regular expression. Use this macro to show a list of all those pages that are linking to the current page. Optionally this list can be restricted to those pages that match a particular regular expression. I use it to keep a list of topic pages - such as ["Topic: UML"]. Each of these topics contains a [[LinkedFrom]] macro. I then have a page for each paper which I have read. If the paper covers a particular topic I place a link to the topic on the page related to the paper. ["Topic: UML"] for example. The page then shows up automatically on the topic page. """ # Imports from MoinMoin import config, user, wikiutil from MoinMoin.Page import Page from MoinMoin.i18n import _ import sys, cStringIO, re _guard = 0 def execute(macro, args): if not args: pagename_re = re.compile(".*") else: try: pagename_re = re.compile(args) except re.error, e: return '<p><strong class="error">%s</strong></p>' % _('Error in regular expression.') # prevent recursive calls global _guard if _guard: return '' _guard = 1 pages = wikiutil.getPageList(config.text_dir) pagelist = filter(pagename_re.search, pages) linkedfrom = {} this_page = macro.formatter.page for other_page_name in pagelist: other_page = Page(other_page_name) if other_page != this_page: links = other_page.getPageLinks(macro.request) for link in links: if link == this_page.page_name: linkedfrom[other_page.page_name] = other_page.page_name _guard = 0 # check for the extreme case if not linkedfrom: return "" #"<p><b>%s</b></p>" % _("No other pages link to this page in this wiki.") # return a list of page links linkedfromnames = linkedfrom.keys() linkedfromnames.sort() result = macro.formatter.bullet_list(1) for name in linkedfromnames: if not name: continue result = result + macro.formatter.listitem(1) result = result + macro.formatter.pagelink(name, generated=1) result = result + macro.formatter.listitem(0) result = result + macro.formatter.bullet_list(0) return result