Шаблоны Jekyll с использованием джангоподобных жидких блоков/наследования - программирование

Шаблоны Jekyll с использованием джангоподобных жидких блоков/наследования

Я вхожу в Jekyll в большой путь и хотел бы использовать его как общую платформу для разработки на переднем плане, но я сталкиваюсь с ограничениями языка шаблонов Liquid, в частности его отличием от шаблонов Django.

Я обнаружил жемчужину жидкого наследования, которая добавляет все важные синтаксисы Extends и Block из Django. Это сообщение в блоге дополнительно расширяет жемчужину в соответствии с файловой системой Jekyll: http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html

Проблема заключается в том, что он не реализует блоки точно так же, как это делает Django, что по существу делает бесполезный камень.

У меня есть два jekyll "layouts", которые называются - для понимания - parent.html и child.html. Ни один из них не содержит разделы YAML.

Родитель

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

Ребенок

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

И тогда у меня есть страница jekyll, которая включает раздел YAML, таким образом:

---
title: test
---

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

Что я ожидаю:

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

Что я получаю:

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

Кажется, что не удается обработать блоки в mypage.html как подходящие для вставки в подходящие места родителя/ребенка, хотя он явно все еще что-то делает.

Я не разработчик ruby ​​и не знаю для Jekyll, поэтому мне нужна помощь в определении того, какая часть этого стека терпит неудачу. Проблемы с жидкостным наследованием github указывают на то, что другие испытывают эту проблему с блочным вложением: https://github.com/danwrong/liquid-inheritance/issues/3

Я пробовал несколько вилок жидкого наследования, многие из которых, по-видимому, исправляют это регулярное выражение, но никто, кажется, не решает этого.

Это то, что я делаю принципиально невозможно? Кажется, что я, по крайней мере, 85% от того, что нужно, и последний бит нуждается в исправлении.

4b9b3361

Ответ 1

Я не уверен, что это когда-нибудь будет работать в Jekyll. Возможно, я ошибаюсь, но здесь мои рассуждения:

Каждая страница выводится с использованием do_layout в https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb

Это работает рекурсивно - он обрабатывает содержимое страницы, затем обрабатывает макет страницы, затем макет макета и т.д. и т.д., передавая переменные YAML в цепочку (поэтому они всегда доступны в родительских шаблонах, {{page.whatever}}).

Это означает, что только те, которые передаются, являются значениями YAML и независимо от значения "содержимого" после того, как оно было обработано Liquid. Я не знаю, как это делается в другом месте, но это кажется несовместимым с идеей блоков, поскольку они потребуют от вас разделить два блока отдельно.

По сути, мне кажется, что проблема в том, что Jekyll уже имеет простую форму наследования - через атрибут "layout", который вы можете предоставить макету. По сути, я думаю, что это совместимо с шаблонами для жидкостей.

Все, что сказал, я не уверен, что вы исчерпали пределы использования YAML, _includes и шаблона. Если вы хотите разместить блоки стиля Django в своем контенте, почему бы просто не сделать что-то вроде этого:

Содержание:

---
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

Шаблон:

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

Если вы хотите, чтобы ваши шаблоны были чистыми и имели различный контент для разных типов страниц, вы можете использовать различные варианты:

Шаблон:

<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 %}

И затем поместите свои типы страниц в эти файлы. Очевидно, вы можете включить его напрямую, но, вероятно, приятно отвлечь его. В число этих включений входят все переменные в YAML.

Если это не победа, вы всегда можете попробовать Hyde: http://hyde.github.com/, который написан на Python, использует Jinja2 (в основном Django шаблоны ++) и делает то же самое.