diff --git a/wiki/README.txt b/wiki/README.txt index a1ff657..7ea85d3 100644 --- a/wiki/README.txt +++ b/wiki/README.txt @@ -167,10 +167,29 @@ Media Objects >>> mmName = manager.getConfig('mediaManager') >>> mm = component.getAdapter(wiki, IMediaManager, name=mmName) - >>> media01 = mm.createObject('media01', 'Media Object #1') + >>> 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', 'Media Object #1')] + [('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 `_ + ... ''' + + >>> print imagePage1.render(TestRequest()) +

A page with an image

+ +

Back to the Start Page

+ diff --git a/wiki/base/config.py b/wiki/base/config.py index a3e1c22..a1f5dd9 100644 --- a/wiki/base/config.py +++ b/wiki/base/config.py @@ -94,6 +94,7 @@ class WikiConfiguration(BaseConfiguration): parser='docutils.rstx', writer='docutils.html', linkManager='basic', - nodeProcessors=dict(reference=['default']), + nodeProcessors=dict(reference=['default'], + image=['default']), mediaManager='default', ) diff --git a/wiki/base/link.py b/wiki/base/link.py index c9fcb60..1a2f727 100644 --- a/wiki/base/link.py +++ b/wiki/base/link.py @@ -58,12 +58,14 @@ class LinkProcessor(object): for link in lm.query(source=self.source, name=self.targetName): #link = existing.next() if link.target is not None: - target = manager.getObject(link.target) + #target = manager.getObject(link.target) + target = self.getTarget(manager, wiki, link.target) else: target = None break else: - target = wiki.getPage(targetPageName) + #target = wiki.getPage(targetPageName) + target = self.findTarget(manager, wiki, targetPageName) link = lm.createLink(name=self.targetName, source=self.source, target=target) if fragment: @@ -83,6 +85,12 @@ class LinkProcessor(object): self.markPresentation('create') self.addText('?') + def findTarget(self, manager, wiki, name): + return wiki.getPage(name) + + def getTarget(self, manager, wiki, uid): + return manager.getObject(uid) + def fragmentAndParams(self, fragment, params): f = p = '' if fragment: diff --git a/wiki/base/media.py b/wiki/base/media.py index 2b0043e..f7405fb 100644 --- a/wiki/base/media.py +++ b/wiki/base/media.py @@ -24,6 +24,7 @@ $Id$ from zope.component import adapts from zope.interface import implements +from zope.traversing.browser import absoluteURL from cybertools.wiki.interfaces import IWiki, IMediaManager, IMediaObject @@ -84,3 +85,17 @@ class MediaObject(object): def setRawData(self, data): self.data = data + + # IWebResource + + @property + def uid(self): + return self.getUid() + + def getUid(self): + return self.parent.getManager().getUid(self) + #return self.getWiki().getManager().getUid(self) + + def getURI(self, request): + return absoluteURL(self, request) + diff --git a/wiki/browser/default.pt b/wiki/browser/default.pt index 55b24f7..0e3aabb 100644 --- a/wiki/browser/default.pt +++ b/wiki/browser/default.pt @@ -24,10 +24,13 @@

Wiki

+
+ Media Manager
+

Wiki Pages

-
+ tal:content="page/title" />
diff --git a/wiki/browser/media.pt b/wiki/browser/media.pt index 570e334..c2bd044 100644 --- a/wiki/browser/media.pt +++ b/wiki/browser/media.pt @@ -5,6 +5,9 @@

: Media Manager

+
+ Back to Wiki
 
diff --git a/wiki/dcu/html.py b/wiki/dcu/html.py index fd0633d..c41b20f 100644 --- a/wiki/dcu/html.py +++ b/wiki/dcu/html.py @@ -49,6 +49,17 @@ class BodyTranslator(HTMLTranslator): def astext(self): return u''.join(self.body_pre_docinfo + self.docinfo + self.body) + def visit_image(self, node): + # copied from docutils.writers.html4css1 + atts = {} + atts['src'] = node['uri'] + # TODO: provide processing of other attributes + suffix = '\n' + self.context.append('') + htmlNode = HTMLImageNode(self.document, node, atts) + self.processNode(htmlNode) + self.body.append(self.emptytag(node, 'img', suffix, **atts)) + def visit_reference(self, node): # copied from docutils.writers.html4css1 if node.has_key('refuri'): @@ -90,3 +101,8 @@ class HTMLNode(object): class HTMLReferenceNode(HTMLNode): pass + + +class HTMLImageNode(HTMLNode): + + pass diff --git a/wiki/dcu/process.py b/wiki/dcu/process.py index e72e967..1ddcbe1 100644 --- a/wiki/dcu/process.py +++ b/wiki/dcu/process.py @@ -23,12 +23,14 @@ $Id: process.py 3153 2009-01-17 16:51:09Z helmutm $ """ from docutils.nodes import Text +from zope import component from zope.cachedescriptors.property import Lazy from zope.component import adapts from zope.interface import implements from cybertools.wiki.base.link import LinkProcessor -from cybertools.wiki.dcu.html import HTMLReferenceNode +from cybertools.wiki.dcu.html import HTMLImageNode, HTMLReferenceNode +from cybertools.wiki.interfaces import IMediaManager class Reference(LinkProcessor): @@ -55,3 +57,27 @@ class Reference(LinkProcessor): def addText(self, text): self.context.node.insert(0, Text(text)) + + +class Image(Reference): + + adapts(HTMLImageNode) + + def findTarget(self, manager, wiki, text): + mmName = wiki.getConfig('mediaManager') + mm = component.getAdapter(wiki, IMediaManager, name=mmName) + return mm.getObject(text) + + def getTarget(self, manager, wiki, uid): + return manager.getObject(uid) + + def setURI(self, uri): + self.context.atts['src'] = uri + + @Lazy + def targetName(self): + return self.context.node['uri'] + + def markPresentation(self, feature): + pass + diff --git a/wiki/generic/mixin.py b/wiki/generic/mixin.py index f5d1c96..898b1c2 100644 --- a/wiki/generic/mixin.py +++ b/wiki/generic/mixin.py @@ -40,7 +40,7 @@ from cybertools.wiki.base.media import MediaObject from cybertools.wiki.base.wiki import WikiManager as BaseWikiManager from cybertools.wiki.base.wiki import Wiki as BaseWiki from cybertools.wiki.base.wiki import WikiPage as BaseWikiPage -from cybertools.wiki.interfaces import IWikiConfigInfo +from cybertools.wiki.interfaces import IWikiConfigInfo, IWikiPage class PersistentConfigInfo(PersistentMapping): @@ -118,8 +118,8 @@ class Wiki(BaseWiki): return self.getId() def getPages(self): - # TODO: restrict to wiki page objects - return dict((k, v) for k, v in self.getItems()) + return dict((k, v) for k, v in self.getItems() + if IWikiPage.providedBy(v)) def createPage(self, name, title, text=u''): self[name] = self.pageFactory(name) diff --git a/wiki/tests.py b/wiki/tests.py index 0218797..9642439 100755 --- a/wiki/tests.py +++ b/wiki/tests.py @@ -22,7 +22,7 @@ from cybertools.link.interfaces import ILinkManager from cybertools.wiki.dcu.html import Writer as DocutilsHTMLWriter from cybertools.wiki.dcu.rstx import Parser as DocutilsRstxParser from cybertools.wiki.dcu import process -from cybertools.wiki.interfaces import IWiki, IWikiPage +from cybertools.wiki.interfaces import IWiki, IWikiPage, IMediaObject #from cybertools.wiki.tracking import link @@ -45,6 +45,13 @@ class PageURL(WikiURL): self.context.name) +class MediaURL(WikiURL): + + def __call__(self): + return '%s/.media/%s' % (WikiURL(self.context.parent, self.request)(), + self.context.name) + + class Test(unittest.TestCase): "Basic tests for the wiki package." @@ -55,11 +62,13 @@ class Test(unittest.TestCase): def setUp(testCase): component.provideAdapter(WikiURL, (IWiki, IBrowserRequest), IAbsoluteURL) component.provideAdapter(PageURL, (IWikiPage, IBrowserRequest), IAbsoluteURL) + component.provideAdapter(MediaURL, (IMediaObject, IBrowserRequest), IAbsoluteURL) component.provideUtility(IntIdsStub()) component.provideUtility(WikiConfiguration()) component.provideUtility(DocutilsHTMLWriter(), name='docutils.html') component.provideUtility(DocutilsRstxParser(), name='docutils.rstx') component.provideAdapter(process.Reference, name='default') + component.provideAdapter(process.Image, name='default') component.provideUtility(LinkManager(), provides=ILinkManager, name='cybertools.link') component.provideAdapter(WikiMediaManager, name='default')