==============================
Yet Another WikiWiki Framework
==============================
($Id$)
>>> from zope import component
>>> from zope.publisher.browser import TestRequest
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. We also set the ``linkManager`` configuration option explicitly
to make sure the correct link manager will be used.
>>> manager = WikiManager()
>>> linkManagerName = 'cybertools.link'
>>> manager.setConfig('linkManager', linkManagerName)
>>> 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**
... '''
The parser for restructured text and a corresponding HTML writer are the
default plugins used, so we can already render the page as HTML.
>>> print startPage.render(TestRequest())
<p><strong>Welcome to the Demo Wiki</strong></p>
Links to existing pages
-----------------------
We now create another page that contains a link to the start page.
>>> aboutPage = wiki.createPage('about')
>>> aboutPage.text = '''
... **Information about the Demo Wiki**
...
... This is the cybertools demo wiki.
...
... `Back to the Start Page <start_page>`_
... '''
>>> print aboutPage.render(TestRequest())
<p><strong>Information about the Demo Wiki</strong></p>
<p>This is the cybertools demo wiki.</p>
<p><a class="reference"
href="http://127.0.0.1/demo_wiki/start_page">Back to the Start Page</a></p>
Let's now have a look at the link manager - it should have recorded the link
from the page content.
>>> from cybertools.link.interfaces import ILinkManager
>>> linkManager = manager.getPlugin(ILinkManager, linkManagerName)
>>> links = linkManager.links
>>> len(links)
1
>>> link = links.values()[0]
>>> link.source, link.target, link.name
(0, 1, u'start_page')
Links to not yet existing pages
-------------------------------
When a referenced page does not exist yet a special link is created that
should lead to a view that will create the page.
>>> aboutPage.text += '''
... `More... <more>`_
... '''
>>> print aboutPage.render(TestRequest())
<p><strong>Information about the Demo Wiki</strong></p>
<p>This is the cybertools demo wiki.</p>
<p><a class="reference"
href="http://127.0.0.1/demo_wiki/start_page">Back to the Start Page</a></p>
<p><a class="reference create"
href="http://127.0.0.1/demo_wiki/@@create.html?name=more">?More...</a></p>
Again a link object has been created that will be reused for subsequent
rendering operations.
>>> len(links)
2
>>> print aboutPage.render(TestRequest())
<p>...
<p><a class="reference create"
href="http://127.0.0.1/demo_wiki/@@create.html?name=more">?More...</a></p>
>>> len(links)
2
Links with fragments (anchor references) and parameters
-------------------------------------------------------
>>> referencePage = wiki.createPage('reference')
>>> referencePage.text = '''
... References
... ==========
...
... - `About content <about#content?language=en>`_
... - `More content <more#content?language=en>`_
... '''
>>> print referencePage.render(TestRequest())
<h1 class="title">References</h1>
<ul class="simple">
<li><a class="reference"
href="http://127.0.0.1/demo_wiki/about#content?language=en">About content</a></li>
<li><a class="reference create"
href="http://127.0.0.1/demo_wiki/@@create.html?name=more#content?language=en">?More content</a></li>
</ul>
External links
--------------
>>> linksPage = wiki.createPage('links')
>>> linksPage.text = '''
... **A collection of interesting links**
...
... - http://python.org#library
... - `Zope <http://zope.org?lang=de>`_
... '''
An absolute URL given as link target will not be changed in the process.
>>> print linksPage.render(TestRequest())
<p><strong>A collection of interesting links</strong></p>
<ul class="simple">
<li><a class="reference"
href="http://python.org#library">http://python.org#library</a></li>
<li><a class="reference" href="http://zope.org?lang=de">Zope</a></li>
</ul>
Nevertheless the links are registered in the link manager.
>>> len(links)
6
When we render external links repeatedly no new link objects will be
created.
>>> print linksPage.render(TestRequest())
<p><strong>A collection of interesting links</strong></p>
<ul class="simple">
<li><a class="reference"
href="http://python.org#library">http://python.org#library</a></li>
<li><a class="reference" href="http://zope.org?lang=de">Zope</a></li>
</ul>
>>> len(links)
6
Media Objects
=============
>>> from cybertools.wiki.interfaces import IMediaManager
>>> mmName = manager.getConfig('mediaManager')
>>> mm = component.getAdapter(wiki, IMediaManager, name=mmName)
>>> media01 = mm.createObject('media01.jpg', 'Media Object #1')
>>> media01.setRawData('Some data we don\'t care about...')
>>> media01.getRawData()
"Some data..."
>>> [(obj.name, obj.title) for obj in mm.listObjects()]
[('media01.jpg', 'Media Object #1')]
Embed media objects (images) in Wiki text
-----------------------------------------
>>> imagePage1 = wiki.createPage('with_image')
>>> imagePage1.text = '''
... **A page with an image**
...
... .. image:: media01.jpg
...
... `Back to the Start Page <start_page>`_
... '''
>>> print imagePage1.render(TestRequest())
<p><strong>A page with an image</strong></p>
<img src="http://127.0.0.1/demo_wiki/.media/media01.jpg" />
<p><a class="reference"
href="http://127.0.0.1/demo_wiki/start_page">Back to the Start Page</a></p>
Link to media objects (files) in Wiki text
------------------------------------------
>>> imagePage2 = wiki.createPage('with_image_link')
>>> imagePage2.text = '''
... **A page with a link to an image**
...
... `Media Object #1 <media01.jpg>`_
...
... `Back to the Start Page <start_page>`_
... '''
>>> print imagePage2.render(TestRequest())
<p><strong>A page with a link to an image</strong></p>
<p><a class="reference"
href="http://127.0.0.1/demo_wiki/.media/media01.jpg">Media Object #1</a></p>
<p><a class="reference"
href="http://127.0.0.1/demo_wiki/start_page">Back to the Start Page</a></p>