[Twisted-web] Slot/pattern/key changes
Matt Goodall
twisted-web@twistedmatrix.com
Tue, 10 Feb 2004 22:58:20 +0000
On Tue, 2004-02-10 at 21:30, James Y Knight wrote:
> This is a set of *BACKWARDS-INCOMPATIBLE* changes that simplifies and
> clarifies the set of attributes nevow has for finding elements. Tests
> pass, and my app works (both after being updated slightly for the API
> changes).
>
> There used to be 3 attributes you could put on elements to locate them:
> slot, pattern, and key. They all did similar but slightly different
> things.
>
> - Filling slots with data is a useful concept but 'slot' shouldn' t be
> an attribute. A slot is something that gets replaced with the given
> data, and is thus better as a standalone element. It has been replaced
> with the following:
> slot('slotname') in a stan tree, or <nevow:slot name="slotname" /> in
> an (X)HTML template.
> context.slotted() (which could locate a slot) has been eliminated and
> replaced with context.fillSlots(slotname, stantree). Note that you
> cannot locate slots, you can just specify data for them to fill
> themselves with.
>
> - Assigning unique keys is also a useful concept, but it doesn't
> require the "context.keyed()" method. That method has been eliminated.
> HTMLRenderer used it to find the key="content" in HTML files used as
> sub-renderers, now it uses pattern="content".
>
> - Patterns remain as the only way to locate a sub-element of your
> renderer. There are now 3 methods to locate them, depending on what you
> want to do. patternGenerator() replaces patterns(), onePattern()
> semi-replaces keyed(), and allPatterns() replaces the direct use of
> specialMatches that the sequence renderer previous did. Please see the
> docs in context.py for these three methods for precise behavior.
>
> So, in summary, to convert your old code to new code:
> 1) If you had "div(style="border:1px", slot="myslot")" replace it with
> div(style="border: 1px")[slot("myslot")].
> 2) If you had a template with "<div style="border:1px"
> nevow:slot="myslot" />" replace it with "<div
> style="border:1px"><nevow:slot name="myslot" /></div>
> 3) If you had "context.slotted("myslot").clear()[a(href="foo")["bar"]]
> replace it with context.fillSlot("myslot", a(href="foo")["bar"]]
> 4) If you used keyed(), convert key= to pattern= and keyed() to
> onePattern().
> 5) If you used patterns(), just rename it to patternGenerator()
I have one more use case that is not possible/easy with the proposed
change:
HTML:
<a nevow:slot="email" class="whatever" href="email:">email</a>
Rendered by:
context.slotted('email')(href=['mailto:','a@bc.com'])['Mr X']
Result:
<a class="whatever" href="email:a@bc.com">Mr X</a>
>
> Also included in this patch are doc cleanups, removing excess xml()
> wrappings, replacing yield by return when possible, and the ability to
> use the "<nevow:invisible>" element in a (x)html template file, with
> the same behavior as the invisible stan tag.
>
> James
--
Matt Goodall, Pollenation Internet Ltd
w: http://www.pollenation.net
e: matt@pollenation.net
Any views expressed are my own and do not necessarily reflect
the views of my employer.