添加五线谱(abcjs
)支持
就是玩!本次我们添加一个五线谱的支持。本次我们采用一种不一样的实现。当然也可以直接采用 remark-abcjs
插件来实现,但是我们这次手写一个实现。我们需要借助abcjs
这个库来实现
abcjs
Github地址:https://github.com/paulrosen/abcjsabcjs
官网:https://paulrosen.github.io/abcjs/remark-abcjs
:别人已经实现的一款remarkjs的插件。与我们要实现的功能相似。Github地址:https://github.com/breqdev/remark-abcjs
首先我们添加一个 remark-abcjs
(我们自己实现的)的插件,在这个插件中我们仅对Markdown语法树种的abcjs代码块进行识别,然后剩下的交给 Abcjs
这个MDX组件来实现。也即我们需要实现以下内容
src/remark/remark-abcjs
:识别abcjs代码块src/components/Abcjs
:渲染abcjs代码
接下来我们来实现他们
安装abcjs
第一步:安装 abcjs
- npm
- Yarn
- pnpm
npm install abcjs --save
yarn add abcjs
pnpm add abcjs
remark-abcjs插件实现
src/remark/remark-abcjs.ts
import type {Transformer} from 'unified';
import type {Code} from 'mdast';
import type {Node} from 'unist';
import { visit } from 'unist-util-visit';
export default function plugin(): Transformer {
return async (root) => {
visit(root, 'code', (node: Code) => {
if (node.lang === 'abcjs') {
transformNode(node, {
type: 'abcjsCodeBlock',
data: {
hName: 'Abcjs',
type: 'mdxJsxFlowElement',
hProperties: {
value: node.value,
},
},
});
}
});
};
}
function transformNode<NewNode extends Node>(
node: Node,
newNode: NewNode,
): NewNode {
Object.keys(node).forEach((key) => {
delete node[key];
});
Object.keys(newNode).forEach((key) => {
node[key] = newNode[key];
});
return node as NewNode;
}