Page 1

UNIVERSIDAD MAYOR DE SAN ANDRES Facultad de Ciencias Puras y Naturales Postgrado en Informรกtica Programaciรณn Orientada a Objetos

FRAMEWORKS DE TEMPLATES Y XML Presentado a:

Ing. M. Sc. Esteban Saavedra

Presentado por: Roger Saravia & J. J.

La Paz, Bolivia - Septiembre de 2007


1

Introducción

El escenario de este trabajo se desarrolla en el área de los frameworks; específicamente en los frameworks de templates y XML. El problema identificado es el cómo elegir un framework de templates y XML dadas ciertas necesidades. Se abordará el problema mediante la presentación y descripción de los principales frameworks de templates y XML.

2

Objetivo General

El objetivo general de este trabajo es comparar las principales características de los frameworks de templates y XML más difundidos.

2


3

Marco Teórico (Síntesis)

3.1 ¿Qué es un Framework de Templates y XML?

Un framework de templates y XML es principalmente un motor de plantilla (template) inteligente con relación al lenguaje de marcado. Un framework de templates es capaz de procesar el marcado como un flujo de eventos (streams). Además proporciona varias herramientas para generar o trabajar con XML y HTML.

3.2 ¿Por qué un Framework de Templates?

Porque usar templates basados en texto para producir XML genera fácilmente errores y porque considerar todos los casos podría ser no práctico. Los sistemas basados en solo texto han fallado incluso a gente preparada que ha procurado hacer las cosas bien.

3


3.3 ¿Y Cómo Funciona?

Ilustración 1. Funcionamiento de un framework de templates y XML según Christopher Lenz (http://www.cmlenz.net). 4


Casi todos los frameworks de templates usan el lenguaje Python como lenguaje base. Por ejemplo, mediante el uso del API de Python y usando la clase Template, se tiene:

Ejemplo 1. Generaciรณn de un template mediante cรณdigo de Python (D. A. R.)

5


3.4 Stream de Marcado: Anatomía

El stream de marcado es básicamente una acción cíclica sobre lo que se conoce como un evento de marcado. Por ejemplo:

Ejemplo 2. El stream y un evento de marcado (D. A. R.) 6


3.5 ¿Cuándo se Produce un Stream de Marcado?  La generación de un template produce un stream.  El parsing de un HTML o XML produce un stream.  Los streams pueden ser generados programáticamente.

3.6 Procesando Streams

Un procesamiento Incluye los siguientes pasos: iterar, verificar la clase, ejecutar o hacer algo y producir. Ejemplo 3: Coloca en mayúsculas las etiquetas que no están a lado de un espacio (D. A. R.)

7


3.7 Filtrado de Streams

Se trata de rutinas del paquete de filtrado de streams capaces de re-usar streams; un objeto que toma un stream y retorna otro. Ejemplo:

Ejemplo 4. Se filtra un stream removiendo cierta informaciรณn y produciendo otro stream. (D. A. R.)

8


3.8 Streams: Serializaci贸n

Consiste en la producci贸n de texto a partir de distintos eventos de streams. formatos de serializaci贸n para XML, XHTML, HTML y texto plano.

Hay

Ejemplo 5. Serializaci贸n (D. A. R.)

9


3.9 Escaping (Elemento del Funcionamiento de los Frameworks de Templates)

Los templates requieren que uno explícitamente haga el “escapeo” de datos. Y tener que “escapear” datos es bastante común.

Ejemplo 6. Una página sin “escapeo” (D. A. R.) 10


3.10

Saneamiento HTML

Muchas veces hay la necesidad de permitir al usuario ingresar código HTML para entrar marcado. Podría ser para la entrada de texto con formato. El foro de participación de la plataforma de educación virtual Moodle es un ejemplo. Además porque puede haber la necesidad de protegerse ante un usuario pirata que aproveche ésta opción para filtrar código malicioso. Ejemplo 7: El no saneamiento del código HTML causó que una compañía extranjera de poleras imprima prendas alteradas (D. A. R.).

11


3.11 Otras Funciones Avanzadas  La clonación de formularios HTML llenados con datos.  Los transformadores o filtros streams para realizar transformaciones dentro de las etiquetas capturadas por el stream.

Ejemplo 8: Accesibilidad para gente que la necesita (D. A. R.)  Internacionalización.

12


3.12 Rendimiento  El trabajo con templates basados en XML es computacionalmente más “caro” que el trabajo con templates basados en puro texto. Esto se debe a que en el primero se tratan con etiquetas, elementos, atributos y todo aquello; mientras que en el caso de solo texto se tienen caracteres o bytes.  No se recomienda el uso excesivo de XML templates.

4 Casos de Estudio

4.1

Mako

Mako es una librería para templates escrita en Python. Provee una familiar sintaxis noXML que se compila en módulos Python para un máximo rendimiento. La sintaxis de Mako y su API emergen de las mejores ideas de muchos otros como: Django, Cheetah, Myghty, and Genshi. Conceptualmente, Mako es un “pitón” embebido (como es Python Server Pages) pero con un refinamiento del diseño mediante componentes y herencia para producir uno de los modelos más robustos y flexibles. 13


Mako es usado por el sitio Pytho.org. Un vistazo a su cĂłdigo:

<%inherit file="base.html"/> <% rows = [[v for v in range(0,10)] for row in range(0,10)] %> <table> % for row in rows: ${makerow(row)} % endfor </table> <%def name="makerow(row)"> <tr> % for name in row: <td>${name}</td>\ % endfor </tr> </%def>

Mako puede ser considerado como la siguiente generaciĂłn de sistemas de templates y hasta podrĂ­a establecerse como el lenguaje por defecto de Pythons web framework.

14


Características:  API simple.  Rápido.  Estructuras de control como loops sobre la base del lenguaje Python.  Se puede incluir bloques de código Python.  Puede acceder a variables fuera del template.  Puede tener anidaciones múltiples.  Puede especificar varios argumentos Python en las firmas (métodos).  Bloques del tipo llamables (callables).  Manejo avanzado de herencia.

15


4.2 Kid

Es un lenguaje de templates simple para vocabularios basados en XML escrito en Phyton. La sintaxis del lenguaje fue inspirada en lenguajes de templates existentes como XSLT, TAL, PHP. Como hay una variedad de herramientas que trabajan con documentos XML en Phyton, generar XML es tedioso y es común cometer errores. APIs como SAX, DOM, o ElementTree pueden garantizar la construcción de la salida pero requiere que esos documentos estén creados enteramente en Python. Los lenguajes de templates como Cheetah o PTL generan texto de contenido fácil pero ofrecen poco ayudar para asegurar que el rendimiento sea el correcto. Usar herramientas basadas en texto para generar XML puede generar datos errados.

Características  Kid es un intento de traer los beneficios de estas tecnologías juntas en un paquete coherente y único.

16


 Kid también permite al programador explotar la estructurada de XML escribiendo filtros y transformaciones que trabajan al XML. Kid templates usa un generador para producir ítems.  Kid puede usarse para generar cualquier tipo de documento XML incluyendo XHTML, RSS, Átomo, FOAF, RDF, XBEL, XSLT, RelaxNG, Schematron, SOAP, etc.  Kid soporta características mas avanzadas como condicionales (py:if), iteración (py:for), y sub templates reusables (py:def).  Kid templates debería usar archivos con extensión .kid si esta importando el módulo de templates usando el código normal de Phyton. El import hood de Kid confía en el archivo de extensión .kid que esta presente.

Ventajas  Cada template de modulo exporta una clase llamada “Template”. Una instancia de template es obtenida de una de las tres maneras siguientes:  La función Template es la mejor forma. 17


 Habilitando el import hood, usando el import de Pitón para obtener el modulo y recuperando la clase Template.  Llamando a la función kid_load_template y recuperando la clase Template.  Las salidas pueden ser en formato XML o WML(wireless markup languaje).

Requerimientos:  Kid requiere plataforma Pitón 2.3 y el paquete ElementTree

Forma de instalación:

Extraer las fuentes en una carpeta y ejecutar setup.py, como lo muestra el siguiente código. $ gzip -dc kid-0.9.5.tar.gz | tar xvf $ cd kid-0.9.5 $ python setup.py install 18


Si no incluye los argumentos extras en la instalación, podrá instalar los siguientes ítems: Librerías Phyton en el directorio site-packages. Comandos kid y kidc como script de Phyton.

Un vistazo a su código:

<?python title = "The Mandelbrot Set" def color(x,y): z = c = complex(x, -y)/100.0 for n in range(16): z = z*z + c if abs(z) > 2: break return "#%x82040" % n ?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"> <head> <title py:content="title" /> </head> <body bgcolor="black" text="white"> <table width="100%" height="100%"> 19


<tr> <td align="center" valign="middle"> <h1 py:content="title" /> <table cellspacing="1" cellpadding="2"> <tr py:for="y in range(-150, 150, 5)"> <td py:for="x in range(-250, 100, 5)" bgcolor="${color(x,y)}" /> </tr> </table> </td> </tr> </table> </body> </html>

4.3

Genshi

Genshi provee un motor de template que puede usarse para generar otros marcados (tal como HTML o XML) o texto simple. Mientras ambos comparten algo de la sintaxis (y mucha de la implementaciรณn) ellos se separan esencialmente por el lenguaje.

20


Los templates son XML o archivos de texto plano que incluyen directivas de procesamiento que afectan al rendimiento de los templates, y templates de expresiones que son sustituidas dinámicamente por datos variables.

Características  Sentencias condicionales como: py:if, py:choose  Iteraciones como: py:for  Reusar Snippet como: py:def, py:match  Variable Binding como: py:with  Manipulación de estructuras como: py:attrs, py:content, py:replace, py:strip  Además de includes para templates de texto e includes dinámicos.

Forma de Instalación

Extraer los fuentes en una carpeta y ejecutar $ easy_install Genshi 21


Un vistazo a su cรณdigo:

<?python title = "A Genshi Template" fruits = ["apple", "orange", "kiwi"] ?> <html xmlns:py="http://genshi.edgewall.org/"> <head> <title py:content="title">This is replaced.</title> </head> <body> <p>These are some of my favorite fruits:</p> <ul> <li py:for="fruit in fruits"> I like ${fruit}s </li> </ul> </body> </html>

22


Este ejemplo muestra:

a. Un bloque de código de Phyton, usando una instrucción de procesamiento. b. La declaración del namespace de Genshi. c. El uso de directivas de templates (py:content y py:for). d. Expresión de Phyton (${fruit}).

El template generaría una salida parecida a:

<html> <head> <title>A Genshi Template</title> </head> <body> <p>These are some of my favorite fruits:</p> <ul> <li>I like apples</li> <li>I like oranges</li> <li>I like kiwis</li> </ul> 23


</body> </html>

Un template de texto es un documento de texto plano que puede contener tambiĂŠn cĂłdigo empotrado de Python. Los templates de texto pueden usarse para generar formato de texto no marcado, tal como el cuerpo de un email de texto plano. Por ejemplo:

Dear $name, These are some of my favorite fruits: #for fruit in fruits * $fruit #end

24


4.4

Otros Lenguajes Usados

FXT Templating  Flex Templating proporciona una rica técnica de templating del lado del cliente usando MVC (Model-View-Controller). FXT soluciona una variedad de problemas mediante el uso de su tecnología Flex en combinación con Flash Player.  La clave está en que el modelo incluido dentro del HTML controla la vista de una aplicación tipo Flex. En una aplicación típica basada en HTML, el modelo de datos y las etiquetas (la vista) van mezcladas. Pero con FXT el modelo de datos y la vista son separadas del código del template Flex hasta que arriban a la PC del usuario.

TAL (Template Attribute Language)  Para XML templating.  Basado en atributos  TAL y Kid consisten enteramente de atributos y no de elementos.

25


XSLT (XSL Transformations)  Templating  XSLT siempre ha brillado por realizar transformaciones a partir del “macheo” de los nombres de elementos en el documento original y convertirlos en salida. O sea hacer cambios en las mismas etiquetas.  Una desventaja del XSLT es que es bastante complejo para hacer simple templating. Además no todo está escrito en XML; razón por la cual, XSLT está limitado.

PXTL (Python XML Template Language)  Lenguaje completo aunque muy aparatoso.  No muy usado.

PTL (Python Template Language)  Lenguaje basado en texto que no satisface todos los requerimientos.  Comentario: Kid hace lo mismo pero con documentos XML.

26


4.5

Otros Lenguajes Menos Usados

Cheetah Característica

Observación

Caché

[X]

Velocidad

moderada No es muy rápido en el tema de las librerías.

Wysiwyg

[]

Flexibilidad

Grande

Diseño tipo Python

[X]

Puro python

Sintaxis XML

[]

Curva de aprendizaje

Corta

Comunidad

Grande

Resumen

Se pueden compilar los templates como clases Python.

No. Usar un editor de texto.

Puede usar los constructos de Python en el mismo template.

No

Cheetah es uno de los más sencillos y comprensivos motores de templates. Buena documentación. 27


ClearSilver Característica Cache

Observación []

Velocidad

No se tienen pruebas todavía.

Wysiwyg

[]

Flexibilidad

Grande

Diseño tipo Python

Escrito en C pero incluye controladores para Python, Ruby, Perl, y Java

Puro python

No

Sintaxis XML

[X]

Curva de aprendizaje

Corta

Comunidad

Pequeña

Un resumen:

No. Usar cualquier editor de texto.

ClearSilver usa un enfoque controlado por conexión a datos que completamente separa el diseño de la aplicación lógica. 28


PyMeld Característica Caché

Observación []

Velocidad

Aún no se tienen pruebas.

Wysiwyg

[X]

Flexibilidad

Marcado

Diseño tipo Python

[X]

Puro python

Sintaxis XML

Templates consistentes en puro HTML/XHTML.

Bastante.

No. Basado en el atributo "id" del HTML/XHTML.

Curva de aprendizaje

Corta

Comunidad

Ninguna

Resumen:

Dejado al usuario.

Elegante y única herramienta para manipular HTML de manera pitónica. Cualquier elemento (X)HTML con atributo "id" puede ser manipulado. 29


Xyaptu Característica Caché

Observación []

Velocidad

No. No se ha probado aún.

Wysiwyg

[]

Solo mediante el uso de etiquetas XML.

Flexibilidad

Buena

Búcles, condicionales y otros.

Diseño tipo Python

[X]

Usa diccionarios, cadenas y generadores.

Puro python

[X]

Bastante.

Elementos del Lenguaje

7

Sintaxis de marcado.

Curva de aprendizaje

Muy corta

Comunidad

Pequeña

Resumen

Xyaptu es la sigla de: eXtended Yet Another Python Templating Unit

30


ZPT Característica

Observación

Caché

[]

Velocidad

[]

WYSIWYG

[]

Diseño tipo Python

[]

No se sabe.

El XHTML puede ser editado en WYSIWYG pero el scripting debe ir entre espacios de nombre XML.

Flexibilidad Integration Puro Python

[X]

Sintaxis XML

[X]

Curva de aprendizaje

Media

Depende del conocimiento sobre Python y XML.

Comunidad

Media

Llamada ZOPE con soporte disponible.

31


Es aconsejable para el fácil diseño web que permite la no “perturbación” del scripting embebido en la página. ZPT puede ser usado solo con documentos XML y no con otros documentos basados en texto o CSS.

Resumen

py.xml Característica

Observación

Caché

[]

Ninguna

Velocidad

[]

WYSIWYG

[]

No. Usar cualquier editor de texto.

Diseño tipo Python

[X]

py.xml está basado en Python para generar XML.

Puro Python

[X]

Sintaxis XML

[]

No. Todo el código está basado en Python.

Curva de aprendizaje

No

Si uno sabe Python, puede py.xml.

32


Comunidad

¿? La librería del py ofrece una manera pitónica de generar XML/HTML basada en ideas que usan clases de objetos de Python para generar los árboles XML.

Resumen

4.6

Comparación de Tiempos de los “Principales” Frameworks de Templates

Sobre un diseño sencillo que incluya 3 frames (marcos):

Framework de Templates

Tiempo de Respuesta

Mako

1.10 ms

Myghty

4.52 ms

Cheetah

1.10 ms

Genshi

11.46 ms

Django

2.74 ms

Kid

14.54 ms 33


5

Conclusiones

El elemento clave del funcionamiento de los frameworks de templates es el stream de marcado que captura eventos de marcado. Su buen conocimiento puede ser clave también para la buena programación en los lenguajes de templates. Hay una gama grande de frameworks para templates. La mayoría de ellos están basados en el lenguaje Python y XML; no obstante hay algunos que se basan en puro Python. Pueden apreciarse en muchos de ellos es el uso de clases, objetos y herencia. Debido a su rendimiento, Mako podría ser el framework de templates estándar de la próxima generación. Kid es una de las mejores opciones puesto que compila lo mejor de varias tecnologías y ofrece una respuesta multiformato basada casi enteramente en XML. Genshi es una tecnología robusta y basada en Kid pero permite además el “plantillado” (templating) de texto plano. XSLT tiene la gran ventaja de estar siempre presente puesto que se incluye junto a la tecnología XML; no obstante es de implementar y no incluye Python. 34


Los lenguajes más recientes son como unidades sueltas de framework templating orientados a trabajos con formatos específicos. Hay poco benchmarking e información sobre pruebas con relación a las características de todos los frameworks de templating. Mako está entre uno de los más rápidos lenguajes de templates. Los lenguajes de templating trabajan con etiquetas y todo aquello; razón por la cual consumen "cómputo" y deben usarse con discreción.

6

Referencias  RYAN TOMAYKO

“In search of a Pythonic, XML-based Templating Language”. [En red]. Disponible en: http://www.tomayko.com

 CHERRY PY

“Choosing a templating language”. [En red]. Disponible en: http://www.cherrypy.org

35


 CHRISTOPHER LENZ

“Genshi”. [En red]. Disponible en: http://www.cmlenz.net

 GENSHI

“Genshi Templating Basics”. [En red]. Disponible en: http://genshi.edgewall.org

 KID

“Pythonic, XML-based Templating”. [En red]. Disponible en: http://www.kid-templating.org

 MAKO

“Mako Templates for Python”. [En red]. Disponible en: http://www.makotemplates.org

 ONFLEX

“FXT - Flex Templating”. [En red]. Disponible en: http://www.onflex.org

36

Frameworks de templates y xml  
Frameworks de templates y xml  
Advertisement