From 3dd9bdbe36c007632b7b086472b8c18dabcce34d Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 9 Mar 2009 13:42:10 +0000 Subject: [PATCH] handle URI fragment and parameters git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3268 fd906abe-77d9-0310-91a1-e0d9ade77398 --- wiki/README.txt | 54 +++++++++++++++++++++++++++++++++++++++-------- wiki/base/link.py | 40 ++++++++++++++++++++++++++++------- 2 files changed, 77 insertions(+), 17 deletions(-) diff --git a/wiki/README.txt b/wiki/README.txt index bab221e..d673f7a 100644 --- a/wiki/README.txt +++ b/wiki/README.txt @@ -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... `_ ... ''' @@ -80,11 +83,42 @@ Links to not yet existing pages

Back to the Start Page

?More...

+ href="http://127.0.0.1/demo_wiki/create.html?name=more">?More...

+ +Again a link object has been created that will be reused for subsequent +rendering operations. >>> len(links) 2 + >>> print aboutPage.render(TestRequest()) +

... +

?More...

+ >>> len(links) + 2 + +Links with fragments (anchor references) and parameters +------------------------------------------------------- + + >>> referencePage = wiki.createPage('reference') + >>> referencePage.text = ''' + ... References + ... ========== + ... + ... - `About content `_ + ... - `More content `_ + ... ''' + + >>> print referencePage.render(TestRequest()) +

References

+ + External links -------------- @@ -92,8 +126,8 @@ External links >>> linksPage.text = ''' ... **A collection of interesting links** ... - ... - http://python.org - ... - `Zope `_ + ... - http://python.org#library + ... - `Zope `_ ... ''' 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())

A collection of interesting links

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())

A collection of interesting links

>>> len(links) - 4 + 6 diff --git a/wiki/base/link.py b/wiki/base/link.py index 754f026..42497f0 100644 --- a/wiki/base/link.py +++ b/wiki/base/link.py @@ -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.')