Как импортировать данные из связанных файлов уценки в frontmatter другой страницы - PullRequest
0 голосов
/ 06 апреля 2020

Я создаю сайт Stati c на базе Gatsby, который использует документы уценки в качестве источника контента.

Структура контента

/content/{section}
  /index.md
  /{slug}
    /detail.md
    /summary.md

Авторы контента добавляют frontmatter теги к index.md, которые включают тег links, как указано ниже:

links:
  - some-awesome-slug
  - some-other-slug

Я бы хотел, чтобы на этапе, когда Гэтсби собирал свой граф узлов, чтобы поменять слаг ссылки для блок данных, созданный из ссылки на фактический узел summary.md, или, если его там нет, то метаданные выдержки detail.md. Поэтому я думаю, что мне нужен пользовательский тип.

My gatsby-node.js экспортирует функцию createSchemaCustomization следующим образом, просто для того, чтобы заставить что-то работать: (Так что для простоты сейчас пропущен бит пользовательского типа) .

const createSchemaCustomization = ({ actions: { createTypes }, schema }) => {
  const typeDefs = [
    'type MarkdownRemark implements Node { frontmatter: Frontmatter }',
    schema.buildObjectType({
      name: 'Frontmatter',
      fields: {
        summary: {
          type: 'MarkdownRemark',
          resolve: (source, args, context, info) => {
            // source here is the existing frontmatter, but I need access to the node's `fields` data.
            return context.nodeModel
              .getAllNodes({ type: 'MarkdownRemark' })
              .find(() => false) // while I work this out.
          }
        }
      },
      interfaces: ['Node']
    })
  ]

  createTypes(typeDefs)
}

, где отсутствует бит, в котором я использую данные section узла (вставленные ранее в fields) и значение slug (также ранее вставленное в fields) для поиска связанный сводный или подробный файл.

Значение source, которое Гэтсби отправляет функции resolve, представляет собой всего лишь frontmatter, поэтому функция не имеет ссылки на узел, который я могу найти.

Результатом net будет то, что frontmatter для узла будет заменено следующим образом

С:

links:
  - some-slug

Кому:

links:
  - id: xxxx
    frontmatter:
      title: Some Slug
      summary: # this either comes from a summary.md file or from the `excerpt` of a `detail.md` file.
        title: Some Summary
        text: Some summary text
    html
    fields: # populated previously to the `createSchemaCustomization` step (I think)
      section: someSection
      slug: some-slug

Is то, что я пытаюсь сделать разумно, или это то, что мне лучше сделать в компоненте React уровня страницы, просто создать запрос graphql из значений ссылок.

...