Одиннадцать коротких кодов в не отображаемом содержимом данных

#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.