如何更改 Markdown link 相对路径作为 gatsby-transformer-remark 的预处理

How to change Markdown link relative path as preprocessing of gatsby-transformer-remark

我正在使用 Gatsby 开发静态博客。 它使用 gatsby-transformer-remarkgatsby-plugin-i18n 插件来支持多种语言。

我正在按如下方式管理 GitHub 存储库中的文章。

和link之间的文章是必须的。因此,为了不至于用Web浏览器看GitHub时变成死link,我们设置一个link如下。

[link](/blog/2017/09/01-bar.en.md)

但是这个在用Gatsby显示的时候有死linking的问题。 因为实际生成的浏览器中的URL是这样的

/[gatsby-config.pathPrefix]/en/blog/2017/09/01-bar

因此,当我 运行 gatsby buildgatsby develop 时,我想使用正则表达式替换文章之间的 links,作为预处理以通过 gatsby-transformer-remark.

我怎样才能做到以上几点?


添加:2 月 2 日

我也试过亲戚 links.

[link](../09/01-bar)

但是URL是/[gatsby-config.pathPrefix]/en/blog/2017/06/09/01-bar,已经死了link。 因为 Gatsby 将 HTML 放置到 /[gatsby-config.pathPrefix]/en/blog/2017/06/09/01-bar/index.html.

所以我又加了一次../。它奏效了。但是,这有一些问题。

你可以create a plugin for gatsby-transformer-remark

plugins/gatsby-remark-relative-linker/index.js:

const visit = require('unist-util-visit');
module.exports = ({ markdownAST }) => {
  visit(markdownAST, 'link', node => {
    if (
      node.url &&
      !node.url.startsWith('//') &&
      !node.url.startsWith('http') &&
      node.url.startsWith('/')
    ) {
      node.url = node.url.replace(/(.*)\.(\w{2}).md(#.*)?$/, (match, base, language, hash) => {
        return `/${language}${base}${hash}`
      })
    }
  });

  return markdownAST;
};

plugins/gatsby-remark-relative-linker/package.json:

{}

./gatsby-config.js:

{
...
plugins: [
  {
    resolve: 'gatsby-transformer-remark',
    options: {
      plugins: [
        ...
        'gatsby-remark-relative-linker',
      ],
    }
  }
},

在这里,我要从网址中删除 .md 并添加语言前缀。 保持你的 url 像 markdown 一样以 / 开头,比如 [text](/blog/2017/09/01-bar.en.md)