diff options
author | 安竹洋平 <61961825+yasutakeyohei@users.noreply.github.com> | 2024-01-25 00:15:16 +0900 |
---|---|---|
committer | 安竹洋平 <61961825+yasutakeyohei@users.noreply.github.com> | 2024-01-25 00:15:16 +0900 |
commit | 02c3492b3d574812b5391979e04c399e350a26ed (patch) | |
tree | 2b492ac9564da6b201d035eb4434ea76e3f64478 /src/rehype | |
parent | 5970320e4994df7652eedea9e16770e1720342f8 (diff) |
initial commit
Diffstat (limited to 'src/rehype')
-rw-r--r-- | src/rehype/admonition-title-to-heading-before-toc.js | 49 | ||||
-rw-r--r-- | src/rehype/admonition-title-to-heading.js | 31 |
2 files changed, 80 insertions, 0 deletions
diff --git a/src/rehype/admonition-title-to-heading-before-toc.js b/src/rehype/admonition-title-to-heading-before-toc.js new file mode 100644 index 00000000..2770610d --- /dev/null +++ b/src/rehype/admonition-title-to-heading-before-toc.js @@ -0,0 +1,49 @@ +import {visit} from 'unist-util-visit'; +import {u} from 'unist-builder' + +function createHeadingNode(depth, text) { + return { + type: 'heading', + depth: depth, + children: [{ type: 'text', value: text }], + }; +} + +const plugin = (options) => { + const transformer = async (ast) => { + let hId = null; + let hContent = null; + let offset = 0; + visit(ast, 'element', (node, index, parent) => { + if(node && node.tagName == "admonition") { + let headingNode = u('heading', { depth: 4 }, [ + u('text', 'New Heading') + ]); + parent.children.splice(index + offset, 0, {type: 'element', tagName: 'h4', children:[{type: 'text', value: 'テスト'}]}); + offset++; + // if (/^h[3-6]$/.test(node.tagName) && node.properties && node.properties.id) { + // h3~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 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 |