download: irc2html-f.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import re
from itertools import cycle

# La expresión regular que defino sirve para logs en dónde
# las líneas con mensajes de los usuarios tiene por ej la forma:
# '<pablo_!~pablo@r190-64-130-143.com.net.uy> [17:00] comprendido marga :)\n'

rex = '\<(?P<nombre>.+)!.*\>(?P<dicho>.+)$'
pat = re.compile(rex)

# La variable 'line_format' define como se verán las líneas del log. 
# La primera colorea el nombre del usuario. Si usás esta forma te 
# recomiendo también uses la primer lista de colores (son colores 
# más fuertes).
# La segunda, por el contrario, pinta con diferentes colores
# todo el fondo del texto correspondiente a cada usuario.

#line_format = "<span style='color:#%s'>%s:</span>%s<br/>"
line_format = "<div style='background-color:#%s'><b>%s:</b> %s</div>"

# Generador de colores:
#
# Para ayudar a distingir lo que dice un usuario de lo que dice otro,
# se utilizan distintos colores para cada uno.
#
# La idea original del generador de colores era que vaya saltando por
# la paleta de colores según un patrón matemático.
# La actual implementación es más simple y etática.

#color_list = ['ff0000', 'fff200', '00ff00', '00fff2', '0000ff', 'aa18ff',  \
#              'ff00fb', 'fbb636', 'b1466b', '3d3166',  'bfbf2e', '377972']

# Lighter colors:
color_list = ['fff1df', 'feffdf', 'e3ffce', 'ffe4df', 'fcdfff', 'e7dfff', \
              'e7f1ff', 'e7fff9', 'f3ffe7', 'e9e9e9', 'ffedb9', 'f0e9d5']

# El diccionario 'nombres' es utilizado para asegurarnos que se use 
# siempre el mismo color para un usuario determinado.

nombres = {}

def main():

    if len(sys.argv) < 2:
        print "Uso: ./irc2html charla.log > charla.html"
        sys.exit(0)

    #name_colors = color_gen(color_list)
    name_colors = cycle(color_list)

    f = open(sys.argv[1])
    for line in f.readlines():
        m = pat.match(line)
        if m:    
            nombre = m.group('nombre')    
            dicho = m.group('dicho')
            if nombre in nombres:
                color = nombres[nombre]
            else:
                color = name_colors.next()
                nombres[nombre] = color
            print line_format % (color, nombre, dicho)
        else:
            # Omito del log la información del tipo 'El usuario X se ha unido al canal Y'
            #print "<b>%s</b><br/>" % (line)
            pass
            
if __name__ == "__main__":
    main()

Copyright 2006, 2007 Juan Jose Conti - usar según los términos de la licencia GPL.