views:

208

answers:

3

It should be able to create, modify and read X/HTML in a highly object oriented way that still feels DOM like but is not obese, and is really Pythonic. Preferably it would deal with malformed HTML too, but we can skip this for templates.

For example, I'd like to do this:

>> from someAmazingTemplate import *
>> html = Template('<html><head><title>Hi</title></head><body></body></html>')
>> html.head.append('<link type="text/css" href="main.css" rel="stylesheet" />')
>> html.head.title
Hi
>> html['head']['title']
Hi

I should be able to use/define short functions and use them like this:

>> html.head.append(stylesheet(href="main.css"))
>> html.body.append(h1('BIG TITLE!12',Class="roflol"))
>> html.body.SOURCE
<body>
    <h1 class="roflol">
        BIG TITLE!12
    </h1>
</body>

Note: If it doesn't exist, I'm going to make it under BSD/MIT/Python license. Help is most welcome. Anything that works towards more Pythonic web app development will be great. Very much appreciate it!

-Luke Stanley

+1  A: 

have you looked at pyWeb ?

Perpetualcoder
Very briefly, I will look more
Luke Stanley
+1  A: 

Amara Bindery provides the most Pythonic XML API I've seen. See the quick reference, manual and faq

quark
Could be a good basis, thanks Quark! *investigating*
Luke Stanley
You know this is looking the most promising now I've had more time to compare it. It's inserting <?xml version="1.0" encoding="UTF-8"?> at the start of my HTML though. I'm looking for a fix right now.
Luke Stanley
I compiled the latest version, then this worked:>>> from amara import *>>> doc = parse('<html><head><title>Hi</title></head><body></body></html>')>>> print doc.xml_encode(("html-indent"))<html> <head> <title>Hi</title> </head> <body></body></html>more examples and wrapping action later
Luke Stanley
If you end up using it further I'd be interested too to hear what you like and what you don't. Perhaps update your question with what you end up doing.
quark
+2  A: 

The first part can for the most part be done by ElementTree, but it takes a few more steps:

>>> import xml.etree.ElementTree as ET
>>> html = ET.XML('<html><head><title>Hi</title></head><body></body></html>')
>>> html.head = html.find('head')
>>> html.head.append(ET.XML('<link type="text/css" href="main.css" rel="stylesheet" />'))
>>> html.head.title = html.head.find('title')
>>> html.head.title.text
'Hi'

The second part can be completed by creating Element objects, but you'd need to do some of your own work to make it happen the way you really want:

>>> html.body = html.find('body')
>>> my_h1 = ET.Element('h1', {'class': 'roflol'})
>>> my_h1.text = 'BIG TITLE!12'
>>> html.body.append(my_h1)
>>> html.body.SOURCE = ET.tostring(html.body)
>>> html.body.SOURCE
'<body><h1 class="roflol">BIG TITLE!12</h1></body>'

You could create a stylesheet function of your own:

>>> def stylesheet(href='', type='text/css', rel='stylesheet', **kwargs):
...     elem = ET.Element('link', href=href, type=type, rel=rel) 
...     return elem
... 
>>> html.head.append(stylesheet(href="main.css"))

And the whole document:

>>> ET.tostring(html)
<html><head><title>Hi</title><link href="main.css" rel="stylesheet" type="text/css" /></head><body><h1 class="roflol">BIG TITLE!12</h1></body></html>

But, I think if you're going to end up writing your own thing, this is a good place to start. ElementTree is very powerful.

Edit: I realize that this is probably not exactly what you're looking for. I just wanted to provide something as an available alternative and to also prove that it could actually be done without too much work.

jathanism
Very many thanks Synack. I will try and see if I can bash this into what I specified with some wrappers. Do you want to be kept up to date? I will post a followup here.
Luke Stanley
Absolutely, I would love to see how it turns out. I think this sounds fun.
jathanism
I'm actually using it as part of a MVC. I want to use it as the intermediary model. I have nothing against using templating languages as well though. If combined with PyJS (Pyjamas), it could be quite a powerful beast. I want to use a little JQuery too though.
Luke Stanley
If that's the case, have you considered Django? It has its own template system which is very easy to use, powerful, and extensible.
jathanism
I considered Django, TurboGears, Pylons and few others.It's too complex, I want something people can pick up instantly.I'm building a semantic desktop platform with parts of web technology but I don't want me, or other developers to have to spend time to focus on random details that aren't important like using html.find('head') instead of html.head - there are other things they need to think about instead.We have Python! I'd be happy to forget that HTML and Javascript is being used under the hood. It's just one layer of the model.I'm building a lifemap app: http://thoughttrail.com/intro/
Luke Stanley