Как передать переменную {% capture%} из представления в макет в Jekyll/Liquid? - программирование

Как передать переменную {% capture%} из представления в макет в Jekyll/Liquid?

Я пытаюсь перестроить блог в Jekyll, и я остановился на простой задаче.

При условии, что у меня есть следующий набор шаблонов:

default.html:

{{ head }}

{{ content }}

frontpage.html:

---
layout: default
---

{% capture head %}
  Frontpage
{% end %}

{{ content }}

index.html

---
layout: frontpage
---

Other stuff

Я ожидал, что {% capture head %} передаст переменную в макет. Но кажется, что только переменные из Front Matter фактически передаются как page.variable_name.

Есть ли способ передать capture -d var в макет в Jekyll?

Предположим, что я мог бы сделать 2 разных макета для frontpage и normal_page, которые заменили бы весь блок {{head}}{{content}} в макете. Но, как дважды в html, поэтому я бы скорее решил его с помощью capture, если это возможно.

4b9b3361

Ответ 1

Вы не можете сделать это с помощью захвата, но вы можете использовать include. Каждый уровень иерархии страниц может переопределять ключ head, чтобы указать по-нужному файлу include

default.html

{% include {{ page.head }} %}

{{ content }}

frontpage.html

---
layout: default
head: header1.html
---

{{ content }}

_includes/header1.html

(Frontpage header content)

Ответ 2

Если ваш прецедент похож на мой, и вы хотите включить контент add'l внутри своего шаблона, вы можете включить многострочный контент из вашего основного вопроса в шаблон с использованием скалярной функции блока YAML. A | сохраняет разрывы строк, а > удаляет ( "складывает" ) разрывы строк. (Обратите внимание, что за блочным индикатором должна следовать пустая строка.)

index.html

---
layout: default
head: |
  <link href="//cdn-images.mailchimp.com/embedcode/classic-081711.css" rel="stylesheet" type="text/css">
  <style type="text/css">
    #mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; }
  </style>
script: |
  <script type='text/javascript' src='//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js'></script>
  <script type='text/javascript'>(function($) {window.fnames = new Array(); window.ftypes = new Array();fnames[0]='EMAIL';ftypes[0]='email';fnames[1]='FNAME';ftypes[1]='text';fnames[2]='LNAME';ftypes[2]='text';fnames[3]='PHONE';ftypes[3]='phone';fnames[4]='ORG';ftypes[4]='text';fnames[5]='MMERGE5';ftypes[5]='text';}(jQuery));var $mcj = jQuery.noConflict(true);</script>
---
<!-- Content, maybe a MailChimp signup form? -->

default.html

<!DOCTYPE html>
<html>
<head>
  <title>
    {{page.title}}
  </title>
  <link rel="stylesheet" type="text/css" href="/css/main.css">

  <!-- here you can have add'l arbitrary head content -->
  {{ page.head }}
</head>
<body>
  {{content}}

  <script>
    // Google Analytics, perhaps?
  </script>

  <!-- here you can have add'l arbitrary content at the end of the page, good for scripts -->
  {{page.script}}
</body>
</html>