Need advice on how to improve this function

M

Matthew Wilson

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
 
L

Larry Bates

Matthew said:
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
 
F

Fredrik Lundh

Matthew said:
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?

what makes you think that a generator would be the right tool for this
task? what's the use case?

(btw, generating "enormous-size" html pages strikes me as a rather
pointless exercise...)

</F>
 
G

Gabriel Genellina

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

Another very good library is <http://dustman.net/andy/python/HyperText>
(Don't be afraid of the date - it's just that HTML standards haven't
changed very much lately :) )



Gabriel Genellina
Softlab SRL





__________________________________________________
Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya!
http://www.yahoo.com.ar/respuestas
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top