我希望我的帖子标题为标题大小写。
它必须在整个网站范围内(不仅在<Helmet>
之类的地方。我想避免重复和丢失引用的可能性。
我不想回到我的帖子并更新每篇不是标题的文章。
是否有方法可以覆盖前题?我尝试在gatsby-node.js
中进行更改,但不确定在哪里添加/更改。
答案 0 :(得分:1)
我找到了一个我认为是hack的解决方案。在创建节点onCreateNode
期间,可以通过在将节点推送到节点数组之前对其进行更新来覆盖前题。我利用postNodes
数组(到gatsby-node范围的全局数组)创建我的博客页面。
createNodeField({ node, name: "slug", value: slug })
node.frontmatter.title = _.startCase(_.toLower(node.frontmatter.title))
postNodes.push(node)
然后,在创建帖子页面exports.createPages
时,将使用具有更新值的postNodes
。
let idx = 0;
postNodes.map(node => {
let previous = idx - 1 < 0 ? postNodes[postNodes.length - 1] : postNodes[idx - 1]
let next = idx + 1 >= postNodes.length ? postNodes[0] : postNodes[idx + 1]
createPage({
path: node.fields.slug,
component: postPage,
context: {
slug: node.fields.slug,
prev: previous.fields.slug,
next: next.fields.slug
}
})
idx += 1;
})
注意 在编写该代码时,上一个和下一个无效,因此需要对其进行修改。
答案 1 :(得分:0)
我碰巧需要修改externalized checkpoint
修改前事的方式,这使我想起了这个问题。做到这一点的方法非常完美,我只想提供另一种选择。这是您可以覆盖前题的方法:
在内部,gatsby-transformer-remark
使用graymatter
解析markdown的前题(将md处理为yaml)。我们可以修改Graymatter的默认解析器行为,以直接覆盖frontmatter。
gatsby-transformer-remark
然后将其传递给// should come with `gatsby-transformer-remark` by default
// if it's missing, install it `yarn add js-yaml`
const yaml = require('js-yaml');
const customParser = (str) => {
const result = yaml.safeLoad(str);
// modify `title`. In Gatsby, `title` is guaranteed to exist,
// but you might want to add a check for other properties.
if (result.title) {
result.title = result.title.toUpperCase();
}
return result;
}
gatsby-transformer-remark
盖茨比查询结果:
{
resolve: `gatsby-transformer-remark`,
options: {
+ engines: {
+ yaml: customParser,
+ },
plugins: [
...
],
},
},