octubre 07, 2006

Reductor de HTML para páginas generadas por office

Tras pasar las vacaciones, el síndrome post-estacional (si, estacional, por que vacacional no ha sido mucho que se diga, millones de cosas que acabar que tenía uno) y un congreso de paso, vuelvo a tener un ratillo para escribir algo por aquí...

De todos es conocido que cuando haces una web con office mete mucha porquería dentro pero nunca llege a imaginar que de un archivo de 180Kbytes tan solo 10K's fueran de html real (del presentable que sirve para formar la web) :o, bueno como me han pedido que aligerara una web y había bastantes html's de 150K-200K... pues a mano va a ser que no.

Un rapido script en python que elimina los "comentarios" que introduce office, está especificamente hecho para el formato que he tenido entre manos, no se como de compatible podrá ser. Ahí va:


#C:/Python24/python.exe
# -*- coding: utf-8 -*-

import os, re

tag1_i="""<!--[if"""
tag1_f="""<![endif]-->"""

tag2="""<![if !vml]>"""
tag3="""<![endif]>"""

cuenta=0
cuentaglobal=0
debug=0

def reducir(cadena):
global cuenta

posi=cadena.find(tag1_i)
if posi != -1:
posf=cadena.find(tag1_f, posi+len(tag1_i))
if posf != -1:
cadena=cadena[0:posi]+cadena[posf+len(tag1_f):]
cuenta+=(posf-posi)
cadena=reducir(cadena)
else:
print '!! No se ha encontrado tag final para posicion: %i !!' % posi
cadena=cadena[0:posi]+cadena[posi+len(tag1_i):]

return cadena

def elimina_tags(cadena):
cadena=cadena.replace(tag2, '')
cadena=cadena.replace(tag3, '')
return cadena

def procesa_archivo(path):
global cuenta, cuentaglobal

cuenta=0
bin=open(path,'rb').read()
bin=reducir(bin)
bin=elimina_tags(bin)

if cuenta > 0:
if not debug: os.rename(path, path+'.backup')
print 'Guardado backup '+path+'.backup'
print 'Eliminados %i bytes' % cuenta
if not debug: open(path,'wb').write(bin)
print 'Guardada versi򬟲educida '+path

cuentaglobal+=cuenta

def procesa(arg, path, files):
m=re.compile('\.(htm|html)$', re.I)

for arch in files:
ppath=os.path.join(path, arch)
if os.path.isfile(ppath) and m.search(arch):
procesa_archivo(ppath)

if __name__ == '__main__':
os.path.walk('.', procesa, None)
print 'Reducidos %i bytes.' % cuentaglobal


Actualización:
Resulta que Microsoft ya tiene un programita que te quita los tags, Office 2000 HTML Filter 2.0, bueno, fue divertido ;D

Tags:

comentarios: