2015-05-13 2 views
1

Предлагает ли Jekyll включить сообщение в другое сообщение? Я знаю, это звучит немного глупо, но я использую его для приготовления пищи/рецепта сайта. Некоторые из моих рецептов состоят из компонентов или других небольших рецептов.Jekyll: включая сообщение внутри другого сообщения

Я ищу способ включить несколько сообщений внутри другой пост, в комплекте с шаблоном и все. Это возможно?

Я сделал тонну поискового запроса, и нашел, что я смог включить только страницу, а не сообщение, и он не использовал стандартный шаблон для жидкости, просто уценку.

Идеи?

ответ

6

Я использовал Jekyll's Collections на моем сайте, чтобы решить проблему похожее на ваше.

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

Более подробное и дружеское введение в коллекции, here's a great post about getting started with them.

Одна вещь, которую мы должны иметь в виду, состоит в том, что нам следует избегать сообщений для таких случаев.

Как упоминалось Бен Бальтером по ссылке выше, «Если люди используют сообщения в блоге для сообщений, не связанных с блогами, Jekyll уже не удалось». Рецепты не являются сообщениями, и мы должны избегать использования их как таковых, если можем.

С учетом сказанного, вот мой подход в три этапа:

  1. Создайте две коллекции (наши пользовательские типы пост) - скажем, это «Рецепты» и «Ингредиенты»

  2. Найти способ связать их друг с другом - Чтобы убедиться, что «салат» будет указан под «салатом»

  3. Включите соответствующие «ингредиенты» в свои «Рецепты» - добавление кода жидкости для фактического отображения информации f «салат» где-то на странице «салата».


Шаг 1

Создать _ingredients и _recipes папки для каждого из ваших коллекций (убедитесь, что назвать их во множественном числе) и добавить их в свой _config.yml файла:

collections: 
     ingredients: 
     output: true 
     recipes: 
     output: true 
     permalink: /recipes/:path/ 

Параметр output: true создает i Индивидуальная HTML-страница для каждого элемента в коллекции и permalink (необязательно) позволяет вам управлять URL-адресом.


Шаг 2

Добавить часть метаданных, как это к YAML предисловия вашего lettuce.md элемента коллекции:

---   
    parent-collection: salad 
    --- 

Если lettuce.md принадлежит более чем один рецепт, вы можете добавить несколько. Убедитесь в том, чтобы добавить содержимое ниже метаданных, если вам нужно описание:

--- 
    parent-collection: 
    - salad 
    - hamburguer 
    - taco 
    --- 

    Lettuce is really good for your health, but it kinda sucks as a food. 

Обратите внимание, что salad, hamburguer и taco должен назван так же, как рецепт URL слизня или это не будет работать (т.е. greatrecipes.com/recipes/ salad). Если у вас есть имя рецепта, это предложение, вы завершаете его в кавычки.

Эта переменная будет уменьшена позже, поэтому имя parent-collection: The Amazing Souflè Français будет соответствовать the-amazing-soufle-francais. Тем не менее, странные вещи случаются: когда есть сомнения, просто пишите маленькие кадры salad.

Это hacky часть.


Шаг 3

Создать конкретный макет для ваших рецептов (как _layout/recipe-page.html) и добавьте код - это где мы будем включать ингредиенты в странице рецепта.

Помните, что ваши рецепты (salad.md и друзья) должны указывать на этот макет.

{% capture current_collection %}{{ page.url | remove: "recipes" | remove: "/" | remove: " " }}{% endcapture %} 

Здесь мы фиксируем имя рецепта из URL и присвоить его переменной current_collection. Удостоверьтесь, что это в одной строке, потому что создание многострочной строки добавит кучу пробелов в захваченную строку и сломает ваш код 10/10 раз.Insane.

<div class="recipe-content"> 
    <p>{{ content }}</p> -- This is the content of the current recipe in the collection, your "post text". 
    </div> 


    {% for ingredient in site.ingredients %} 

    {% capture captured_parent_collection %}{{ ingredient.parent-collection | slugify }}{% endcapture %} -- This capture is just to pass the slugify filter and sanitize parent.collection to make sure it matches the URL slug 

     {% if captured_parent_collection == current_collection %} 
     <div class="recipe-ingredient"> 
      <h3>{{ ingredient.name }}</h3> -- "<h3>Lettuce</h3>" 
      <p>{{ ingredient.content }}</p> -- "<p>Lettuce is really good for your health, but it kinda sucks as a food.</p>" 
     </div> 
     {% endif %} 
    {% endfor %} 

Совпадение ингредиенты для этого рецепта и включает в себя каждый из них в макете. Ясс!

Каждый из ваших ингредиентов должен появляться прямо под текстом рецепта.

Обратите внимание, что вы не вытаскиваете ингредиенты внутри текст рецепта, как вы описали в своем вопросе, но включаете их в макет после него. Насколько я знаю, вы не можете добавить вещи в середине вашего текста публикации/публикации - если вы не взломаете свой собственный путь через специальный плагин для Jekyll.

Есть, конечно, менее хакерские способы сделать это, но я так и сделал. Дай мне знать, если ты найдешь для себя какие-либо проблемы, пытаясь сделать это для себя - и кого-нибудь еще, не стесняйся меня исправить.

У меня эта настройка происходит на моем сайте - взгляните на the layout where I pull in my child collection items и the metadata on the child collection items.

+0

Хорошо, прочитав это, это действительно похоже на то, что мне нужно. Я даже не подозревал, что коллекции существуют, и именно поэтому это были должности. Я никогда раньше не использовал Jekyll (из опыта WP). Единственное, на что я собираюсь работать, это вытащить «родительский» материал из материала переднего элемента. Я не хочу обновлять ингредиент .md каждый раз, когда новый родительский рецепт хочет его использовать. – clark

+0

Я думаю, что все, что мне нужно сделать, это то, где вы фиксируете текущий URL рецепта как current_collection, вместо этого предоставляете список самих слизней, которые я затем сравниваю с слизнями в коллекции «Ингредиенты», только отрисовка матчей. – clark

+0

Я думал, что вы можете перечислить все ингредиенты в метаданных рецепта, а затем сопоставить их с именами ингредиентов (после их устранения). Одна из проблем заключается в том, что циклическое перемещение по списку метаданных не будет возвращать отдельные элементы, как если бы вы работали с массивом, но строка со всеми из них была объединена. Если это произойдет, попробуйте указать метаданные, подобные этому, и посмотреть, работает ли это: 'components: buns, patty, cheese' – dfosco