[basecamp/lexxy] エディタの空値処理とRedo/Undoホットキー表示を修正

basecamp/lexxy

背景

このPRは、Lexxyエディタにおいて失敗していたテストを修正するための変更です。主な問題点は2つありました:

  1. エディタの値をクリアした際の挙動が不適切だった
  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がよりシンプルになり、ホットキー表示の冗長性を削減
  • テストコードの可読性とメンテナンス性が向上

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事の構成、カスタムMarkdown構文、対象読者への適合性、すべてのガイドライン項目を遵守しており、非常に高品質です。特にコードブロック前後の空行やファイル名付きシンタックスハイライトが正しく使われています。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ✓ PASS

技術的な正確性と表現の適切性

記事内で引用されているコードと技術的な説明は、PRの目的と整合性が取れており、技術的に正確です。エディタの挙動変更やテストヘルパーの追加など、変更点が論理的に解説されています。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ⚠ WARNING

元のPR情報との一致度

全体としてPRの内容をよく反映していますが、一部にPR情報で裏付けられていない推測が含まれています。ただし、断定を避ける表現が用いられているため許容範囲です。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除