Как изменить относительный путь ссылки Markdown как предварительную обработку gatsby-transformer-notes

Я разрабатываю статический блог, используя Гэтсби. Это использовать gatsby-transformer-remark а также gatsby-plugin-i18n Плагин для поддержки нескольких языков.

Я управляю статьями в репозитории GitHub следующим образом.

  • / блог
    • / 2017
      • / 06
        • 01-foo.en.md
        • 01-foo.zh.md
      • / 09
        • 01-bar.en.md
        • 01-bar.zh.md

И ссылки между статьями необходимы. Поэтому, чтобы не стать мертвой ссылкой при просмотре GitHub с помощью веб-браузера, мы настроили ссылку следующим образом.

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

Тем не менее, это имеет проблему мертвых ссылок при отображении с помощью Gatsby. Потому что URL в фактически сгенерированном браузере выглядит следующим образом.

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

Итак, когда я бегу gatsby build или же gatsby developЯ хочу заменить ссылки между статьями, используя регулярные выражения, в качестве предварительной обработки для анализа Markdown gatsby-transformer-remark,

Как я могу сделать выше?


Добавлено: 2 февраля

Я также попробовал относительные ссылки.

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

Но URL-адрес /[gatsby-config.pathPrefix]/en/blog/2017/06/09/01-bar, который является мертвой ссылкой. Потому что Гэтсби делает HTML место для /[gatsby-config.pathPrefix]/en/blog/2017/06/09/01-bar/index.html,

Итак, я добавил ../ еще раз. И это сработало. Однако с этим есть некоторые проблемы.

  • Я не могу перейти от Markdown в GitHub к другому Markdown. Потому что относительный путь отличается.
  • Кроме того, он не может перемещаться без добавления суффикса языка (например, 01-bar.en.md), но когда я его добавляю, Гэтсби на этот раз не может быть распознан, и отображаются 404 или необработанная уценка.

1 ответ

Решение

Вы можете создать плагин для gatsby-transformer-notes

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 и префикса языка. Сохраняйте свои URL как в уценке, начиная с / лайк [text](/blog/2017/09/01-bar.en.md)

Другие вопросы по тегам