make image links work

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@4081 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2010-11-26 14:15:20 +00:00
parent b580d62951
commit 2be22a9dcb
10 changed files with 112 additions and 12 deletions

View file

@ -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 <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>

View file

@ -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',
)

View file

@ -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:

View file

@ -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)

View file

@ -24,10 +24,13 @@
<metal:content define-macro="wiki">
<h1 tal:content="context/title">Wiki</h1>
<div>
<a tal:attributes="href string:${context/absolute_url}/media.html"
i18n:translate="">Media Manager</a></div>
<h2 i18n:translate="">Wiki Pages</h2>
<div tal:repeat="page view/listPages">
<a tal:attributes="href page/absolute_url"
tal:content="page/title" />
</div>
tal:content="page/title" /></div>
</metal:content>

View file

@ -5,6 +5,9 @@
<h1>
<span tal:content="context/title" />:
<span i18n:translate="">Media Manager</span></h1>
<div>
<a tal:attributes="href context/absolute_url"
i18n:translate="">Back to Wiki</a><br />&nbsp;</div>
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="form_action" value="upload" />
<div>

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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')