`NodeInserter` クラスを独立モジュールへ分離
Contents クラスに混在していた NodeInserter とその関連クラス群を専用ファイルへ抽出し、コードの責務を明確に分離しました。あわせて $isShadowRoot ヘルパー関数も適切なモジュールへ移動しています。
背景
NodeInserter クラスは本来 contents.js とは独立した責務を持つにもかかわらず、同ファイル末尾に定義されたままになっていました。PR説明の「As it should have been originally」という言葉が示す通り、これは設計上の負債であり、今回の変更はその是正です。
contents.js は NodeInserter 以外にも多数の依存をインポートしており、ファイルが肥大化していました。NodeInserter 関連のコードは約110行に及び、$isNodeSelection・$getChildCaretAtIndex・$ensureForwardRangeSelection・$getNearestNodeOfType など、NodeInserter 専用のインポートが contents.js の先頭に混在していた状態でした。
技術的な変更
NodeInserter クラスと内部クラス群が src/editor/contents/node_inserter.js として切り出され、contents.js はこれを単純にインポートする形に整理されました。
新設ファイル src/editor/contents/node_inserter.js には以下のクラスが移動しています:
-
NodeInserter:static for(selection)ファクトリメソッドで適切なインサーターを返す基底クラス -
CodeNodeInserter:CodeNode内への挿入を処理するサブクラス -
QuoteNodeInserter:QuoteNode内への挿入を処理するサブクラス -
ShadowRootNodeInserter: Shadow Root ノードへの挿入を処理するサブクラス -
NodeSelectionNodeInserter: ノード選択時の挿入を処理するサブクラス
contents.js 側の変更は、削除されたコードブロックの代わりに以下の2行のインポートを追加するだけです:
import NodeInserter from "./contents/node_inserter"
import { $isShadowRoot } from "../helpers/lexical_helper"
あわせて、contents.js 末尾に定義されていた $isShadowRoot ヘルパー関数は src/helpers/lexical_helper.js へ移動されました。この関数は $isElementNode・$isRootOrShadowRoot・$isRootNode の組み合わせでシャドウルートノードを判定するもので、lexical_helper.js が必要なインポートを追加した上でエクスポートしています。
export function $isShadowRoot(node) {
return $isElementNode(node) && $isRootOrShadowRoot(node) && !$isRootNode(node)
}
この移動により、contents.js のインポート行から $isElementNode・$isRootNode・$getChildCaretAtIndex・$isNodeSelection・$ensureForwardRangeSelection・$getNearestNodeOfType・CodeNode・QuoteNode が削除され、import宣言が大幅にスリム化されています。
設計判断
src/editor/contents/ ディレクトリ配下への配置 という分離先の選択が、このPRの設計意図を端的に示しています。新設された src/editor/contents/node_inserter.js というパスは、Contents クラスに関連するサブモジュールを contents/ ディレクトリ配下にまとめるという設計意図を示唆しています。
$isShadowRoot の移動先として lexical_helper.js が選ばれた点も注目に値します。この関数は NodeInserter からも参照される汎用ユーティリティであり、特定のクラスに紐づけず共有ヘルパーとして配置することで、両モジュールが同じ実装を参照できるようになっています。
まとめ
本PRはロジックの変更を一切伴わず、純粋なコード整理として NodeInserter を適切な場所へ移動させた変更です。contents.js の行数を116行削減し、各ファイルの責務を明確にすることで、今後の機能追加や修正時の見通しが向上します。