[Zope] Re: [ZPT] Recursive structures
Nikko Wolf
nikko-wolf at earthlink.net
Fri Jul 1 18:01:23 EDT 2005
Ian Bicking wrote:
> I'm surprised this has never come up for me before, but now I want to
> render a recursive data structure and I'm at a loss how I might do
> that in ZPT. Or, what the best workaround would be. E.g.:
>
> ['a', 'b', ['c', ['d', 'e']]]
>
> Becomes:
>
> <ul>
> <li>a</li>
> <li>b</li>
> <ul>
> <li>c</li>
> <ul>
> <li>d</li>
> <li>e</li>
> </ul>
> </ul>
> </ul>
>
>
> I guess the template could call itself repeatedly. Which means the
> list can't be embedded in any other markup. Hrm... in Cheetah I'd do:
>
> #def make_list(items)
> <ul>
> #for item in items
> #if isinstance(item, list)
> $make_list(item)
> #else
> <li>$item</li>
> #end if
> #end for
> </ul>
> #end def
> $make_list(items)
>
> It's a code-heavy template, and maybe it should just be written in
> Python, but it's also reasonable to allow people to add classes to
> items, further logic, etc.
>
I think it should *definitely* be written in Python, although a "Script
(Python)" should suffice. Add a "Script (Python)" with an ID of
"make_list" and a parameter list of "items" The following is untested,
but should work, I think. Beware of any special text in the strings
(&,<,>,etc).
######
text = "<ul>\n"
for item in items:
if isinstance( item, ( list, tuple )):
text += context.make_list( item )
else:
text += "<li>" + str(item) + "</li>\n"
return text + "</ul>"
############
More information about the Zope
mailing list