By blogging about it I can pretty much guarantee that someone will comment and say "Hey, why didn't you use the pypi/alreadyexists package which does the same thing but better". I couldn't find one after a quick search and I felt the hacker mood creeping up on my begging me to (re)invent it.

premailer.py takes a HTML page, finds all CSS blocks and transforms these into style attributes. For example, from this:


<html>
  <head>
    <title>Test</title>
    <style>
    h1, h2 { color:red; }
    strong {
      text-decoration:none
    }
    </style>
  </head>
  <body>
    <h1>Hi!</h1>
    <p><strong>Yes!</strong></p>
  </body>
</html>

You get this:


<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    <h1 style="color:red">Hi!</h1>
    <p><strong style="text-decoration:none">Yes!</strong></p>
  </body>
</html>

Why is this useful? When you're writing HTML emails. Like this newsletter app that I'm working on.

I just wrote it late yesterday and it needs lots of work to impress but for the moment it works for me. If I take the time to tidy it up properly I'll turn it into a package. Assuming there isn't one already :)

UPDATE

No available on github.com and as a PyPi package

UPDATE #2

Two new copy-cats have been released:

  • python-premailer which seems to do the same thing but without lxml (which is sort of the whole point)
  • inline-styler which also uses lxml but I don't know what it does differently or better

Might be worth poking around at these if my premailer isn't good enough.

Comments

Post your own comment
Walter Dörwald

XIST includes a function for doing this. An online version of the CSS inliner is available from http://lltools.appspot.com/CSSInliner.html

Marius Gedminas

I've been looking for something like this to use as a PyBlosxom plugin to inline styles in the RSS feed. And when I say "looking", I mean "posting a question and waiting for lazyweb to come up with an answer". So, thanks ;-)

What is the licence of your code?

Peter Bengtsson

No licence yet but I'm guessing something very forgiving. I've made a much improved version but haven't uploaded it yet.
I guess I'll stick it on pypi

Lionel Barret

funny I have done the same a few weeks ago. I'll compare with your module if there is anything I can add.

astro

This seems to be exactly what am I looking for. I installed it, but how can I use it? Can you post some instructions or tell us where to find them?

Anonymous

Very nice, thank you.

Alex Hayes

I've created a django template tag that can be used with premailer - see https://github.com/alexhayes/django-premailer

Peter Bengtsson

That is great!

Your email will never ever be published.

Previous:
My first iPhone web app - Crosstips iPhone interface July 1, 2009 iPhone
Next:
setuptools usability - not good, what can be done? July 15, 2009 Python
Related by category:
How I run standalone Python in 2025 January 14, 2025 Python
get in JavaScript is the same as property in Python February 13, 2025 Python
How to resolve a git conflict in poetry.lock February 7, 2020 Python
Best practice with retries with requests April 19, 2017 Python
Related by keyword:
Fastest way to turn HTML into text in Python January 8, 2021 Python
Premailer.io July 8, 2015 Python, Web development, AngularJS, JavaScript
mincss "Clears the junk out of your CSS" January 21, 2013 Python, Web development
CSS selector simplifier regular expression in JavaScript December 20, 2017 Web development, JavaScript