#shortcode #eleventy
#короткий код #одиннадцать
Вопрос:
Мне нужно иметь возможность использовать пользовательские короткие коды внутри содержимого, которое возвращается из глобальных данных с использованием разбивки на страницы.
Чтобы проиллюстрировать, что я пытаюсь сделать, рассмотрим этот источник данных :
./site/data/article.js
module.exports = () => {
return [
{
"title": "Page 1",
"description": "Description for page 1",
"permalink": "/sample/page1",
"content": `## Sample Page 1
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nam dignissim.
{% jumpto %}
Cras faucibus at mauris
varius imperdiet. `
},
{
"title": "Page 2",
"description": "Description for page 2",
"permalink": "/sample/page2",
"content": `## Sample Page 2
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Nam dignissim.
{% jumpto %}
Cras faucibus at mauris
varius imperdiet. `
},
]
}
** ПРИМЕЧАНИЕ ** Обратите внимание на использование {% jumpto %}
в приведенном выше коде
и вот шаблон для данных статьи …
./site/articles.njk
---
pagination:
data: articles
size: 1
alias: article
addAllPagesToCollections: true
layout: article
permalink: "{{ article.permalink }}/"
templateEngineOverride: md, njk
eleventyComputed:
title: "{{ article.title }}"
description: "{{ article.description }}"
---
{{ article.content }}
Когда это отображается, оно не обрабатывает {% jumpto %}
короткие коды, которые возвращаются из article.content
.
Есть ли какой-нибудь способ ввести article.content
в шаблон, чтобы он обрабатывался как код шаблона?
Ответ №1:
Я полагаю, что вложенные короткие коды внутри содержимого, которое само было вставлено с помощью короткого кода, в настоящее время не поддерживаются. Что-то подобное может привести к странной бесконечной рекурсии и открыть больше возможностей для уязвимостей XSS или инъекций, если ввод CMS неправильно экранирован, как и текущее значение по умолчанию.
Чтобы сделать то, что вы хотите, есть возможность добавить пользовательский фильтр и использовать его в вашем файле njk для последующей обработки содержимого.
{{ article.content | processNestedShortcodes}}
В качестве альтернативы, если ваш реальный вариант использования такой же простой, как приведенный выше пример кода, было бы проще разделить вводимый вами контент на два и определить ваш шаблон njk как:
{{ article.content1 }}
{% jumpto %}
{{ article.content2 }}
Комментарии:
1. К сожалению, мой вариант использования не так прост, как в примере. Весь мой контент хранится в базе данных отдельно от проекта 11ty. Я также не могу выделить содержимое, как у вас, потому что содержимое уже создано (тысячи файлов) и щедро разбросано по коротким кодам. @LukeStorry
2. Концепция создания фильтра или даже моего собственного тега все еще возможна, но не очень хорошо документирована. В идеале я хотел бы использовать
renderString
функцию в nunjucks для достижения этой цели, но мне нужно каким-то образом подключиться к общему состоянию среды eleventy, чтобы действительно работать (например, зарегистрированные короткие коды, фильтры и т.д.)3. Вам нужно продолжать ссылаться на эту базу данных? Одним из способов может быть выполнение первого одиннадцатикратного прохода данных для вывода _site, а затем копирование их в другой проект eleventy в качестве входных файлов, чтобы в конечном итоге получить результат. Может быть чистым решением для одноразовой сборки.
4. это неплохая идея. У меня была похожая идея перенести содержимое с помощью gulp в каталог сборки, а затем объединить с проектом… и вызовите eleventy в каталоге сборки объединения. Преимущество, которое у меня есть, заключается в том, что все исходное содержимое уценено с помощью коротких кодов nunjuck.