javascript - mdn - ¿Pueden las plantillas de bigote hacer una extensión de plantilla?
template string mdn (8)
Soy nuevo en Moustache.
Muchos lenguajes de plantillas (p. Ej., Django / Jinja ) te permitirán extender una plantilla "parental" como esa ...
base.html
<html><head></head>
<body>
{% block content %}{% endblock %}
</body>
</html>
frontpage.html
{% extends "base.html" %}
{% block content %}<h1>Foobar!</h1>{% endblock %}
rendido frontpage.html
<html><head></head>
<body>
<h1>Foobar!</h1>
</body>
</html>
Soy consciente de los parciales de Moustache (por ejemplo, {{>content}}
), pero esos parecen ser solo incluidos .
¿Existe una extensión de plantilla para Moustache? O, en su defecto, ¿existe al menos algún patrón de diseño que efectivamente se convierta en equivalentes de extensión de plantilla?
En bigote php, la herencia de la plantilla es compatible desde la versión 2.7.0.
https://github.com/bobthecow/mustache.php/wiki/BLOCKS-pragma
Puede averiguar su versión actual desde el archivo Moustache / Engine.php y buscar la línea que contiene:
class Mustache_Engine
{
const VERSION = ''2.8.0'';
...
En node.js puedes usar express-handlebars o hogan-express para tener diseños de plantillas de bigote inna, pero la forma en que hacen las cosas es diferente, en ninguno de ellos configuras el diseño en la plantilla en sí, los diseños están registrados en tu código de aplicación .
Estoy jugando con esto ahora en Python (nótese que soy el creador de Mako), agregando un contexto dinámico que captura secciones parece estar haciendo lo correcto, aunque necesitaría probar esto mucho más.
Básicamente estamos usando lambdas, donde un prefijo "<" indica "heredar de esta plantilla" (similar a la sintaxis discutida en https://github.com/mustache/spec/issues/38 ) y un prefijo "$" indica " esta es una sección heredada ".
import pystache
class NameSpace(object):
def __init__(self, renderer, vars_={}):
self.renderer = renderer
self._content = {}
self.vars = vars_
def add_content(self, name, value):
self._content[name] = value
def __getattr__(self, key):
if key in self.vars:
# regular symbol in the vars dictionary
return self.vars[key]
elif key.startswith("<"):
# an "inherit from this template" directive
name = key[1:]
return inheritor(self, name)
elif key.startswith("$"):
# a "here''s a replaceable section" directive
name = key[1:]
if name in self._content:
# if we have this section collected, return the rendered
# version
return sub_renderer(self, name)
else:
# else render it here and collect it
return collector(self, name)
else:
# unknown key.
raise AttributeError(key)
def sub_renderer(namespace, key):
def go():
def render(nested):
return namespace._content[key]
return render
return go
def collector(namespace, key):
def go():
def render(nested):
content = namespace.renderer.render(nested, namespace)
namespace.add_content(key, content)
return content
return render
return go
def inheritor(namespace, name):
def go():
def render(nested):
namespace.renderer.render(nested, namespace)
return namespace.renderer.render_name(name, namespace)
return render
return go
Así que aquí hay algunas plantillas. base.mustache:
<html>
{{#$header}}
default header
{{/$header}}
{{#$body}}
default body
{{/$body}}
{{#$footer}}
default footer, using {{local key}}
{{/$footer}}
</html>
hello.mustache:
{{#<base}}
{{#$header}}
new header
{{/$header}}
{{#$body}}
new body, with {{local key}}
{{/$body}}
{{/<base}}
y luego para jugar con tres niveles de profundidad, subhello.mustache:
{{#<hello}}
{{#$footer}}
im some new footer
{{/$footer}}
{{/<hello}}
Renderizar hello.mustache como este:
renderer = pystache.Renderer(search_dirs=["./templates/"])
print renderer.render_name("hello",
NameSpace(renderer, {"local key": "some local key"}))
salida:
<html>
new header
new body, with some local key
default footer, using some local key
</html>
Renderizado subhello.mustache:
print renderer.render_name("subhello",
NameSpace(renderer, {"local key": "some local key"}))
salida:
<html>
new header
new body, with some local key
im some new footer
</html>
Acabo de escribir esto en veinte minutos, y solo he usado handlebars.js un poco en el pasado y pystache por primera vez, así que toda la idea de "bigote" todavía no es profunda para mí. Pero esto parece funcionar?
He propuesto esto a la especificación para Moustache aquí:
https://github.com/mustache/spec/issues/38
Actualmente bigote.java, hogan.js y phly_mustache soportan la herencia de plantillas.
Moustache no hace extensión de plantilla.
Si realmente desea la extensión de la plantilla, puede utilizar un propósito de biblioteca creado con esta funcionalidad para su idioma / marco de elección.
FYI, estoy usando Node.js / Express, así que probablemente termine usando https://github.com/fat/stache
Podría usar variables que contengan HTML. Un "bigote triple" como {{{variable}}}
devolverá el código HTML sin capa. No es exactamente lo mismo que las extensiones de plantilla, pero podría representar frontpage-content.html y luego poner su salida en una variable de content
que se pasa a base.html .
( Agregué -content al nombre del archivo frontpage.html con la expectativa de que dicho patrón de nomenclatura ayudará a mantener los nombres de archivo manejables).
Recientemente me encontré en el mismo barco, excepto que vengo de un fondo de mako.
Moustache no permite la extensión / herencia de la plantilla, pero hay algunas opciones disponibles que conozco.
Puedes usar parciales:
{{>header}} Hello {{name}} {{>footer}}
Puede inyectar funciones de preprocesamiento de plantillas en el contexto para cada plantilla que necesite heredar de alguna otra página:
{{#extendBase}} Hello {{name}} {{/extendBase}}
Picadillo:
{ "name": "Walden", "extendBase": function() { return function(text) { return "<html><head></head>" + render(text) + "</body></html>" } } }
Anteponga y anexe el HTML deseado a las páginas relevantes de su controlador.
Tener una plantilla de diseño ala:
{{>header}} {{{body}}} {{>footer}}
Y renderice el cuerpo en su controlador, pasándolo a la plantilla de diseño como una variable llamada
body
.Implemente la herencia de plantilla, bigote previo, en su código que carga plantillas.
Sin embargo, no utilizaría el bigote triple porque no quiero que el código HTML sin relieve aparezca en ninguna parte, es demasiado arriesgado en mi opinión.
Si alguien más tiene una mejor solución para este problema, me encantaría escucharlo también, ya que aún no me he dado el paso en ninguna de estas direcciones.
Si está contento con un código solo del lado del servidor, Nun es un sistema de creación de plantillas parecido a un bigote con funcionalidad extendida a través de su función ''reemplazos de plantilla'' modelada en django. Mientras funciona, sin embargo, ya no es mantenido por su autor.