handle URI fragment and parameters

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3268 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-03-09 13:42:10 +00:00
parent f45a870c27
commit 3dd9bdbe36
2 changed files with 77 additions and 17 deletions

View file

@ -71,6 +71,9 @@ from the page content.
Links to not yet existing pages
-------------------------------
When a referenced page does not exist yet a special link is created that
should lead to a view that will create the page.
>>> aboutPage.text += '''
... `More... <more>`_
... '''
@ -80,11 +83,42 @@ Links to not yet existing pages
<p><a class="reference"
href="http://127.0.0.1/demo_wiki/start_page">Back to the Start Page</a></p>
<p><a class="reference create"
href="http://127.0.0.1/demo_wiki/create.html?linkid=0000002">?More...</a></p>
href="http://127.0.0.1/demo_wiki/create.html?name=more">?More...</a></p>
Again a link object has been created that will be reused for subsequent
rendering operations.
>>> len(links)
2
>>> print aboutPage.render(TestRequest())
<p>...
<p><a class="reference create"
href="http://127.0.0.1/demo_wiki/create.html?name=more">?More...</a></p>
>>> len(links)
2
Links with fragments (anchor references) and parameters
-------------------------------------------------------
>>> referencePage = wiki.createPage('reference')
>>> referencePage.text = '''
... References
... ==========
...
... - `About content <about#content?language=en>`_
... - `More content <more#content?language=en>`_
... '''
>>> print referencePage.render(TestRequest())
<h1 class="title">References</h1>
<ul class="simple">
<li><a class="reference"
href="http://127.0.0.1/demo_wiki/about#content?language=en">About content</a></li>
<li><a class="reference create"
href="http://127.0.0.1/demo_wiki/create.html?name=more#content?language=en">?More content</a></li>
</ul>
External links
--------------
@ -92,8 +126,8 @@ External links
>>> linksPage.text = '''
... **A collection of interesting links**
...
... - http://python.org
... - `Zope <http://zope.org>`_
... - http://python.org#library
... - `Zope <http://zope.org?lang=de>`_
... '''
An absolute URL given as link target will not be changed in the process.
@ -101,14 +135,15 @@ An absolute URL given as link target will not be changed in the process.
>>> print linksPage.render(TestRequest())
<p><strong>A collection of interesting links</strong></p>
<ul class="simple">
<li><a class="reference" href="http://python.org">http://python.org</a></li>
<li><a class="reference" href="http://zope.org">Zope</a></li>
<li><a class="reference"
href="http://python.org#library">http://python.org#library</a></li>
<li><a class="reference" href="http://zope.org?lang=de">Zope</a></li>
</ul>
Nevertheless the links are registered in the link manager.
>>> len(links)
4
6
When we render external links repeatedly no new link objects will be
created.
@ -116,9 +151,10 @@ created.
>>> print linksPage.render(TestRequest())
<p><strong>A collection of interesting links</strong></p>
<ul class="simple">
<li><a class="reference" href="http://python.org">http://python.org</a></li>
<li><a class="reference" href="http://zope.org">Zope</a></li>
<li><a class="reference"
href="http://python.org#library">http://python.org#library</a></li>
<li><a class="reference" href="http://zope.org?lang=de">Zope</a></li>
</ul>
>>> len(links)
4
6

View file

@ -114,28 +114,52 @@ class LinkProcessor(object):
sourceUid = self.source.uid
lmName = self.source.getConfig('linkManager')
lm = manager.getPlugin(ILinkManager, lmName)
targetPageName = self.targetName
params = fragment = ''
if '?' in targetPageName:
targetPageName, params = targetPageName.split('?', 1)
if '#' in targetPageName:
targetPageName, fragment = targetPageName.split('#', 1)
existing = lm.query(source=sourceUid, name=self.targetName)
if existing:
link = existing.next()
#print '*** #1', self.targetName, link
if link.target is not None:
target = manager.getObject(link.target)
else:
target = wiki.getPage(self.targetName)
#print '*** #2', self.targetName, target
target = None
else:
target = wiki.getPage(targetPageName)
targetUid = target is not None and target.uid or None
link = lm.createLink(self.targetName, sourceUid, targetUid)
if link.refuri is None:
if fragment:
link.targetFragment = fragment
if params:
link.targetParameters = params
if self.request is not None:
if target is None:
link.refuri = '%s/create.html?linkid=%s' % (
absoluteURL(wiki, self.request), link.identifier)
uri = link.refuri = '%s/create.html?name=%s' % (
absoluteURL(wiki, self.request), link.name)
else:
link.refuri = target.getURI(self.request)
self.setURI(link.refuri)
uri = link.refuri = target.getURI(self.request)
uri += self.fragmentAndParams(fragment, params)
else:
uri = link.refuri + self.fragmentAndParams(
link.targetFragment,
link.targetParameters)
self.setURI(uri)
if target is None:
self.markPresentation('create')
self.addText('?')
def fragmentAndParams(self, fragment, params):
f = p = ''
if fragment:
f = '#' + fragment
if params:
p = '?' + params
return f + p
def setURI(self, uri):
raise ValueError('To be implemented by subclass.')