Need advice on how to improve this function

Larry Bates larry.bates at websafe.com
Mon Aug 21 11:03:52 EDT 2006


Matthew Wilson wrote:
> I wrote a function that converts a tuple of tuples into html.  For
> example:
> 
>     In [9]: x
>     Out[9]:
>     ('html',
>      ('head', ('title', 'this is the title!')),
>      ('body',
>       ('h1', 'this is the header!'),
>       ('p', 'paragraph one is boring.'),
>       ('p',
>        'but paragraph 2 ',
>        ('a', {'href': 'http://example.com'}, 'has a link'),
>        '!')))
> 
> 
>     In [10]: as_html(x, sys.stdout)
>     <html>
> 
>     <head>
> 
>     <title>this is the title!</title>
> 
>     </head>
> 
>     <body>
> 
>     <h1>this is the header!</h1>
> 
>     <p>paragraph one is boring.</p>
> 
>     <p>but paragraph 2 <a href="http://example.com">has a link</a>!</p>
> 
>     </body>
> 
>     </html>
> 
> 
> I'd like to know ways to make it better (more efficient, able to deal
> with enormous-size arguments, etc).  How would I write this as a
> generator?
> 
> Here's the definition for as_html:
> 
> def as_html(l, s):
>     "Convert a list or tuple into html and write it to stream s."
>     if isinstance(l, (tuple, list)):
>         tagname = l[0]
>         if isinstance(l[1], dict):
>             attributes = ' '.join(['%s="%s"' % (k, l[1][k]) for k in l[1]])
>             s.write('<%s %s>' % (tagname, attributes))
>         else:
>             s.write('<%s>' % tagname)
>         if tagname in ('html', 'head', 'body'):
>             s.write('\n\n')
>         for ll in l[1:]:
>             as_html(ll, s)
>         s.write('</%s>' % tagname)
>         if tagname not in ('a', 'b', 'ul'):
>             s.write('\n\n')
>     elif isinstance(l, str):
>         s.write(l)
> 
> 
> All comments welcome. TIA
> 
Before you put too much work into this you might want to take a look
at HTMLgen:  http://www.python.net/crew/friedrich/HTMLgen/html/main.html

-Larry



More information about the Python-list mailing list