Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Script Python de conversión de "HTML encoding" a ISO-8859-1 (Latin-1)

Última Actualización: 17 de Enero de 2003 - Viernes

Cuando convertí mi página web de un servidor HTTP normal (Apache) a ZOPE, supe que el usar codificaciones HTML me sería un problema en el futuro, para cosas como ZCatalog (búsquedas) o facilidad de edición con las nuevas herramientas. Así que me propuse revisar mi web por completo y convertir todas las codificaciones del tipo á a su equivalente "á", y similares. Las codificaciones HTML para caracteres españoles tenía su sentido en 1996, cuando empecé mi web, porque los servidores web no enviaban el idioma del documento en la cabecera. Además, en aquella época yo elaboraba mi web en un sistema informático (Atari) cuyo juego de caracteres no era LATIN-1 (ISO-8859-1).

Realizar la tradución "a mano" es inabordable, ya que mi web consta de más 600 documentos HTML individuales, en este momento (17/Ene/03). Realizar un script Python y traducir los documentos en el disco duro es más interesante, pero mis documentos ya estaban integrados en ZOPE y sacarlos fuera, convertirlos y volver a meterlos en ZOPE me pareció inconveniente. Así que lo consideré un reto para mejorar mi conocimiento de ZOPE. Y funcionó.

Los detalles de cómo recorrer recursivamente y modificar objetos ZOPE está documentado en otra página. El script es el siguiente:

tr={"¡":"¡","¿":"¿","ç":"ç","Ç":"Ç","ñ":"ñ","Ñ":"Ñ","ü":"ü","Ü":"Ü"}
for i,j in (('a','á'),('e','é'),('i','í'),('o','ó'),('u','ú')) :
  tr["&%cacute;"%i]=j
  i=i.upper()
  j=j.upper()
  tr["&%cacute;"%i]=j

def dequote(cadena) :
  for i,j in tr.items() :
    cadena=cadena.replace(i,j)
  return cadena

def arbol(obj) :
  a=[]
  for i in obj.objectValues() :
    id=i.getId()
    m=i.meta_type
    if m=="DTML Document" : a.append(i)
    if (m=="Folder") and (id!="temp_folder") : a.extend(arbol(i))
  return a

print "Pasando documentos de HTML Encoding a ISO-8859-1..."
for i in arbol(context) :
  a=i.raw
  b=dequote(a)
  if a!=b :
    print "  ",i.getId()
    i.manage_edit(b,i.title)

print "Operación completada."

return printed

Este script Python recorre el árbol de objetos ZOPE y convierte los objetos "DTML Document" de "HTML encoding" a ISO-8859-1 (Latin-1). Además, incluye una optimización para modificar sólo los objetos que necesitan ser modificados, evitando generar versiones nuevas de objetos ya convertidos.

Sería interesante también, para webs muy grandes, ir realizando transacciones granulares, en vez de una única transacción al terminar la conversión. Eso es importante para reducir la ocupación de memoria durante el proceso, ya que los objetos modificados durante una transacción son conservados en RAM hasta que la transacción se compromete. Pero no tenemos acceso a esas capacidades desde un script Python normal, sin realizar una configuración especial. Y, en el caso de mi web, esto no es un problema.

En todo caso se puede realizar también traducciones parciales, de directorios individuales, mediante los mecanismos de adquisición de ZOPE.

El script visualizará los documentos sobre los que se ha realizado alguna modificación. Los objetos no modificados no consumen memoria RAM, así que se puede lanzar el script de forma periódica, sobre sitios web muy grandes.

Un último detalle importante a recordar son los permisos. El script, típicamente, se ejecutará con los permisos del usuario que lo invoca. Si el script es accesible por usuarios "anónimos", cualquiera puede lanzarlo. Ello no es un problema de seguridad, porque cuando el script intente modificar un objeto ZOPE, lo hará con los permisos de usuario anónimo, y fallará. Pero aunque no haya que modificar objetos, se realiza el recorrido recursivo, lo que puede ser un proceso lento que consume muchos recursos.

La solución, evidente, es dar permiso de ejecución de este script, exclusivamente, a usuarios de confianza. E, incluso, limitarlo al "manager".



Python Zope ©2003 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS