Debido a la lentitud de cssutils (usé la versión 0.9.1b3) pobré libcroco y las diferencias de tiempo eran brutales (en un ejemplo real, pues ('real time') de procesar en 0,1 seg. a 0,4 seg.
Para la funcionalidad que necesito, me valen ambas, con lo cual en mi caso la elección está clara, ya que el tiempo de procesamiento me importa. Mi uso de la librería es muy rudimentario. Lo que realmente me interesa es el parseo en si, que me lo den, luego yo ya manejaré los datos a mi antojo...
Ahora bien, si el tiempo no te importan pues lo suyo es usar csstuils, porque libcroco te obliga a implementar bindings, ya que es C.
Con respecto a cssutils, comentar que ultimamente veo que el proyecto ha estado muy activo (van por la version 0.9.4a3), y que ahora está alojado en google code.
Bindings a libcroco
Para los bindings usé swig. No por decisión propia, sino porque ya lo usabamos.... No se si es lo mejor, pero es lo que hay.
En un primer intento lo que hice fue intentar atacar el interfaz de la librería. ¡Piiiiiip! Error.
Inabordable.
La solución fué hacer un recubrimiento en C sobre la librería, y hacer los bindings para ese recubrimiento.
En mi caso, el fichero de interfaz quedó como sigue:
%module css2av
%header %{
#include "css2av.h"
%}
typedef struct
{
char *selector;
char *declaration;
} AVStyleRule;
extern long numRules;
void freeResouces();
void process(const char *buffer,
long len
);
AVStyleRule *getRule(int index);
%include cpointer.i
%pointer_functions(AVStyleRule, AVStyleRulePtr)
Ya veis que api complejo y sofisticado me gasto ;)...
¿Que es necesario para generar los bindings?
- Pues los .h y .c del codigo c
- el .i (el codigo mostrado)
- Generar los bindings: swig -python [fichero]
- Compilar nuestro código de interfaz (el .c para obtener el .o)
- Compilar el código de los bindings (fichero [nombre_interfaz]_wrap.c ). Para compilarlo usar la opción -c del gcc e incluir con -L .../python
y -L .../python /config - Generar la librería: gcc -shared [nombre].o [nombre]_wrap.o -o _[nombre].so -L[ruta] -lcroco-0.6 -lglib-2.0 -lxml2 -lz -lm
import css2av
css2av.process(data,len(data))
for i in range(css2av.cvar.numRules):
styleRule = css2av.getRule(i)
print "Regla:",
css2av.AVStyleRulePtr_value(styleRule).selector,
css2av.AVStyleRulePtr_value(styleRule).declaration
css2av.freeResouces()
Como se puede apreciar, el código no es muy pythoniano. La solución es hacer un recubrimiento a los bindings mas pythoniano.
No hay comentarios:
Publicar un comentario