https://github.com/basecamp/lexxy
TrixエディタのHTMLをLexxyへインポートする際、テキストを含む `<div>` が誤ってイメージギャラリーに変換されるバグを修正。`ImageGalleryNode` のギャラリー判定を「全子要素がアタッチメントである場合のみ」に厳格化し、アタッチメントのアンラップ処理を `editor.js` から `AttachmentsExtension` へ移動することで責務の分離を実現した。
メールHTMLに頻出する `<div>` 要素間の改行文字が Lexical error #282 を引き起こすクラッシュを修正。HTMLインポートパイプラインにホワイトスペース専用テキストノードを除去するフィルタを追加し、`<p>` と `<div>` の処理を一貫させました。
DOMPurifyの許可タグリストから `<u>` が抜けていたため、エディタでアンダーライン書式を適用しても値の取得時にサニタイザーが除去してしまうバグが修正されました。`src/config/dom_purify.js` に `"u"` を追加する1行の修正で、キーボードショートカットや `setValue/value` の往復変換でアンダーライン書式が正しく保持されるようになります。
インラインコードブロックの末尾で右矢印キーを押しても脱出できないバグを修正。`nodeAfterCursor`が親要素の次の兄弟まで参照していたため後続段落の存在を誤検出していた原因を、`anchorNode.getNextSibling()`への1行の置き換えで解消した。
PR #861でビルド済みJSアセットをgit管理から除外した後、`gem "lexxy", git: "..."` 形式のインストールでアセットが存在しない問題を解決。Bundlerのgem拡張機構(`spec.extensions`)を使い、`bundle install`時に`yarn install`と`yarn build`を自動実行するRakefileを`ext/Rakefile`として追加した。アセットが既に存在する場合はno-opとなるため、公開済みgemのインストールには影響しない。
JavaScriptのビルド成果物(`lexxy.js`等)をGit管理から除外し、CI・gem build・`bin/setup`それぞれのフローに`yarn build`を組み込むことで、PRごとのマージコンフリクトを解消しました。`Rakefile`では`Rake::Task["build"].enhance`を使って既存タスクを侵襲せずにビルドステップを注入する低侵襲なアプローチが採用されています。
`display: inline-flex` が生み出すアトミックインラインボックスと、`importDOM` が注入するスペース文字が組み合わさり、@メンション直後のカンマが次の行に折り返される問題を修正。CSSを `display: inline` に変更してアトミックインラインボックスを解消し、トレーリングスペースをWord Joiner(U+2060)に置き換えてソフトラップ機会を抑制。削除ボタンは選択時のみ表示する方式に変更された。
@メンション直後に余分なスペースが入る問題を、通常スペース(U+0020)からゼロ幅のWORD JOINER(U+2060)への置き換えで解消しました。直接入力パスと importDOM パスの両経路を修正し、`@Zach's` のような所有格表現でもメンションと後続テキストが隙間なく表示されるようになります。
Lexicalの `CodeHighlightNode` は `canHaveFormat() → false` を返し通常の書式設定APIが機能しないため、プレーンテキストのコードブロック内ではハイライトが適用できませんでした。本PRは選択範囲がコードブロック内かを判定して処理を分岐させ、書き込み可能なノードの `__style`・`__format` を直接パッチするとともに、`skipTransforms` + `discrete` オプションでシンタックスハイライトトランスフォームによるスタイル上書きを防ぐことでこの制約を回避しています。
OSからファイルをドラッグ&ドロップでイメージギャラリーに挿入する際、ドラッグ中のブラウザの `selectionchange` イベントがLexicalの内部選択状態を上書きし、画像が誤った位置に挿入されるバグを修正。`dragenter` 時に選択状態をスナップショットとして保存し、`drop` 時に復元することで、常に元のカーソル位置への挿入を保証します。
`<lexxy-table-tools>` のテーブルコントロールが初回挿入時に誤った位置で一瞬表示されるチラつきを修正しました。`#show()` メソッドで `display: flex` を設定する前に位置計算(`#updateButtonsPosition()`)を実行するよう順序を変更し、同時に `#update()` を責務ごとの4つのメソッドに分解することで、表示タイミングの制御を明確化しています。
Lexicalエディタのテーブルセルにクリックなしで連続して画像をアップロードすると2枚目以降が消失するバグを修正。アップロード後のselectEnd()がTableCellNode(シャドウルート)上にセレクションを着地させてinsertNodes()が失敗していた問題に対し、insertAtCursorでシャドウルート上のセレクションを検出して空のパラグラフを挿入・セレクション正規化することで解決しています。
`CustomActionTextAttachmentNode`の`getTextContent()`がメンション名のフルテキストを返すことでLexicalがカーソル位置を誤って複数割り当てていた問題を修正。ゼロ幅文字(U+FEFF)を返すよう変更してアトミックなカーソル位置を実現し、Shift+矢印キーによる範囲選択はブラウザネイティブに委譲することでメンションの選択・削除時のカーソルジャンプを解消した。
改行を含むプレーンテキストをペーストすると `<br>` タグが生成される問題を修正。`marked()` に渡す前に単一改行を二重改行へ正規化することで、Lexical ネイティブの動作と一致した段落区切り挿入を実現しました。あわせて Selection クラスのノード間移動にガード節が追加され、カーソルがノード境界にない場合の意図しない遷移も防止されています。
Lexxエディタにおいて、ソフト改行(<br>)を含む段落でカーソルが下矢印キーを押したとき、次のテキスト行をスキップして添付ファイルが誤って選択されてしまうバグを修正しました。`topLevelNodeAfterCursor` と `topLevelNodeBeforeCursor` にオフセットガードを追加し、カーソルがテキストノードの実際の境界にいるときだけ添付ファイルへのナビゲーションをインターセプトするように改善されています。
Lexicalエディタのアップロードライフサイクルメソッド(進捗・完了・エラー)が非同期完了する際、エディタ外にフォーカスがあるとDOM選択が強制的にエディタに戻ってしまう問題を修正。`SKIP_DOM_SELECTION_TAG` をエディタのフォーカス状態に応じて条件付きで付与する `#backgroundUpdateTags` ゲッターを新設し、フォーカス奪取を防ぎつつ、エディタにフォーカスがある場合の正常な選択転送挙動を維持しています。
@mentionプロンプトが開いている状態でカンマキーを押すと、フォーカス中のオプションが選択されるようになりました。event.preventDefault()でブラウザのデフォルト入力を抑止した後、Lexical APIを通じてカンマをエディタに挿入することで、メンション確定とカンマ保持を両立しています。
Lexicalエディタのカスタムカーソル移動ロジックを修正し、イタリックと通常テキストのようなフォーマット境界で矢印キーを押した際に添付ファイルに予期せずジャンプする問題を解消しました。隣接ノードがDecoratorNodeでない場合に`null`を返してLexicalのデフォルト動作に委譲することで対処しており、`instanceof DecoratorNode`から`$isDecoratorNode()`への変更とnullガードの追加も含まれます。
レンダリング済みビューからコピーしたHTMLをペーストする際、`<a href="#">` 等のプレースホルダーアンカーがリンクノードとして取り込まれる問題を修正。Lexicalの変換処理に入力するDOM自体を前処理する `#unwrapPlaceholderAnchors` メソッドを追加し、`href` が空または `"#"` のアンカーのみを子ノードで置き換えることで、@メンションはプレーンテキストとして、実URLを持つリンクはリンクノードとして正確に保持されるようになりました。
`WrappedTableNode`が`canInsertTextBefore()`/`canInsertTextAfter()`を`true`のまま継承していたため、`ProvisionalParagraphExtension`がテーブル周囲に隠しクリックターゲットを挿入しない問題がありました。両メソッドを`false`でオーバーライドすることで、テーブル下部のクリックが正しくテーブル外にカーソルを配置するよう修正されました。