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') >>> mmName = manager.getConfig('mediaManager')
>>> mm = component.getAdapter(wiki, IMediaManager, name=mmName) >>> 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.setRawData('Some data we don\'t care about...')
>>> media01.getRawData() >>> media01.getRawData()
"Some data..." "Some data..."
>>> [(obj.name, obj.title) for obj in mm.listObjects()] >>> [(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', parser='docutils.rstx',
writer='docutils.html', writer='docutils.html',
linkManager='basic', linkManager='basic',
nodeProcessors=dict(reference=['default']), nodeProcessors=dict(reference=['default'],
image=['default']),
mediaManager='default', mediaManager='default',
) )

View file

@ -58,12 +58,14 @@ class LinkProcessor(object):
for link in lm.query(source=self.source, name=self.targetName): for link in lm.query(source=self.source, name=self.targetName):
#link = existing.next() #link = existing.next()
if link.target is not None: if link.target is not None:
target = manager.getObject(link.target) #target = manager.getObject(link.target)
target = self.getTarget(manager, wiki, link.target)
else: else:
target = None target = None
break break
else: else:
target = wiki.getPage(targetPageName) #target = wiki.getPage(targetPageName)
target = self.findTarget(manager, wiki, targetPageName)
link = lm.createLink(name=self.targetName, link = lm.createLink(name=self.targetName,
source=self.source, target=target) source=self.source, target=target)
if fragment: if fragment:
@ -83,6 +85,12 @@ class LinkProcessor(object):
self.markPresentation('create') self.markPresentation('create')
self.addText('?') 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): def fragmentAndParams(self, fragment, params):
f = p = '' f = p = ''
if fragment: if fragment:

View file

@ -24,6 +24,7 @@ $Id$
from zope.component import adapts from zope.component import adapts
from zope.interface import implements from zope.interface import implements
from zope.traversing.browser import absoluteURL
from cybertools.wiki.interfaces import IWiki, IMediaManager, IMediaObject from cybertools.wiki.interfaces import IWiki, IMediaManager, IMediaObject
@ -84,3 +85,17 @@ class MediaObject(object):
def setRawData(self, data): def setRawData(self, data):
self.data = 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"> <metal:content define-macro="wiki">
<h1 tal:content="context/title">Wiki</h1> <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"> <div tal:repeat="page view/listPages">
<a tal:attributes="href page/absolute_url" <a tal:attributes="href page/absolute_url"
tal:content="page/title" /> tal:content="page/title" /></div>
</div>
</metal:content> </metal:content>

View file

@ -5,6 +5,9 @@
<h1> <h1>
<span tal:content="context/title" />: <span tal:content="context/title" />:
<span i18n:translate="">Media Manager</span></h1> <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"> <form method="post" enctype="multipart/form-data">
<input type="hidden" name="form_action" value="upload" /> <input type="hidden" name="form_action" value="upload" />
<div> <div>

View file

@ -49,6 +49,17 @@ class BodyTranslator(HTMLTranslator):
def astext(self): def astext(self):
return u''.join(self.body_pre_docinfo + self.docinfo + self.body) 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): def visit_reference(self, node):
# copied from docutils.writers.html4css1 # copied from docutils.writers.html4css1
if node.has_key('refuri'): if node.has_key('refuri'):
@ -90,3 +101,8 @@ class HTMLNode(object):
class HTMLReferenceNode(HTMLNode): class HTMLReferenceNode(HTMLNode):
pass 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 docutils.nodes import Text
from zope import component
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.component import adapts from zope.component import adapts
from zope.interface import implements from zope.interface import implements
from cybertools.wiki.base.link import LinkProcessor 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): class Reference(LinkProcessor):
@ -55,3 +57,27 @@ class Reference(LinkProcessor):
def addText(self, text): def addText(self, text):
self.context.node.insert(0, Text(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 WikiManager as BaseWikiManager
from cybertools.wiki.base.wiki import Wiki as BaseWiki from cybertools.wiki.base.wiki import Wiki as BaseWiki
from cybertools.wiki.base.wiki import WikiPage as BaseWikiPage 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): class PersistentConfigInfo(PersistentMapping):
@ -118,8 +118,8 @@ class Wiki(BaseWiki):
return self.getId() return self.getId()
def getPages(self): 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''): def createPage(self, name, title, text=u''):
self[name] = self.pageFactory(name) 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.html import Writer as DocutilsHTMLWriter
from cybertools.wiki.dcu.rstx import Parser as DocutilsRstxParser from cybertools.wiki.dcu.rstx import Parser as DocutilsRstxParser
from cybertools.wiki.dcu import process 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 #from cybertools.wiki.tracking import link
@ -45,6 +45,13 @@ class PageURL(WikiURL):
self.context.name) 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): class Test(unittest.TestCase):
"Basic tests for the wiki package." "Basic tests for the wiki package."
@ -55,11 +62,13 @@ class Test(unittest.TestCase):
def setUp(testCase): def setUp(testCase):
component.provideAdapter(WikiURL, (IWiki, IBrowserRequest), IAbsoluteURL) component.provideAdapter(WikiURL, (IWiki, IBrowserRequest), IAbsoluteURL)
component.provideAdapter(PageURL, (IWikiPage, IBrowserRequest), IAbsoluteURL) component.provideAdapter(PageURL, (IWikiPage, IBrowserRequest), IAbsoluteURL)
component.provideAdapter(MediaURL, (IMediaObject, IBrowserRequest), IAbsoluteURL)
component.provideUtility(IntIdsStub()) component.provideUtility(IntIdsStub())
component.provideUtility(WikiConfiguration()) component.provideUtility(WikiConfiguration())
component.provideUtility(DocutilsHTMLWriter(), name='docutils.html') component.provideUtility(DocutilsHTMLWriter(), name='docutils.html')
component.provideUtility(DocutilsRstxParser(), name='docutils.rstx') component.provideUtility(DocutilsRstxParser(), name='docutils.rstx')
component.provideAdapter(process.Reference, name='default') component.provideAdapter(process.Reference, name='default')
component.provideAdapter(process.Image, name='default')
component.provideUtility(LinkManager(), provides=ILinkManager, component.provideUtility(LinkManager(), provides=ILinkManager,
name='cybertools.link') name='cybertools.link')
component.provideAdapter(WikiMediaManager, name='default') component.provideAdapter(WikiMediaManager, name='default')