docusaurus/packages/docusaurus-plugin-content-blog/src/remark/footnoteIDFixer.ts
2023-10-26 15:47:11 +02:00

31 lines
1.1 KiB
TypeScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {simpleHash} from '@docusaurus/utils';
// @ts-expect-error: TODO see https://github.com/microsoft/TypeScript/issues/49721
import type {Transformer} from 'unified';
import type {FootnoteReference, FootnoteDefinition} from 'mdast';
/**
* In the blog list view, each post will be compiled separately. However, they
* may use the same footnote IDs. This leads to duplicated DOM IDs and inability
* to navigate to footnote references. This plugin fixes it by appending a
* unique hash to each reference/definition.
*/
export default function plugin(): Transformer {
return async (root, vfile) => {
const {visit} = await import('unist-util-visit');
const suffix = `-${simpleHash(vfile.path!, 6)}`;
visit(root, 'footnoteReference', (node: FootnoteReference) => {
node.identifier += suffix;
});
visit(root, 'footnoteDefinition', (node: FootnoteDefinition) => {
node.identifier += suffix;
});
};
}