Включить данные шаблона 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
Ответы
Ответ 1
Я не считаю возможным вложить жидкие переменные внутри YAML. По крайней мере, я не знаю, как это сделать.
Одним из подходов, который будет работать, является использование фильтра Liquid replace. В частности, определите строку, которую вы хотите использовать для замены переменной (например, !SITE_URL!
). Затем используйте фильтр замены, чтобы переключить его на желаемую переменную Jekyll (например, site.url
) во время вывода. Здесь вырезаем файл .md, который ведет себя так, как ожидалось, на моем jekyll 0.11 install:
---
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
Ответ 2
Сегодня у меня возникла аналогичная проблема. В качестве решения я создал следующий простой фильтр-фильтр 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" корневого каталога site-root. Вышеприведенный код можно просто вставить в файл yoursite/_plugins/liquidify_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.