2009-05-15 13 views
5

HTML es un árbol de nodos, antes de todo. No es solo un texto.¿Qué lenguajes de plantillas dan como resultado HTML * como un árbol de nodos *?

Sin embargo, la mayoría de los motores de plantillas manejan su entrada y salida, ya que solo era un texto; no les importa lo que sucede alrededor de sus etiquetas, sus {$foo} y <% bar() %>; tampoco les importa qué están produciendo. A veces producen un html correcto, pero eso es solo una coincidencia; no buscaban eso, todo lo que querían era reemplazar algunas marcas divertidas en el flujo de texto con su evaluación.

Existen algunos motores de plantillas que tratan su salida como un conjunto de nodos; XSLT y Haml vienen a la mente. Para algunas tareas, esto tiene sus ventajas: por ejemplo, puede reformatear automáticamente (como, eliminar todos los nodos de texto vacíos, sangría automática, ajuste de palabras). Se garantiza que el resultado es un xml/sgml correcto a menos que use un subconjunto estricto de operaciones que pueda romper eso. Además, dicho motor de plantillas cita automáticamente cadenas, de forma diferente en nodos de texto y en atributos, porque sabe estrictamente si está escribiendo un atributo o un nodo de texto. Además, puede eliminar condicionalmente un nodo de la salida porque sabe dónde comienza y termina, lo cual es útil, y realiza otras operaciones de nodo no triviales.

Puede que no le guste XSLT por su verbosidad o funcionalidad, pero es muy útil que su plantilla sea xmllint-able XML, y su resultado sea un buen sgml/xml.

Así que la pregunta es: ¿Qué motores de plantillas conoce que tratan su salida como un conjunto de nodos correctos, no solo como un texto no estructurado? Conozco XSLT, Haml y algunos oscuros basados ​​en python. ¡Moar!

+1

-1, bastante snarky. – cgp

Respuesta

1

Básicamente todos los motores de plantillas que usan XML como su formato de archivo (para definir plantillas). Al usar XML, hacen cumplir que el archivo debe estar bien formado.

[EDITAR] Los ejemplos son: Genshi (Python) o JSP 2.0 (Java).

+0

Bueno, ¿cuáles conoces específicamente? – alamar

1

TAL (originalmente parte de Zope pero ahora implemented in a variety of languages) está basado en XML. Es muy lógico y revelador de intenciones trabajar con él; en lugar de meter un montón de texto, le está diciendo a la plantilla algo como "establecer el atributo href de este enlace en http://google.com/ y configurar su contenido de texto en 'Buscar en Google'. no tiene que administrar qué cadenas se deben escapar; en general, si tiene la intención de interpretar algo como marcado, lo pone en una plantilla, y si no tiene la intención de que se interprete como marcado, introdúzcalo como un atributo valor o contenido de texto y Tal escapará correctamente.

+0

Distal es una implementación de TAL en Javascript: http://code.google.com/p/distal –

1

con el framework web Nagare, el views son siempre un árbol de nodos XML, directamente integrado en Python. el árbol puede entonces ser manipulado en Python, transformado con XSL, serializado en HTML o XHTML ...

(paquete de los '' nagare.namespaces viene con el Projet Nagare, pero se puede utilizar en cualquier aplicación Python)

Ejemplo:

>>> from nagare.namespaces import xhtml_base 
>>> h = xhtml_base.Renderer() # The XHTML tree builder 
>>> 
>>> # Building the tree of nodes 
>>> with h.html: 
>>> with h.body: 
>>>  h << h.h1('Hello world') 
>>> tree = h.root # The tree root element 
>>> 
>>> print tree.write_xmlstring() # Tree serialized in XML 

<html><body><h1>Hello world</h1></body></html> 
1

que mantener una lista de sistemas de plantillas de estilo empuje aquí: http://perlmonks.org/?node_id=674273

y estoy en el proceso de evaluar varios Perl sistemas de plantillas para su índice de separación: http://bit.ly/bXaYt7

Pero el uno basado en árboles está escrito por mí, HTML :: costurera - http://search.cpan.org/dist/HTML-Seamstress/

el término "Push-estilo" viene de Papel de Terence Parr "Hacer cumplir estrictamente Modelo-Vista separación en motores de plantilla" - http://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf

0

TAL es absolutamente no push-style. Puede estar basado en XML pero es de estilo pull (la forma más degenerada de push style).

2

Hay una forma estándar de representar XML (o un subconjunto de ella como XHTML) en el esquema conocido como SXML. Esta es una de las cosas que, en mi opinión, hacen que Scheme sea good language for web development. Es posible construir el contenido de un documento como una lista de Esquemas nativa, y luego renderizarlo (corregir) XHTML en una llamada a función.

Aquí hay un ejemplo que toma una cadena de texto simple y la envuelve como el contenido de una página HTML de un párrafo. Entonces la función as-page está actuando como una plantilla; su salida es una lista de Esquemas que se puede traducir fácilmente a su HTML equivalente. Las etiquetas desequilibradas o malformadas no son posibles con este enfoque.

(use-modules (sxml simple)) 

(define (as-page txt) 
    `(html 
    (head (title "A web page")) 
    (body (p ,txt)))) 

(as-page "It works!!!!!") 
;; $2 = (html (head (title "A web page")) (body (p "It works!!!!"))) 

(sxml->xml (as-page "It works!!!!")) 
;; $3 = <html><head><title>A web page</title></head><body><p>It works!!!!</p></body></html> 
Cuestiones relacionadas