加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – Jekyll模板使用django样的液体块/继承

发布时间:2020-12-16 22:01:36 所属栏目:百科 来源:网络整理
导读:我以很大的方式进入Jekyll,并希望使用它作为一个通用的前端开发平台,但是它与Liquid模板语言的局限性有所突破,特别是它与Django模板的区别. 我发现了液体继承宝石,它从Django添加了所有重要的Extends和Block语法.这个博客文章扩展了宝石,以适应Jekyll的文件
我以很大的方式进入Jekyll,并希望使用它作为一个通用的前端开发平台,但是它与Liquid模板语言的局限性有所突破,特别是它与Django模板的区别.

我发现了液体继承宝石,它从Django添加了所有重要的Extends和Block语法.这个博客文章扩展了宝石,以适应Jekyll的文件系统:
http://www.sameratiani.com/2011/10/22/get-jekyll-working-with-liquid-inheritance.html

问题是,它似乎并没有像Django那样完全相同的方式来实现块,这实际上使得gem无用.

我有两个jekyll“布局” – 为了理解 – 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%的方式,最后一点需要修复.

解决方法

我不知道这是否会在Jekyll中工作.我可能错了,但这是我的推理:

每个页面都会在https://github.com/mojombo/jekyll/blob/master/lib/jekyll/convertible.rb中使用do_layout进行渲染

这是递归的工作 – 它处理页面的内容,然后处理页面的布局,然后处理该布局的布局等等,将YAML变量传递给链(因此它们始终在父模板中可用为{{page .随你}}).

这意味着只有通过“YAML”值才能被传递出来的东西,以及“Content”处理之后的“content”的值.我不知道其他地方怎么做,但这似乎与块的想法不符,因为它们需要你单独传递两个块.

从根本上说,在我看来,问题是Jekyll已经有一种简单的继承形式 – 通过你可以给布局的“布局”属性.从根本上说,我认为这与液体模板兼容.

所有这一切,我不知道你已经耗尽了使用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中的所有变量.

如果这不是一个胜利,您可以随时尝试使用Python编写的海德http://hyde.github.com/,使用Jinja2(基本上是Django模板),并做同样的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读