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:
parent
f45a870c27
commit
3dd9bdbe36
2 changed files with 77 additions and 17 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
target = manager.getObject(link.target)
|
||||
if link.target is not None:
|
||||
target = manager.getObject(link.target)
|
||||
else:
|
||||
target = None
|
||||
else:
|
||||
target = wiki.getPage(self.targetName)
|
||||
#print '*** #2', self.targetName, target
|
||||
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.')
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue