Pregunta Plantillas Jekyll usando bloques líquidos / herencia django


Me estoy metiendo en Jekyll a lo grande y me gustaría utilizarlo como una plataforma de desarrollo de front-end general, pero estoy corriendo contra las limitaciones del lenguaje de plantillas Liquid, específicamente su diferencia con las plantillas de Django.

Descubrí la gema de herencia líquida, que agrega la importantísima sintaxis Extends y Block de Django. Esta publicación en el blog amplía aún más la gema para adaptarse al sistema de archivos de Jekyll: http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html

El problema es que no parece implementar bloques exactamente de la misma forma que lo hace Django, lo que esencialmente hace que la gema sea inútil.

Tengo dos "diseños" de jekyll llamados, por el bien de la comprensión, parent.html y child.html. Ninguno de estos contiene secciones YAML.

Padre

<html>
{% block foo %} {% endblock %}
</html>

Niño

{% extends _layouts/parent.html %}
{% block foo %}
  <div>
    Bar comes next:
    {% block bar %} {% endblock %}
  </div>
{% endblock %}

Y luego tengo una página jekyll que incluye una sección YAML así:

---
title: test
---

{% extends _layouts/child.html %}
{% block bar %}My title is {{ page.title }} {% endblock %}

Lo que esperaría:

<html>
  <div>
    Bar comes next:
    My title is test
  </div>
</html>

Lo que consigo:

<html>
  <div>
    Bar comes next:
  </div>
</html>My title is test

Parece que algo falla en tratar los bloques en mypage.html como elegibles para la inserción en los lugares adecuados de padres / hijos, aunque claramente sigue haciendo algo.

No soy un desarrollador de ruby ​​y soy bastante nuevo para Jekyll, así que necesito ayuda para identificar qué parte de esta pila está fallando. Los problemas de herencia líquida en github sugieren que otros están experimentando este problema de anidamiento de bloques: https://github.com/danwrong/liquid-inheritance/issues/3

He intentado varias de las bifurcaciones de herencia líquida, muchas de las cuales aparentemente arreglan ese problema de expresiones regulares, pero ninguna parece resolver esto.

¿Lo que estoy tratando de hacer es fundamentalmente imposible? Parece que estoy al menos el 85% del camino y el último necesita ser arreglado.


11
2017-10-26 12:02


origen


Respuestas:


No estoy seguro de que esto vaya a funcionar dentro de Jekyll. Podría estar equivocado, pero aquí está mi razonamiento:

Cada página se representa usando do_layout en https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb

Esto funciona recursivamente: procesa el contenido de la página, luego procesa el diseño de la página, luego el diseño del diseño, etc., pasando las variables YAML a lo largo de la cadena (para que siempre estén disponibles en las plantillas principales como {{page .lo que sea}}).

Esto significa que las únicas cosas que se pasan son los valores YAML, y cualquiera que sea el valor de 'contenido' después de que Liquid lo haya procesado. No sé cómo se hace en otros lugares, pero parece incompatible con la idea de bloques, ya que requieren que pase los dos bloques por separado.

Fundamentalmente, me parece que el problema es que Jekyll ya tiene una forma simple de herencia, a través del atributo "diseño" que puede darle a un diseño. Fundamentalmente, creo que esto es compatible con las plantillas líquidas.

Dicho todo esto, no estoy seguro de haber agotado los límites de usar YAML, _includes y la lógica de la plantilla. Si estás a punto de poner bloques de estilo Django en tu contenido, ¿por qué no solo hacer algo como esto?

Contenido:

---
title: some title
secondary_content: |
    Here is some *secondary* content that will be [markdownified](http://example.com).
    It can run to multiple lines and include
    * Lists
    * Good things
    * Etc
---

And here is the main content, as per usual

Modelo:

<html>
<article>
    <h1>{{ page.title }}</h1>
    {{ content }}
</article>
<aside>
{{ page.secondary_content | markdownify}}
</aside>

Si desea mantener sus plantillas limpias y tener contenido diferente para diferentes tipos de páginas, puede usar varias incluye:

Modelo:

<aside>
{% include sidebar_negotiation.html %}
</aside>

_includes / sidebar_negotiation.html:

{% if page.type = 'foo' %}
{% include sidebar_foo.html %}
{% else if page.type = 'bar' %}
{% include sidebar_bar.html %}
{% endif %}

Y luego ponga su tipo de página cosas específicas en esos archivos. Obviamente, podrías incluirlo directamente, pero probablemente sea bueno abstraerlo. Esos incluidos obtendrán todas las variables en el YAML.

Si nada de esto es una ganancia, siempre puedes probar con Hyde: http://hyde.github.com/ que está escrito en Python, usa Jinja2 (básicamente plantillas de Django ++) y hace el mismo tipo de cosas.


6
2017-10-31 20:51