diff --git a/composer/message/instance.py b/composer/message/instance.py index 77c2b2a..e4695a2 100644 --- a/composer/message/instance.py +++ b/composer/message/instance.py @@ -88,10 +88,10 @@ class DataProvider(object): if key.startswith('@@'): if client is None: return '$' + key - viewName = key[2:] - request = self.data.get('request') or TestRequest() - view = component.queryMultiAdapter( - (client.manager, request), name=viewName) + view = self.getView(key[2:]) + #request = self.data.get('request') or TestRequest() + #view = component.queryMultiAdapter( + # (client.manager, request), name=key[2:]) if view is not None: return view() else: @@ -124,6 +124,11 @@ class DataProvider(object): else: raise KeyError(key) + def getView(self, name): + request = self.data.get('request') or TestRequest() + return component.queryMultiAdapter( + (self.context.client.manager, request), name=viewName) + class MessageTemplate(Template): diff --git a/wiki/README.txt b/wiki/README.txt index ff1f528..7c8a787 100644 --- a/wiki/README.txt +++ b/wiki/README.txt @@ -5,6 +5,31 @@ Yet Another WikiWiki Framework ($Id$) +An Example for an Elementary Wiki Structure +=========================================== + + >>> from cybertools.wiki.base.wiki import WikiManager, Wiki + +We create a wiki manager with one wiki that in turn contains a simple +start page. + + >>> manager = WikiManager() + >>> wiki = manager.addWiki(Wiki('demo_wiki')) + >>> startPage = wiki.createPage('start_page') + +We format the content of the start page using the restructured text format. + + >>> startPage.text = ''' + ... **Welcome to the Demo Wiki** + ... ''' + +As we have not yet registered any formatting plugins rendering the page +returns it content unchanged. + + >>> print startPage.render() + **Welcome to the Demo Wiki** + + A Very Basic Wiki Format ======================== diff --git a/wiki/base/wiki.py b/wiki/base/wiki.py index 57f401b..10f4c0a 100644 --- a/wiki/base/wiki.py +++ b/wiki/base/wiki.py @@ -33,14 +33,48 @@ class WikiManager(object): def __init__(self): self.wikis = {} - self.plugins = {} + + def addWiki(self, wiki): + name = wiki.name + if name in self.wikis: + raise ValueError("Wiki '%s' already registered." % name) + self.wikis[name] = wiki + wiki.manager = self + return wiki class Wiki(object): implements(IWiki) + def __init__(self, name, title=None): + self.name = name + self.title = title or name + self.pages = {} + + def createPage(self, name, title=None): + if name in self.pages: + raise ValueError("Name '%s' already present." % name) + page = self.pages[name] = WikiPage(name, title) + page.wiki = self + return page + class WikiPage(object): implements(IWikiPage) + + text = u'' + + def __init__(self, name, title=None): + self.name = name + self.title = title or name + + def render(self): + return self.write(self.parse()) + + def parse(self): + return self.text + + def write(self, tree): + return tree diff --git a/wiki/interfaces.py b/wiki/interfaces.py index 3e5f36e..044dde0 100644 --- a/wiki/interfaces.py +++ b/wiki/interfaces.py @@ -26,7 +26,67 @@ from zope.interface import Interface, Attribute class IWikiManager(Interface): - """Manages (and possibly contains) all kinds of wiki-related objects. + """ Manages wikis and wiki-related objects, like plugins. + """ + + wikis = Attribute('A collection of wikis managed by this object.') + + def addWiki(wiki): + """ Register the wiki given. + """ + + def removeWiki(wiki): + """ Remove the wiki given from the list of wikis. + """ + + +class IWiki(Interface): + """ A collection of wiki pages, or - more generally - wiki components. + """ + + manager = Attribute('The wiki manager this wiki is managed by.') + name = Attribute('The name or address of the wiki unique within the ' + 'scope of the wiki manager.') + pages = Attribute('A collection of the pages belonging to this wiki.') + + def createPage(name, title=None): + """ Create a new wiki page identified by the name (address - + may be a path) given and return it. + """ + + def removePage(name): + """ Remove the page identified by name from the wiki, cleaning up + all information related to the page. + """ + + +class IWikiPage(Interface): + """ An object representing a page of a wiki. + """ + + wiki = Attribute('The wiki this page belongs to.') + name = Attribute('A page name or address unique within the wiki.') + title = Attribute('A short string describing the wiki page the may be ' + 'use as a page title.') + text = Attribute('The page content in input text format.') + + def render(): + """ Convert the text of the page to presentation format. + """ + + def parse(): + """ Convert the text of the page to a document tree. + """ + + def write(tree): + """ Convert the document tree given to presentation format. + """ + + +# wiki elements + +class ILinkManager(Interface): + """Manages (and possibly contains) all kinds of wiki-related links. """ def registerLink(link):