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')
|
>>> 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>
|
||||||
|
|
||||||
|
|
|
@ -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',
|
||||||
)
|
)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 /> </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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Add table
Reference in a new issue