diff --git a/layout/browser/concept.py b/layout/browser/concept.py index 24cde89..c517372 100644 --- a/layout/browser/concept.py +++ b/layout/browser/concept.py @@ -22,6 +22,8 @@ Layout-based concept views. $Id$ """ +import re + from zope import component from zope.cachedescriptors.property import Lazy from zope.traversing.browser import absoluteURL @@ -45,7 +47,7 @@ class ConceptView(object): @Lazy def url(self): - return '%s/.%s' % (absoluteURL(self.node, self.request), self.context.uid) + return '%s/.%s-%s' % (absoluteURL(self.node, self.request), self.context.uid, normalize(self.context.title)) @property def children(self): @@ -54,3 +56,8 @@ class ConceptView(object): view.node = self.node yield view + +pattern = re.compile(r'[ /\?\+%]') + +def normalize(text): + return pattern.sub('-', text) diff --git a/layout/browser/traversal.py b/layout/browser/traversal.py index 29beeef..257b0ab 100644 --- a/layout/browser/traversal.py +++ b/layout/browser/traversal.py @@ -40,6 +40,8 @@ class NodeTraverser(ItemTraverser): def publishTraverse(self, request, name): if name.startswith('.'): if len(name) > 1: + if '-' in name: + name, ignore = name.split('-', 1) uid = int(name[1:]) target = util.getObjectForUid(uid) else: