[Zope3-dev] Re: [ZPT] Re: RFC: TALES adapters and TAL/Tales variable namespaces

Jim Fulton jim at zope.com
Thu May 27 06:19:56 EDT 2004


Evan Simpson wrote:
> Jim Fulton wrote:
> 
...

> Unless I'm misunderstanding something fundamental here, in the TALES 
> context an adapter is essentially a function accepting a single 
> argument. 

Yes, except s/function/callable

 > The "adapted" object that results from applying the adapter
> function is either used directly or further traversed.  All of the other 
> qualities that make up an Adapter (how it's registered, that it supports 
> ITALESAdapter, etc.) are irrelevant to its use in a TALES expression.

Yes, except that systems will define some predefined standard adapters
for providing common tasks, like formatting or meta-data access.

> Given all that, why do we need to shoehorn the adapter's name into the 
> same path segment as one of the traversal names? 

We don't.  In fact, one could argue that adaptation is a bit like
a different kind of traversal. In fact, in Zope 3, we already have
a notion of this. In general, in Zope 3 paths, we can say:

   foo/++namespace++name

where "/++namespace++" can be thought of as a special form of
namespace operator (similar and partly inspired by xpaths
"/:namespace:").

So, we could also use something like:

   content/++adapter++dc/title

but I think people want something more concide for ZPT.

I should point out that this has special importance for Zope 3
because Zope3 content objects don't provide any standard APIs.
You generally have to apply adapters to them to get at any standard
apis.

 > The above looks much
> more natural to me as one of:
> 
> a/b/c/(adapter)/d
> a/b/c/*adapter/d
> a/b/c/adapter()/d
> a/b/c/adapter:/d

Let me make these more concrete:

  context/(dc)/title
  context/*dc/title
  context/dc()/title
  context/dc:/title

IMO, if we take this route, we should think of the notation as
providing an alternate traversal operator.  That is, there is
syntax that either modifies or replaces "/", so of the examples
above, only:

  context/*dc/title

works for me.  For me:

   context->dc/title

can be read the same way. Basically, '->', is just a different
traversal operator.  FWIW, I find this more "natural" than any of
your examples. Of course, naturalness is highly subjective.

> 
> Note that the latter two forms allow for additional arguments.  While 
> not applicable to single-argument adapters, this is certainly a useful 
> feature if we don't restrict the syntax to adapters only.  In 
> particular, evan-pathprefix-branch uses the colon syntax to allow 
> applications such as "a/b/c/index:2/d" and "a/b/c/call:x,y/d".  This 
> same scheme can easily subsume adapters in either or both of two ways: 
> adapter as prefix, and adapter name as argument to a prefix.
> 
> tal:define="prefix foobar adapter:foo.bar"
> tal:content="a/b/c/foobar:/d"
> 
> ...or...
> 
> tal:define="prefix A builtin:adapters"
> tal:content="a/b/c/A:foo.bar/d"

I find I have to think waaaay to hard about what's going
on in these examples.  In particular, in the above
excample, "A" is working on both "a/b/c" and "foo.bar".
Basically, there is an extra level of indirection.

Jim

-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org




More information about the ZPT mailing list