マルチ行テキスト貼り付け時のバックスラッシュが失われる問題を修正
Lexxy で Windows/UNC パスを複数行にまたがって貼り付けると先頭のバックスラッシュが消失していた問題を、プレーンテキスト判定を拡張し、改行も含めてそのまま挿入するように修正した。
背景
Lexxy のプレーンテキスト貼り付け処理は Markdown 変換経路を通すため、空白の縮小やバックスラッシュのアンエスケープが起き、特に Windows/UNC パス \\server\share が \server\share に変形していた。この現象は、パスがコピー元で改行で折り返され、貼り付け時に <br> タグを含む単一段落としてレンダリングされたときに発生した。シングルラインの貼り付けは正しく処理されていたが、マルチラインの場合は Markdown 構造と判定され、従来の「テキストのみ」チェックを通過できなかった。したがって、Markdown 構造が存在しなくても改行付きテキストを正しく扱う判定ロジックが必要だった。
技術的な変更
src/editor/clipboard.js の判定メソッド #isPlainTextWithoutMarkdown が拡張され、子ノードに BR 要素が含まれていてもプレーンテキストとみなすようになった。
- && Array.from(paragraph.childNodes).every((node) => node.nodeType === Node.TEXT_NODE)
+ && Array.from(paragraph.childNodes).every((node) => node.nodeType === Node.TEXT_NODE || node.nodeName === "BR")
この条件緩和により、改行 (<br>) を含む段落でも true を返し、以降の貼り付けロジックで原文をそのまま挿入できる。src/editor/contents.js の insertText も改行文字で分割し、行ごとに LineBreakNode と TextNode を生成して挿入するように実装が変更された:
- const paragraph = $createParagraphNode().append($createTextNode(text))
+ const paragraph = $createParagraphNode()
+ text.split("\n").forEach((line, index) => {
+ if (index > 0) paragraph.append($createLineBreakNode())
+ paragraph.append($createTextNode(line))
+ })
これにより、マルチ行の UNC パスが \\server\share の形で保持され、Markdown 変換による破損が防止された。
設計判断
プレーンテキスト判定を「テキストノードのみ」から「テキストノード+改行ノード」へ拡張する選択は、Markdown 構造の有無を判定する既存ロジックを最小限の変更で対応したものだ。このアプローチは、既存のリッチテキスト処理や真正な Markdown 入力を影響させず、純粋なテキスト貼り付けのみを対象にすることで後方互換性を保っている。代替案としては新たなフラグや別メソッドを導入する案も考えられたが、コードパスの増大とテスト負荷が懸念されたため採用されなかった。結果として、Lexxy の貼り付け処理は「テキストかつ改行を含む」ケースでも安全に動作し、ユーザーが期待するファイルパス表現を忠実に保持できるようになった。
まとめ
マルチ行にまたがるプレーンテキスト貼り付けで失われていた先頭バックスラッシュを、#isPlainTextWithoutMarkdown の判定拡張と insertText の改行対応により復元した。本修正は最小限のロジック変更で既存機能との互換性を保ちつつ、UNC パスなど重要な文字列の正確性を向上させ、エディタの信頼性を高めた。