Соединение двух узлов Гэтсби

Это очень просто. используйте re.sub, не используйте replace.

import re
replacements = {r'\bthe\b':'a', 
                r'\bthis\b':'that'}

def replace_all(text, dic):
    for i, j in dic.iteritems():
        text = re.sub(i,j,text)
    return text

replace_all("the cat has this thistle.", replacements)

Он напечатает

a cat has that thistle.
3
задан Freestyle09 6 April 2019 в 14:49
поделиться

1 ответ

Таким образом, я наконец нашел лучшее решение (чем моя предыдущая попытка, которая включает в себя закачку узла mdx в страницу context).

У Гэтсби есть недокументированный метод для связи узлов друг с другом:

Да, вы можете использовать createNodeField с еще не документированным синтаксисом ___NODE для создания связей между узлы.

Итак, шаги выглядят следующим образом:

  • В createPage сохраните id узла Mdx на узле SitePage.
  • В onCreateNode, если узел - SitePage, используйте createNodeField с Mdx___NODE в качестве имени поля и идентификатором узла Mdx в качестве значения.

My gatsby-node.js:

const path = require("path")
const { createFilePath } = require("gatsby-source-filesystem")

exports.onCreateNode = ({ node, actions, getNode }) => {
  const { createNodeField } = actions

  if (node.internal.type === "SitePage" && node.context && node.context.id) {

    createNodeField({
      name: "Mdx___NODE",
      value: node.context.id,
      node,
    })
  }

  if (node.internal.type === "Mdx") {
    const value = createFilePath({ node, getNode })
    createNodeField({
      // 1) this is the name of the field you are adding,
      name: "slug",
      // 2) this node refers to each individual MDX
      node,
      value: `/blog${value}`
    })
  }
}


exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions;
  const { data, errors } = await graphql(`
    {
      allMdx {
        edges {
          node {
            id
            fields {
              slug
            }
          }
        }
      }
    }
  `)

  if (errors) throw errors
  data.allMdx.edges.forEach(({ node }) => {
    createPage({
      path: node.fields.slug,
      component: path.resolve(`./src/components/posts-page-layout.js`),
      context: { id: node.id }
    });
  });
};

Результат:

graphiql

Надеюсь, это поможет! [+1121]

0
ответ дан Derek Nguyen 6 April 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: