在YAML变量中包含jekyll/liquid模板数据?

Rei*_*son 35 ruby yaml liquid jekyll

我正在使用markdown文件的YAML标题将excerpt变量添加到我可以在其他地方使用的博客帖子中.在其中一个摘录中,我通过降价链接标记引用了早期的博客文章,我使用液体模板数据变量{{ site.url }}代替网站的基本URL.

所以我有类似的东西(有点修剪)

--- 
title: "Decluttering ordination plots in vegan part 2: orditorp()"
status: publish
layout: post
published: true
tags: 
- tag1
- tag2
excerpt: In the [earlier post in this series]({{ site.url }}/2013/01/12/
decluttering-ordination-plots-in-vegan-part-1-ordilabel/ "Decluttering ordination
plots in vegan part 1: ordilabel()") I looked at the `ordilabel()` function
----
Run Code Online (Sandbox Code Playgroud)

但是,jekyll和Maruku md解析器不喜欢这个,这让我怀疑你不能在YAML头中使用液体标记.

是否可以在jekyll处理的页面的YAML标题中使用液体标记?

  1. 如果是,我在示例中做错了什么?
  2. 如果没有允许,谁还能怎么达到什么我打算?我目前正在我的笔记本电脑上开发我的网站,并且不想对基本URL进行硬编码,因为在我准备部署时它必须改变.

我从Maruku得到的错误是:

| Maruku tells you:
+---------------------------------------------------------------------------
| Must quote title
| ---------------------------------------------------------------------------
|  the [earlier post in this series]({{ site.url }}/2013/01/12/decluttering-o
| --------------------------------------|-------------------------------------
|                                       +--- Byte 40
Run Code Online (Sandbox Code Playgroud)

| Maruku tells you:
+---------------------------------------------------------------------------
| Unclosed link
| ---------------------------------------------------------------------------
| the [earlier post in this series]({{ site.url }}/2013/01/12/decluttering-or
| --------------------------------------|-------------------------------------
|                                       +--- Byte 41
Run Code Online (Sandbox Code Playgroud)

| Maruku tells you:
+---------------------------------------------------------------------------
| No closing ): I will not create the link for ["earlier post in this series"]
| ---------------------------------------------------------------------------
| the [earlier post in this series]({{ site.url }}/2013/01/12/decluttering-or
| --------------------------------------|-------------------------------------
|                                       +--- Byte 41
Run Code Online (Sandbox Code Playgroud)

blu*_*ing 44

今天我遇到了类似的问题.作为一个解决方案,我创建了以下简单的Jekyll过滤器插件,它允许扩展嵌套的液体模板(例如YAML前端物质中的液体变量):

module Jekyll
  module LiquifyFilter
    def liquify(input)
      Liquid::Template.parse(input).render(@context)
    end
  end
end

Liquid::Template.register_filter(Jekyll::LiquifyFilter)
Run Code Online (Sandbox Code Playgroud)

可以将过滤器添加到站点根目录的"_plugins"子目录中,从而将过滤器添加到Jekyll站点.上面的代码可以简单地粘贴到yoursite/_plugins/liquify_filter.rb文件中.

之后是一个像...的模板

---
layout: default
first_name: Harry
last_name: Potter
greetings: Greetings {{ page.first_name }} {{ page.last_name }}!
---
{{ page.greetings | liquify }}
Run Code Online (Sandbox Code Playgroud)

......应该呈现一些像"问候哈利波特!"的输出.扩展也适用于更深层次的嵌套结构 - 只要在内部液体输出块上指定了液化过滤器.像{{site.url}}之类的东西当然也有用.

更新 - 看起来现在可以作为Ruby gem使用:https://github.com/gemfarmer/jekyll-liquify.

  • 这是完美的,正是我所寻找的.这个插件应该完全是核心jekyll的一个功能 (3认同)
  • 有没有办法在github页面中使用它? (2认同)
  • @cregox GitHub Pages不允许使用插件构建.关于插件的Jekyll文档中有一个信息提示,"GitHub Pages由Jekyll提供支持.但是,所有Pages网站都是使用`--safe`选项生成的,出于安全原因禁用自定义插件.不幸的是,这意味着你的插件赢了'如果你正在部署到GitHub页面,你仍然可以工作.你仍然可以使用GitHub页面来发布你的站点,但是你需要在本地转换站点并将生成的静态文件推送到你的GitHub存储库而不是Jekyll源文件." 来源:http://jekyllrb.com/docs/plugins/ (2认同)
  • @cregox或者将Netlify与GitHub一起使用,https://netlify.com. (2认同)
  • @BrianZ感谢netlify提示!我曾经看过它,甚至在那里创建了一个帐户,但出于某种原因放弃了它...如果其他人可能感兴趣,他们提供非商业开源的免费专业计划,并简单地与jekyll https集成://www.netlify.com/blog/2015/10/28/a-step-by-step-guide-jekyll-3.0-on-netlify/ - 我今天会尝试设置它.:) (2认同)

Ala*_*ith 27

我不相信将液体变量嵌入YAML中是可能的.至少,我还没弄明白怎么做.

一种可行的方法是使用Liquid的替换过滤器.具体来说,定义要用于变量替换的字符串(例如!SITE_URL!).然后,site.url在输出期间使用替换过滤器将其切换到所需的Jekyll变量(例如).这是一个减少的.md文件,在我的jekyll 0.11安装上表现得如预期:

---
layout: post

excerpt: In the [earlier post in this series](!SITE_URL!/2013/01/12/)

---

{{ page.excerpt | replace: '!SITE_URL!', site.url }}
Run Code Online (Sandbox Code Playgroud)

在我的机器上测试,正确插入URL,然后按预期从markdown转换为HTML链接.如果要替换多个项目,可以将多个替换调用串在一起.

---
layout: post

my_name: Alan W. Smith
multi_replace_test: 'Name: !PAGE_MY_NAME! - Site: [!SITE_URL!](!SITE_URL!)'

---

{{ page.multi_replace_test | replace: '!SITE_URL!', site.url | replace: '!PAGE_MY_NAME!', page.my_name }}
Run Code Online (Sandbox Code Playgroud)

一个重要的注意事项是您必须显式设置site.url值.你不能和杰基尔一起免费获得.您可以使用以下命令在_config.yml文件中进行设置:

url: http://alanwsmith.com
Run Code Online (Sandbox Code Playgroud)

或者,在调用jekyll时定义它:

jekyll --url http://alanwsmith.com
Run Code Online (Sandbox Code Playgroud)

  • +1感谢Alan提供的详尽清晰的答案.(我在`_config.yml`中设置`site.url`并且应该提到它.)我会等待一段时间,看看是否有人有任何其他想法/建议,但如果不是,我会接受这个.干杯. (2认同)