我正在使用标记文件的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
----然而,jekyll和Maruku md解析器不喜欢这样,这让我怀疑您不能在YAML头中使用液态标记。
是否可以在jekyll处理的页面的YAML头中使用液态标记?
我从Maruku那里得到的错误是:
| Maruku tells you:
+---------------------------------------------------------------------------
| Must quote title
| ---------------------------------------------------------------------------
| the [earlier post in this series]({{ site.url }}/2013/01/12/decluttering-o
| --------------------------------------|-------------------------------------
| +--- Byte 40和
| Maruku tells you:
+---------------------------------------------------------------------------
| Unclosed link
| ---------------------------------------------------------------------------
| the [earlier post in this series]({{ site.url }}/2013/01/12/decluttering-or
| --------------------------------------|-------------------------------------
| +--- Byte 41和
| 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发布于 2013-02-01 16:31:19
我不认为在YAML中嵌套液体变量是可能的。至少我还没弄清楚该怎么做。
一种可行的方法是使用Liquid's replace filter。具体来说,定义一个要用于变量替换(例如!SITE_URL!)的字符串。然后,在输出期间使用替换过滤器将其切换到所需的Jekyll变量(例如site.url)。下面是一个精简的.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 }}在我的机器上测试,URL被正确地插入,然后像预期的那样从标记转换到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 }}一个重要的注意事项是you must explicitly set the site.url值。你不能因为杰基尔而免费得到这个。您可以将其设置为_config.yml文件中的以下内容:
url: http://alanwsmith.com或者,在调用jekyll时定义它:
jekyll --url http://alanwsmith.com发布于 2013-06-11 14:34:02
今天我遇到了一个类似的问题。作为解决方案,我创建了以下简单的Jekyll过滤器插件,它允许扩展嵌套的液体模板(例如,YAML前端的液体变量):
module Jekyll
module LiquifyFilter
def liquify(input)
Liquid::Template.parse(input).render(@context)
end
end
end
Liquid::Template.register_filter(Jekyll::LiquifyFilter)过滤器可以添加到Jekyll站点,方法是将它们放在站点根dir的“_plugins”子目录中。上面的代码可以简单地粘贴到您的站点/_plugins/液化处理_filter.rb文件中。
在那之后一个模板就像..。
---
layout: default
first_name: Harry
last_name: Potter
greetings: Greetings {{ page.first_name }} {{ page.last_name }}!
---
{{ page.greetings | liquify }}..。应该渲染一些输出像“你好哈利波特!”。这种扩展也适用于更深层次的嵌套结构--只要液化过滤器也指定在内部液体输出块上。当然,类似{{ site.url }}的东西也能工作。
更新--看起来这是一个Ruby:https://github.com/gemfarmer/jekyll-liquify。
发布于 2021-02-05 23:43:01
如果您需要从另一个data/yml文件中替换data/yml中的值,我编写了插件。它不那么优雅,但效果很好:
我做了一些代码改进。现在,它捕获一个字符串中的所有事件,并使用嵌套值。
module LiquidReplacer
class Generator < Jekyll::Generator
REGEX = /\!([A-Za-z0-9]|_|\.){1,}\!/
def replace_str(str)
out = str
str.to_s.to_enum(:scan, REGEX).map {
m = Regexp.last_match.to_s
val = m.gsub('!', '').split('.')
vv = $site_data[val[0]]
val.delete_at(0)
val.length.times.with_index do |i|
if val.nil? || val[i].nil? || vv.nil? ||vv[val[i]].nil?
puts "ERROR IN BUILDING YAML WITH KEY:\n#{m}"
else
vv = vv[val[i]]
end
end
out = out.gsub(m, vv)
}
out
end
def deeper(in_hash)
if in_hash.class == Hash || in_hash.class == Array
_in_hash = in_hash.to_a
_out_hash = {}
_in_hash.each do |dd|
case dd
when Hash
_dd = dd.to_a
_out_hash[_dd[0]] = deeper(_dd[1])
when Array
_out_hash[dd[0]] = deeper(dd[1])
else
_out_hash = replace_str(dd)
end
end
else
_out_hash = replace_str(in_hash)
end
return _out_hash
end
def generate(site)
$site_data = site.data
site.data.each do |data|
site.data[data[0]] = deeper(data[1])
end
end
end
end将此代码放置在site/_plugins/liquid_replacer.rb中
在yml文件中,使用!something.someval!作为site.data.something.someval,但不使用site.data部件。
例子:
_data/one.yml
foo: foo_data/two.yml
bar: "!one.foo!bar"调用{{ site.data.two.bar }}将产生foobar
=======旧代码======
module LiquidReplacer
class Generator < Jekyll::Generator
REGEX = /\!([A-Za-z0-9]|_|\.){1,}\!/
def generate(site)
site.data.each do |d|
d[1].each_pair do |k,v|
v.to_s.match(REGEX) do |m|
val = m[0].gsub('!', '').split('.')
vv = site.data[val[0]]
val.delete_at(0)
val.length.times.with_index do |i|
vv = vv[val[i]]
end
d[1][k] = d[1][k].gsub(m[0], vv)
end
end
end
end
end
endhttps://stackoverflow.com/questions/14487110
复制相似问题