aboutsummaryrefslogtreecommitdiff
path: root/src/rehype/admonition-title-to-heading.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/rehype/admonition-title-to-heading.js')
-rw-r--r--src/rehype/admonition-title-to-heading.js31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/rehype/admonition-title-to-heading.js b/src/rehype/admonition-title-to-heading.js
new file mode 100644
index 00000000..d84b27b2
--- /dev/null
+++ b/src/rehype/admonition-title-to-heading.js
@@ -0,0 +1,31 @@
+import {visit} from 'unist-util-visit';
+
+const plugin = (options) => {
+ const transformer = async (ast) => {
+ let hId = null;
+ let hContent = null;
+ visit(ast, 'element', (node, index, parent) => {
+ if (/^h[2-6]$/.test(node.tagName) && node.properties && node.properties.id) {
+ // h2~h6のタグを見つけたら
+ hId = node.properties.id;
+ hContent = node.children && node.children[0] ? node.children[0].value : '';
+ // h3~h6タグの隣にあるdivタグを探す
+ const nextNode = parent.children[index + 1];
+ if (nextNode && nextNode.tagName === 'admonition') {
+ // 該当のdiv要素を見つけたらHタグの内容とline-5の#以降の文字列が一致した場合
+ const contentAfterHash = nextNode.properties.title ? nextNode.properties.title.replace(/^#+/, '').trim() : '';
+
+ if (contentAfterHash === hContent.trim()) {
+ // Hタグのidを取得しそれをdivのidに設定
+ nextNode.properties.id = hId;
+ // Hタグを削除
+ parent.children.splice(index, 1);
+ }
+ }
+ }
+ });
+ };
+ return transformer;
+};
+
+export default plugin; \ No newline at end of file