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:
parent
b580d62951
commit
2be22a9dcb
10 changed files with 112 additions and 12 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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',
|
||||
)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
||||
|
|
|
@ -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 /> </div>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<input type="hidden" name="form_action" value="upload" />
|
||||
<div>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Add table
Reference in a new issue