https://github.com/remarkjs/remark から:
import {visit} from 'unist-util-visit' /** @type {import('unified').Plugin<[], import('mdast').Root>} */ function myRemarkPluginToIncreaseHeadings() { return (tree) => { visit(tree, (node) => { if (node.type === 'heading') { node.depth++ } }) } }
JSDocの型表現がどうもわかりにくい。順次解釈する。
- import('unified').Plugin<[], import('mdast').Root>
- ↑は、unifiedモジュールで定義されたPluginジェネリック型
- import('mdast').Root は、mdastモジュールで定義せれたRoot型
- プラグインは、引数配列 [] で戻り値型がRoot
unified::Plugin<[], madast::Root> とかなら見やすいのに。
で、このプラグインは、ツリートランスフォーマーを返す。プラグインが関数のときは、それ自身が処理するのではなくて、トランスフォーマー関数を返す使用。
トランスフォーマーは、mdastのtree(実際はNode型)を引数にして何かツリートランスフォーム処理をする。関数の戻り値は不要のようだ。
- トランスフォーマー・プラグインは、型が unified::Plugin<Arg, Tree> である関数。ここで、Arg, Tree は型引数で、Arg <: [...any], Tree <: mdast::Node という制約あり。
- トランスフォーマー・プラグイン関数は、実行者〈パフォーマー〉関数を返す。パフォーマーは、引数に渡されたツリーを直接書き換える。コピーではなくて変更する。
曖昧なのは:
- トランスフォーマーと言ったとき、パフォーマー関数なのか? パフォーマー生成関数なのか?
- プラグインと言ったとき、パフォーマー関数なのか? パフォーマー生成関数なのか? ドライバーなのか?
- ドライバーと言ったとき、プレーンドライバーなのか? プロセッサ内蔵ドライバーなのか?
- パーザーと言ったとき、パーザー・プラグインなのか、パーザー内蔵ドライバーなのか?