[basecamp/lexxy] エディタの空値処理とRedo/Undoホットキー表示を修正
背景
このPRは、Lexxyエディタにおいて失敗していたテストを修正するための変更です。主な問題点は2つありました:
- エディタの値をクリアした際の挙動が不適切だった
- Undo/Redoボタンのホットキー表示が不要だった
主な変更内容
1. エディタの空値処理の改善
エディタの値をクリアした際、完全に空の状態ではなく、空の段落要素(<p><br></p>)を保持するように動作を変更しました。
テストの修正:
test "Clearing value of editor keeps an empty paragraph" do
visit edit_post_path(posts(:hello_world))
find_editor.value = ""
assert_editor_html_value "<p><br></p>"
end
以前は空文字列を期待していましたが、これを空の段落要素を含む状態に変更しています。これにより、エディタが常に有効なHTML構造を維持できるようになります。
2. ルートノード処理ロジックの削除
JavaScriptコード内で、選択範囲がルートノード($isRootNode)の場合に特別な処理を行っていた箇所を削除しました。
変更前:
if (as(selection.anchor.getNode())) {
selection.insertNodes([ newNodeFn() ]);
return
}
const topLevelElement = selection.anchor.getNode().getTopLevelElementOrThrow();
変更後:
const topLevelElement = selection.anchor.getNode().getTopLevelElementOrThrow();
この変更により、ルートノードでの特殊な挿入処理を削除し、常にgetTopLevelElementOrThrow()を通じて処理を統一しています。この修正は3箇所で適用されています。
3. Undo/Redoボタンからホットキー表示を削除
ツールバーのUndo/Redoボタンからdata-hotkey属性を削除しました。
変更内容:
<button class="lexxy-editor__toolbar-button" type="button" name="undo" data-command="undo" title="Undo">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">...</svg>
</button>
<button class="lexxy-editor__toolbar-button" type="button" name="redo" data-command="redo" title="Redo">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">...</svg>
</button>
以前はdata-hotkey="cmd+z ctrl+z"やdata-hotkey="cmd+shift+z ctrl+shift+z ctrl+y"が含まれていましたが、これらを削除しています。ホットキー自体の機能は維持されているため、UIでの表示のみを削除したと考えられます。
4. テストヘルパーの追加
HTML値の検証を簡潔に行うための新しいテストヘルパーassert_editor_html_valueを追加しました。
def assert_editor_html_value(expected)
wait_until { normalize_html(find_editor.value) == normalize_html(expected) }
rescue Timeout::Error
assert_equal normalize_html(expected), normalize_html(find_editor.value)
end
また、HTML正規化ロジックをnormalize_htmlメソッドとして抽出し、再利用可能にしました。
def normalize_html(html)
Nokogiri::HTML.fragment(html).to_html.strip
end
技術的影響
これらの変更により:
- エディタが常に有効なHTML構造を維持し、空の状態でも適切なDOM要素を保持
- ルートノードでの特殊処理を削除することで、コードの一貫性が向上
- UIがよりシンプルになり、ホットキー表示の冗長性を削減
- テストコードの可読性とメンテナンス性が向上