Это очень просто. используйте 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.
Таким образом, я наконец нашел лучшее решение (чем моя предыдущая попытка, которая включает в себя закачку узла mdx в страницу context
).
У Гэтсби есть недокументированный метод для связи узлов друг с другом:
Да, вы можете использовать createNodeField с еще не документированным синтаксисом ___NODE для создания связей между узлы.
blockquote>Итак, шаги выглядят следующим образом:
- В
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 } }); }); };
Результат:
Надеюсь, это поможет! [+1121]