Включить данные шаблона jekyll / liquid в переменную YAML?
Я использую заголовок 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.
Можно ли использовать жидкую разметку в заголовке YAML страниц, обрабатываемых jekyll?
- Если да, то что я делаю не так в показанном примере?
- Если это не разрешено, кто еще может достичь того, что я хотел? В настоящее время я занимаюсь разработкой своего сайта на своем ноутбуке и не хочу жестко программировать базовый URL-адрес, поскольку он должен измениться, когда я буду готов к развертыванию.
Ошибки, которые я получаю от 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
4 ответа
Я не верю, что в YAML можно вкладывать жидкие переменные. По крайней мере, я не понял, как это сделать.
Один из подходов, который будет работать, - это использование фильтра замены жидкости. В частности, определите строку, которую вы хотите использовать для замены переменной (например, !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 }}
Важным примечанием является то, что вы должны явно установить значение site.url. Вы не получите это бесплатно с Джекилом. Вы можете установить его в своем _config.yml
файл с:
url: http://alanwsmith.com
Или определите его, когда вы вызываете jekyll:
jekyll --url http://alanwsmith.com
Сегодня я столкнулся с аналогичной проблемой. В качестве решения я создал следующий простой фильтр-плагин 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, поместив их в подкаталог '_plugins' каталога root-сайта. Приведенный выше код можно просто вставить в файл yoursite/_plugins/liquify_filter.rb.
После этого шаблон как...
---
layout: default
first_name: Harry
last_name: Potter
greetings: Greetings {{ page.first_name }} {{ page.last_name }}!
---
{{ page.greetings | liquify }}
... должен отобразить какой-нибудь вывод типа "Привет, Гарри Поттер!". Расширение работает также для более глубоких вложенных структур - до тех пор, пока жидкостный фильтр также указан на внутренних выходных блоках для жидкости. Что-то вроде {{ site.url }} тоже работает.
Обновление - похоже, что теперь он доступен в виде рубина: https://github.com/gemfarmer/jekyll-liquify.
Другим подходом было бы добавлениеIF
заявление к вашемуhead.html
.
Вместо использованияpage.layout
как и в моем примере ниже, вы можете использовать любую переменную из заголовка страницы YAML.
<title>
{% if page.layout == 'post' %}
Some text with {{ site.url }} variable
{% else %}
{{ site.description | escape }}
{% endif %}
</title>
Если вам нужно заменить значения из другого
data/yml
файл, я написал plugin. Это не так элегантно, но работает:
Я сделал некоторые улучшения кода. Теперь он улавливает все вхождения в одной строке и работает с вложенными значениями.
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
end